在matlab中aeq和beq,数学建模(matlab)学习笔记--线性规划

1.1线性规划

格式(原):

jqaUJz.png

其中,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分别对应决策向量的下界向量和上界向量。

例如,线性规划

NzU7Fz.png

的matlab标准型为

RjUJRz.png在matlab中linprog所求的为最小值,所以如果所给的函数为最大值函数则需要加负号来改变最值,若为最小值则可直接带入。

注意不等式的符号是≤号,化成矩阵时,不等式符号要统一

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

eU7jym.png

将绝对值拆成ui=(xi+|xi|)/2,vi=(xi-|xi|)/2,

就可以将式子化为

yuiANf.png

进一步写成:

nEvMjy.png

注意数组之间行列数的对应

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

题:

VJRBvm.png

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;

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

比如上面的绝对值那个题

Iby2ye.png

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);

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

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

MRzY7j.png

现有四类货物用该货机进行装运,货物的规格以及装运后获得的利润如下

aYN3iu.png

省略一些废话,大概是货物可以随便放

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(: )注意这里没有空格,他自己生成了一个表情所以我只能加空格将这个打出来!

vIJn2u.png

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

a1=zeros(4,12);

for i=1:4

a1(i,i:4:12)=1;

end

这里给a1赋值,

JfIFbe.png

这样正好可以对应三个不同的舱(共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写的,结果往这上面传的腾的时候发现有些不一样,所以就拼拼凑凑出来这一篇文章,主要还是想把程序和个人理解分开吧,因为我还是刚入门所以写的可能不是那么专业,请见谅!

  • 10
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值