您的位置:首页 > 编程语言 > MATLAB

数学建模(matlab)学习笔记--线性规划

2020-07-18 05:31 309 查看

1.1线性规划

格式(原):

其中,f,x,b,beq,lb,ub为列向量,f被称为价值向量,b称为资源向量;A,Aeq为矩阵
matlab中对应求解的命令为

[x,fval]=linprog(f,A,b)
[x,fval]=linprog(f,A,b,Aeq,beq) [x,fval]=linprog(f,A,b,Aeq,beq,lb,ub)

x为决策向量的取值,fval返回目标函数的最优值,f为价值向量,A和b对应线性不等式约束;Aeq和beq对应线性等式约束;lb和ub分别对应决策向量的下界向量和上界向量。
例如,线性规划
的matlab标准型为 在matlab中linprog所求的为最小值,所以如果所给的函数为最大值函数则需要加负号来改变最值,若为最小值则可直接带入。
注意不等式的符号是≤号,化成矩阵时,不等式符号要统一

1.1-2可以转化为线性规划的问题


将绝对值拆成ui=(xi+|xi|)/2,vi=(xi-|xi|)/2,
就可以将式子化为
进一步写成:
注意数组之间行列数的对应

若极值套极值(min(max…)),则可以将括号里面的极值换元,再利用其特性(如max大于所有的数值)来进行线性规划。
题:

c=[3,-1,-1]’;

首先,我在看书的时候发现并不是所有的程序都将这里化成了列向量,我发现如下几点注意点:
1.c和b必须同为行向量或列向量
2.当c需要变成列向量的时候,往往是函数中的未知数对应的是多组的时候,如拆绝对值的题型中,就是将c=[c, c]’,这个下面会有个例子。

a=[1 -2 1;4 -1 -2];b=[1 1 -3];

给a和b赋值

Aeq=[2 0 1];beq=1;

这里也是直接赋值,只要把没用的用零表示就可以了

[x,y]=linprog(-c,a,b,aeq,beq,zeros(3,1));

这里首先注意matlab型的转换,最好先换好再写程序,因为我这里是分析程所以有一点乱,对于价值向量的化简,首先matlab中linprog所求的是最小值,如果题目想要求的是最大值,则需要加上负号来改变。
对于不等式的化简,只要化到统一的小于号即可
Aeq和beq如果没有但是在最后有lb或者ub的限制条件时,要用空矩阵代替
Zeros(3,1)则是代表x1,x2,x3三个元素大于0

Y=-y;

这种很好做,一眼能看出来,但是有的题给你的并不是可以直接线性规划的题。

比如上面的绝对值那个题

c=[1;4];c=[c,c]’

还是首先给c赋值,然后因为要拆成俩组未知数,之所以将c赋成俩个列向c组成的列向量,是因为矩阵的乘法是这么算的。

a=[1 -1 -1 1; 1 -1 1 -3; 1 -1 -2 3];a=[a,-a];

这里,将a也做了和c类似的变换,理由也类似,因为未知数拆成了俩组

b=[-2 -1 -1/2];

不管前面的式子怎么变,结果是不会变的,所以b不用写成b=[b b],但是为了对应前面的c为列向量,b也要转置成列向量。

[y,z]=linprog(c,a,b,[],[],zeros(8,1));

因为没有等式约束,用空矩阵代替

x=y[1:4]-y(5:end);

因为前面进行了拆项,所以要在这里进行还原

第三题: 一架货机有三个机舱:前舱,中舱和后舱。三个货舱所能装在的货物的最大重量和体积限制如下表,并且为了飞机的平衡,三个货舱装载的货物重量必须与其中最大的容许量成比例。


现有四类货物用该货机进行装运,货物的规格以及装运后获得的利润如下
省略一些废话,大概是货物可以随便放
i表示1234四种货物,j表示123三个货舱,xij表示第i种货物转载第j个舱内的重量,wj,vj分别表示第j个舱的重量限制和体积限制,ai,bi,ci分别表示可以运输的第i种货物的重量,单位重量所占的空空间和单位货物的利润。
目标函数:z=c1Σ(1到3)x1j+c2Σ(1到3)x2j+c3Σ(1到3)x3j+c4Σ(1到3)x4j
约束条件:Σ(j=1到3)xij≤ai,i=1,2,3,4.(四种货物的重量约束)
Σ(i=1到4)xij≤wj,j=1,2,3.(三个货舱的重量限制)
Σ(i=1到4)xij≤vj,j=1,2,3.(三个货舱的体积限制)
Σ(i=1到4)bixij≤vj,j=1,2,3.(三个货舱的体积限制)
Σ(i=1到4)xi1/10=Σ(i=1到4)xi2/16=Σ(i=1到4)xi3/8(平衡限制)
可以根据以上建立线性规划,因为格式并无很明显的变动我就不打了,直接分析程序。

c=[3100;3800;3500;2850]; c=c*ones[1,3]; c=c(: )注意这里没有空格,他自己生成了一个表情所以我只能加空格将这个打出来!


在这里c是一个由三个c的转置连接着的列向量,因为有三个货舱,所以要写成这个形式

a1=zeros(4,12);
for i=1:4
a1(i,i:4:12)=1;
end

这里给a1赋值,

这样正好可以对应三个不同的舱(共12列)中每种货物的对应情况

b1=[18;15;23;12];
a2=zeros(3,12);
for i=1:3
A2(i,4i-3:4i)=1

还是和前面的是同一个道理,这是第二个限制条件了。

b2=[10 16 8]’;
bb=[480;650;580;390];
a3=zeros(3,12);
For j=1:3
a3(j,4j-3:4j)=bb
End;

这里是第三个限制条件了,前三个是不等式,还剩最后一个条件。

B3=[6800 8700 5300]’
A=[a1;a2;a3];
b=[b1;b2;b3];
Aeq=zeros(2,12);
Aeq(1,1:4)=1/10;
Aeq(1,5:8)=-1/16;
Aeq(2,5:8)=1/16;
Aeq(2,9:12)=-1/8;
Beq=zeros(2,1);
[x,y]=linprog(-c,a,b,aeq,beq,zeros(12,1));
X=reshape(x,[4,3]😉
X=sum(x’),y=-y

写的过程中,我发现这道题并没有我看的时候所认为的这么难,甚至感觉很好理解,所以我的话越写越少,因为觉得我所感悟到的东西越来越显得不必要,但是如果光给个程序看的话,一开始还是很难接受吧。

所以我觉得这种东西并不是难以理解,只是没有充足的去理解和学习他,其实一开始我是不想写这个的,因为我觉得这个首先已经超出了我的能力范围,第二这个也不是光看别人的理解就可以掌握的东西,但是既然已经做出了承诺我就要实现他,所以我打算把这个系列拆开来一点点写,直到这个比赛结束或者我放弃了这个比赛,但是我这个只是作为一个帮助大家理解的笔记,并不能代替个人的学习,最后祝大家学业有成事业进步吧!
还有,我写这个一开始使用wps写的,结果往这上面传的腾的时候发现有些不一样,所以就拼拼凑凑出来这一篇文章,主要还是想把程序和个人理解分开吧,因为我还是刚入门所以写的可能不是那么专业,请见谅!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: