1)分清哪些是列向量,哪些是行向量;
2)如“-2x1+x3”中的x2系数为0,但是不能忽略;
3)MATLAB默认求最小值,那么需要分清哪些需要加负号;
4)求最大值等于加负号后求最小值。
代码:
clear;clcc=[-3,1,1];a=[1,-2,1;4,-1,-2];b=[11,-3]';aeq=[-2,0,1];beq=1;lb=zeros(3,1);[x,fval]=linprog(c,a,b,aeq,beq,zeros(3,1))z=-fval
答案:x1=4,x2=1,x3=9,z=2
这种看似非线性的问题可以转化成线性的问题进行求解:
clear;clcc=[1,2,3,4];aeq=[1,-1,-1,1;1,-1,1,-3;1,-1,-2,3];beq=[0,1,-0.5]';prob=optimproblem;u=optimvar('u',4,'LowerBound',0);v=optimvar('v',4,'LowerBound',0);prob.Objective=sum(c*(u+v));prob.Constraints.con=aeq*(u-v)==beq;[sol,fval]=solve(prob)x=sol.u-sol.v
答案:x1=0.25x2=x3=0x4=-0.25z=1.25
这里补充一些MATLAB的基础知识:
1、prob=optimproblem创建优化问题
2、
u=optimvar('u',4,'LowerBound',0);v=optimvar('v',4,'LowerBound',0);
创建优化变量其中参数意义如下:
‘u’:创建一个名为u的标量优化变量
‘4’:创建一个名为u的4×1优化变量向量,而且是列向量
'LowerBound':是指下界,因为u和v都是大于等于0的,详解看上面的图(UpperBound是上界)
后面接一个标量代表下界(上界为多少)
3、最后用solve函数进行求解,原书里面给的是输出四个参数,但是我这里为了简化,只输出两个参数:sol代表一个类(可能这样解释有误,但我是这么理解的),因为x=u-v,|x|=u+v,所以最后计算出答案,fval就是最优解。
1、目标函数正号的那一部分,是产品的利润和数量的乘积,利润是单价减去原料费。数量应该怎么表示很简单,举个例子:对于产品I必须要经过A1、A2、B1、B2、B3的过程,那么x1+x2就是数量,当然我这里都统一最后的工序的数量。并且有:x1+x2=x3+x4+x5和x6+x7=x8;
clear;clcc=[0.25,0.2247,-0.625,-0.5524,-0.65,0.5,0.2889,-1.15,-0.6839];a=zeros(5,9);a(1,1)=5;a(1,6)=10;a(2,2)=7;a(2,7)=9;a(2,9)=12;a(3,3)=6;a(3,8)=8;a(4,4)=4;a(4,9)=11;a(5,5)=7;b=[6000,10000,4000,7000,4000]';aeq=[1,1,-1,-1,-1,0,0,0,0;0,0,0,0,0,1,1,-1,0];beq=[0;0];lb=zeros(9,1);[x,fval]=linprog(c,a,b,aeq,beq,lb)fval=-fval
答案:x1=1200x2=230x3=0x4=859x5=571x6=0x7=500x8=500x9=324z=1146.4142
1)每种货物可以分布在一个或多个货舱内以及不同的货物可以放在一个货舱内这里就说明了要使用双变量进行求解,即用i=1,2,3,4分别表示货物1货物2货物3和货物4;j=1,2,3分别表示前船中舱和后舱。那么有设xij(i=1,2,3,4;j=1,2,3)表示第i种货物装在第j个货舱内的质量;
2)接着我们需要表示题目给出的量:
wj和vj分别表示第j个货舱的重量限制和体积限制;j=1,2,3
ai,bi,ci分别表示货物规格中的重量、单位质量的空间和利润;i=1,2,3,4
3)这里有一个很细节的点:“三个货舱所能装载的货物的重量必须与其最大的容许量成比例”
这里我们可以这样理解:以货物为研究对象,而不是货舱,因为货物可以放在不同的货舱内。举个例子:c1就是货物一的单价,乘上货物一在三个舱里的质量总和。
接着我们需要考虑如下约束对象:
1)所放货物总质量不能超过货舱质量限制;(货舱为研究对象)
2)所放货物的空间不能超过货舱的体积限制;(货舱为研究对象)
3)所放货物的总质量不能超过现有货物的总质量;(货物为研究对象)
4)三个货舱所能装载的货物的重量必须与其最大的容许量成比例;(货舱为研究对象)
5)货物质量一定为非负数。
clear;clca=[18,15,23,12]';%货物质量b=[4800,650,580,390];%单位质量的空间c=[3100,3800,3500,2850];%利润w=[10,16,8];%质量限制v=[6800,8700,5300]';%体积限制prob=optimproblem('ObjectiveSense','max');%创建优化问题x=optimvar('x',4,3,'LowerBound',0);%创建4X3的优化问题prob.Objective=c*sum(x,2);%目标函数xi1到xi3是对行求和%这样计算的是1X4的行向量c乘上对x行求和后的4X1的列向量得出一个数:利润con1=sum(x,1)<=w;con2=(b*x)'<=v;%1X4*4X3=1X3对矩阵乘法的基础有要求哇con3=sum(x,2)<=a;con4=[sum(x(:,1))/10==sum(x(:,2))/16;sum(x(:,2))/16==sum(x(:,3))/8];prob.Constraints.con1=con1;prob.Constraints.con2=con2;prob.Constraints.con3=con3;prob.Constraints.con4=con4;[sol,fval]=solve(prob)%fval121515元sum(sol.x,2)%第i行代表货物i,第j列代表货舱j,计算货物i的总质量需要把分散在各个货舱的质量都求和
答案:四种货物的质量(吨)分别为:01515.94743.0526总利润(元):1.2152+e5