线性规划与整数规划例题讲解

文章展示了如何使用MATLAB的linprog函数解决一系列线性规划问题,包括标准形式的转化、引入新变量消除绝对值、处理利润最大化问题、货物分配优化以及时间调度优化等。每个问题都详细阐述了解题思路并提供了相应的MATLAB代码实现。
摘要由CSDN通过智能技术生成

一.

思路:将其转换为标准形式 代入求解器中求解即可。

clc;
clear;
f=[-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(f,A,b,Aeq,beq,lb);
x;
fval;

二 .

 思路:我们要消去绝对值的影响,需要引入全新的变量,u,v其中x=u+v;|x|=u-v;经过我们的特殊处理,将其整理为标准形式。带入求解器中求解即可。我们将x拆解了。

 

clc;
clear;
f=1:4;
f=[f,f]';
Aeq=[1,-1,-1,1;1,-1,1,-3;1,-1,-2,3];
Aeq=[Aeq,-Aeq];
beq=[0;1;-1/2];
lb=zeros(8,1);
[x,fval]=linprog(f,[],[],Aeq,beq,lb);
h=x(1:4)-x(5:end);

三. 

思路: 这个题要先明确我们要求什么,使得利润最大。其中的决策变量是什么,资源向量是什么,很明显,我们Ai设备对应的生产的产品I~III是我们的决策变量,资源变量也是我们表格中对应的纯利润乘以我们加工完成的产品然后在减去我们的平均每小时所消耗的费用,即满负荷时设备费用除于设备有效台时。最后我们约束条件是,在A机器生产的数量对应B机器上生产的数量。还有每台机器的有效台时。

 

clc;
clear;
f=[1-((3/60)*5),1-((321/10000)*7),-6*250/4000,-4*783/7000,-7*200/4000,1.65-((250/4000)*8)-((300/6000)*10),1.65-((321/10000)*9)-250/4000*8,2.3-((321/10000)*12)-11*783/7000];
f=-f;
A=zeros(5,8);%%不等式
A(1,1)=5;A(1,6)=10;%%x1+x6<=6000
A(2,2)=7;A(2,7)=9;A(2,8)=12;
A(3,3)=6;A(3,6)=8;A(3,7)=8;
A(4,4)=4;A(4,8)=11;
A(5,5)=7;
b=[6000;10000;4000;7000;4000];
Aeq=[1,1,1,-1,-1,0,0,0];
beq=[0];
lb=zeros(8,1);
[x,fval]=linprog(f,A,b,Aeq,beq,lb);

四 .

思路 :每种货物可以无限细分,说明我们的答案可以是存在小数,然后以前,中,后仓放货物1~4,各放多少为决策变量。然后我们根据每个货物的重量和体积与每个仓的重量和体积限制以此为约束条件。然后关键的一个约束条件,每个货仓的货物重量必须与其最大的容许量成比例。

 

clc;
clear;
f=[3100,3800,3500,2850,3100,3800,3500,2850,3100,3800,3500,2850];
f=-f';%%标准形式
A=[18,15,23,12,0,0,0,0,0,0,0,0;...
    0,0,0,0,18,15,23,12,0,0,0,0;...
   0,0,0,0,0,0,0,0,18,15,23,12;...
   480,650,580,390,0,0,0,0,0,0,0,0;...
   0,0,0,0,480,650,580,390,0,0,0,0;...
   0,0,0,0,0,0,0,0,480,650,580,390;];
b=[10;16;8;6800;8700;5300];
Aeq=[87,87,87,87,-68,-68,-68,-68,0,0,0,0;...
    53,53,53,53,0,0,0,0,-68,-68,-68,-68;...
    0,0,0,0,53,53,53,53,-87,-87,-87,-87;...
    ];
beq=[0;0;0];
lb=zeros(12,1);
[x,fval]=linprog(f,A,b,Aeq,beq,lb,[]);
val=-fval;

五. 

思路: 对于此类问题,我们要将非线性部分转化为线性具体方法就是引入新的变量。我们将x1*x2改为一个新的变量u.此时我们发现u的变化,是随着x1与x2而变化的而x1和x2只能取0或1,所以我们的新约束条件是一个不等式,然后我们先规定u取值0或1所以我们的u应该>=x1+x2-1;因为,我们如果x1与x2全为0时,u取值肯定是0,x1与x2当中一个为0时,u还是0,所以此时该不等式满足条件。而最大限制是u小于x1和x2.

clc;%%普通线性规划我们基本用的求解器,这里我们用基于问题求解的方法,这种方法对于多维变量的题较方便。
clear;
prob=optimproblem("ObjectiveSense","max");
x=optimvar('x',3,'Type','integer','LowerBound',0,'UpperBound',1);
y=optimvar('y',1,'Type','integer','LowerBound',0,'UpperBound',1);
prob.Objective=x(1)+y(1)-x(3);
con1=[-2*x(1)+3*x(2)+x(3)<=3];
con2=[x(1)+x(2)-1<=y(1);y<=x(2);y<=x(1)];
prob.Constraints.con1=con1;
prob.Constraints.con2=con2;
[sol,fval,flag,out]=solve(prob);

 六.

 思路:这题较简单xi表示第几个校址要建。并且我们的约束条件就是覆盖所有居民小区。要求x1+~x6的值最小即最小校址数。

 

clc;
clear;
prob=optimproblem("ObjectiveSense","min");
x=optimvar('x',6,'Type','integer','LowerBound',0,'UpperBound',1);
prob.Objective=sum(x);
con1=[1<=x(1)+x(2)+x(3);1<=x(2)+x(4);1<=x(3)+x(5);1<=x(4)+x(6);1<=x(5)+x(6);1<=x(1);1<=x(2)+x(4)+x(6);];
prob.Constraints.con1=con1;
[sol,fval,flag,out]=solve(prob);

七. 

 思路:我们要将六台设备分给四个公司使得利润最大。所以就是表中的所有就是资源向量。然后就是每个企业至少得到一台设备,并且每个设备都得给出去,这两个为约束条件。

clc;
clear;
prob=optimproblem("ObjectiveSense","max");
y=optimvar('y',6,4,'Type','integer','LowerBound',0,'UpperBound',1);
f=[4,2,3,4;6,4,5,5;7,6,7,6;7,8,8,6;7,9,8,6;7,10,8,6;];
k=f.*y;
jk=0;
prob.Objective=sum(k,"all");
con1=[sum(y,2)==1;];
prob.Constraints.con1=con1;
prob.Constraints.con2=1<=sum(y)';
[sol,fval,flag,out]=solve(prob);
xx=sol.y;

 

八.

 

思路:这个就简单的直接代到求解器中求即可。 

clc;
clear;
prob=optimproblem("ObjectiveSense",'min');
x=optimvar('x',5,'Type','integer','LowerBound',0);
f=[20,90,80,70,30];
prob.Objective=f*x;
con1=[x(1)+x(2)+x(5)>=30];
con2=[x(3)+x(4)>=30];
con3=[3*x(1)+2*x(3)<=120];
con4=[3*x(2)+2*x(4)+x(5)<=48];
prob.Constraints.con1=con1;
prob.Constraints.con2=con2;
prob.Constraints.con3=con3;
prob.Constraints.con4=con4;
[sol,fval,flag,out]=solve(prob);

九. 

思路:这个题是这里面所有最难的一个题。 这里我们要明确,每个同学的面试顺序,还要明确每个同学每个阶段的开始面试时间,还有就是每个同学每个阶段的面试结束时间。

 

 

clc;
clear;
t=[14,16,21;19,17,10;10,15,12;9,12,13];
x=optimvar('x',4,3,'LowerBound',0);
y=optimvar('y',4,4,'Type','integer','LowerBound',0,'UpperBound',1);
T=optimvar('T',1,'LowerBound',0);
prob=optimproblem("ObjectiveSense",'min');
prob.Objective=T;
prob.Constraints.con1=[x(:,3)+t(:,3)<=T];
con2=[];
con3=[];
con4=[];
for i=1:4
    for j=1:2
        con2=[con2;x(i,j)+t(i,j)<=x(i,j+1)];
    end
end
prob.Constraints.con2=con2;
for i=1:3
  for j=1:3
      for k=i+1:4
      con3=[con3;x(i,j)+t(i,j)<=x(k,j)+10000*(1-y(i,k));];
      con4=[con4;x(k,j)+t(k,j)<=x(i,j)+10000*y(i,k)];
      end
  end
end
prob.Constraints.con3=con3;
prob.Constraints.con4=con4;
[sol,fval,flag,out]=solve(prob);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

B程洪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值