(最新)线性整数01规划linprog

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、Matlab在线性规划
中的应用
Linear Programing, 又叫线性最优化(Linear Optimization)
1、(1)线性规划首先要有一个
目标函数
(2)要有一组控制变量(或叫决策
变量),且目标函数必须是控制
变量的线性组合(即只能是一
个线性方程).
(3)需要一组约束条件(等式、不等
式约束,特别注意这些变量是
否大于0或变量的可能的取值
范围) (要尽可能挖掘出所有的条件) (4)线性规划的目标是控制变量在满足约束条件下使目标函数
达到最大或最小值。

1、线性规划问题即线性方程求最小值----有一个万能函数fmincon
(当目标函数为多元一次方程时,它的最小值可以用此求,但有个万能的命令的fmincon)---且不能带常数项2、线性规划的函数为linprog
此函数只能
(只能线性方程(每项最多只有一次的多项式),n元-----------
(即n元一次方程)
完全可以用(因
fmincon可以用来求任意方程的最小值)
(任意方程,任意n元----任意条件)
完全可以用代替
(即可以不学linprog)
两个函数都只能求最小值,(条件都只能是<=)
(什么都是“小”)
如要求最大值,两个函数都必须前后两次取反
(1)使用格式为:
x=linprog(f,A,b)
x=linprog(f,A,b,Aeq,beq)
x=linprog(f,A,b,Aeq,beq,l,u)
x=linprog(f,A,b,Aeq,beq,l,u,x0)
(参数个数为:3/5/7/8, 少了X0或让其置于末尾)
不要编程序,用向量f来表示目标方程(同线性代数中的线性方程)
(2)左边还可为:
[x,fval]=……
[x,fval,exitflag]=……
[x,fval,exitflag,output]=……
[x,fval,exitflag,output,lambda]=
其中lambda表示拉格朗日乘子的内容
所以最好是用三个返回结果,最后要根据exitflag判断结果的有效性
(用法与fmincon把函数换成了系数向量(不要编程)(2)x0不要或置于末尾
---因为没有额外编写程序)
(3)x0为初始向量,一般不要使用
f为目标函数的系数向量
A*x<=b 构成了线性不等式条件
Aeq*x=beq 构成了线性等式条件
l<=x<=u 构成了上下限
(4)注意:A:如要求最大值,则必须对
目标函数取反,转化为先求
出最小值,最后再将函数值
取反即为所求的最大值.
B:不等式约束条件是<=,如果
为>=,则必须两边乘以-1,
C:如前面的某些项没有使用,
必须用空矩阵[ ]
d:有3、5、7个等参数
线性方程中不能有常数项,如有,先不要考虑,最后在结果上再加
(或减)去该常数。

最好先clear
都是小(最小值,<=)
它比fmincon方便的地方是不要编程
3、例1:某工厂生产两种产品A和
B. 产品A的利润每台150元,B的
每台利润为200元. 产品A B每台所需加工工时及设备所能提供加
工工时见下表,问如何安排生产才
能使工厂的利润最大.
设A的每月台数为x, B的每月生产台数为y,总利润为p, 则目标函数求最大值
maxmaxP=150x+200 y
约束条件为: 3x+2ymaxP=150x+200 y
约束条件为: 3x+2y<=1500
2x+3y <=1500
x,y>=0
P=150x+200 y
约束条件为: 3x+2ymaxP=150x+200 y
约束条件为: 3x+2y<=1500
2x+3y <=1500
x,y>=0
<=1500
2x+3y <=1500
x,y>=0
a=[3,2;2,3]; b=[1500;1500];l=[0,0];
f=[-150,-200];(或f=[150,200];f=-f;)
linprog(f,a,b,[],[],l)
或[x,fval,exitflag]=linprog(f,a,b,[],[],[0,0],[],[2,3]) 带x0的,不影响结果(注意x0应在取值范围内)
x = 300.0000
300.0000
fval = -1.0500e+005 vpa(fval,10) 所以结果为:105000 exitflag = 1
(也可以u=[inf,inf])
此题用fmincon求解的结果也是一样的。

(带x0一般
..不影响结果,x0不一定要满足条件-------------如exitflag为非正数,则换另一个x0再试一试)
>> f=[150,200];
>> f=-f;
>> a=[3,2;2,3];
>> b=[1500,1500];
>> [x,fval,exitflag]=linprog(f,a,b,[],[],l)
>> [x,fval,exitflag]=linprog(f,a,b,[],[],l,[inf,inf])
4、例2:运输问题P346
设有四个城市A B C D 它的粮食分别由三个产地X Y Z供给.
四个城市的人口和年粮食需求量
三个产粮地运到四个城市的运费
三个产粮地的粮食产量
问题的要求为: 满足每个城市的粮食需要量,并使总运费达到最小
FV AL=803.4 有12个变量,3个不等式条件,4个等式条件, 均大于0
把城市和产行列成表,12个变量,
minP=32xa+32xb+65xc+75xd+52ya+60yb+110yc+70yd+25za+80zb+ 30zc+40zd (有12个变量,每个变量用两个字母取名)以下为各粮食产地的产量:
xa+xb+xc+xd<=2.5
ya+yb+yc+yd<=8.2
za+zb+zc+zd<=7.3
以下为各城市的需要量:
xa+ya+za=4.2
xb+yb+zb=3.3
xc+yc+zc=4.5
xd+yd+zd=5.8
所有变量均>=0
命令形式为:
f=[32;32;65;75;52;60;110;70;25;80;30;40];
>> v=ones(1,4)
v = 1 1 1 1
>> z=zeros(1,4)
z = 0 0 0 0
>> a=[v,z,z;z,v,z;z,z,v] %v,z是为形成不等式矩阵a作准备
a =
1 1 1 1 0 0 0 0 0 0 0 0
0 0 0 0 1 1 1 1 0 0 0 0
0 0 0 0 0 0 0 0 1 1 1 1
>> b=[2.5;8.2;7.3];
>> v1=eye(4) %v1是为形成等式矩阵aeq作准备
v1 =
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
>> aeq=[v1,v1,v1]
aeq =
1 0 0 0 1 0 0 0 1 0 0 0
0 1 0 0 0 1 0 0 0 1 0 0
0 0 1 0 0 0 1 0 0 0 1 0
0 0 0 1 0 0 0 1 0 0 0 1
>> beq=[4.2;3.3;4.5;5.8];
>> lb=zeros(12,1);
>> [x,fval,exitflag]=linprog(f,a,b,aeq,beq,lb)
x =
0.0000
2.5000
0.0000
0.0000
4.2000
0.8000
0.0000
3.0000
0.0000
0.0000
4.5000
2.8000
fval = 803.4000
exitflag = 1
2009-------
>> f=[32,32,65,75,52,60,110,70,25,80,30,40];
>> a=[1,1,1,1,0,0,0,0,0,0,0,0;0,0,0,0,1,1,1,1,0,0,0,0;0,0,0,0,0,0,0,0,1,1,1,1];
>> b=[2.5;8.2;7.3];
>> aeq=[1,0,0,0,1,0,0,0,1,0,0,0;0,1,0,0,0,1,0,0,0,1,0,0;0,0,1,0,0,0,1,0,0,0,1,0;0,0,0,1,0,0,0,1,0,0,0,1];
>> beq=[4.2;3.3;4.5;5.8];
>> [x,fval,exitflag]=linprog(f,a,b,aeq,beq,zeros(1,12))
5、最大利润问题P349 P350另一例题例3:某工厂生产A B C三种产品,产品每台利润分别为600 500 400元,它所用的部件P1-P4和部件的生产能力见下表,求如何安排A B C的生产计划,使产品的计划利润最大
设每月生产A B C各x,y,z件则目标函数为:
maxF=600x+500y+400z 约束条件为:
2x+y+z<=1000
x+2y+z<=800
x+y+2z<=800
x+2y<=750
x,y,z>=0
命令如下:
>> f=[600,500,400]; f=-f;
>> a=[2,1,1;1,2,1;1,1,2;1,2,0];
>> l=[0,0,0];
>> b=[1000;800;800;750];
>> [x,fval,exitflag]=linprog(f,a,b,[],[],l)
Optimization terminated.
x =
350.0000
150.0000
150.0000
fval = -3.4500e+005
exitflag = 1
>> a*x
ans =
1000.0000
800.0000
800.0000
650.0000
>> b-a*x
ans =
0.0000
0.0000
0.0000
100.0000
>> f*x
ans =
-3.4500e+005
结果为:350,150,150;345000
(核对fval=f*x(行) 或f’*x 核对条件是否满足:A*x核对冗余b-a*x)
----此题再用fmincon求解一下-----
6、最小成本问题P354
P351另一例题(:需要多少根钢管,使用料最少) 例4:今有4种素食品,其维生素每公斤含量,人每天维生素需要量和食品价格见下表,求在满足每天所需
维生素的前提下如何使开支最小。

设每天需要甲乙丙丁食品各x,y,z,m minf=1.6x+y+1.8z+3m
1000x+1500y+1750z+3250m>=4000 0.6x+0.27y+0.68z+0.3m>=1.0
17.5x+7.5y+0z+30m>=30
x,y,z,m>=0
>=必须转化成<= (乘以-1)
命令形式为:
>> f=[1.6,1,1.8,3];
>>format long %设置15位数字格式,否则矩阵元素0.27、0.68会进位造成计算误差
>> a=[1000,1500,1750,3250;0.6,0.27,0.68,0.3;17.5,7.5,0,30];a=-a; >> l=[0,0,0,0];
>> b=[4000;1.0;30];b=-b;
>> [x,fval,exitflag]=linprog(f,a,b,[],[],l)
Optimization terminated.
x =
0.7175
2.0259
0.0000
0.0750
fval =
3.3988
exitflag = 1
>>vpa(x,10)
ans =
.7175368140
2.025881303
.4492169285e-10
.7496653283e-1
>>a*x
ans =
1.0e+003 *
-4.0000
-0.0010
-0.0300
>> -a*x %核对条件满足情况
ans =
1.0e+003 *
4.0000
0.0010
0.0300
1:线性规划的软件Excel MATLAB Lingo Gams Cplex QSB
2: linprog 也一定可以用fmincon来求解
3:P343考虑混合饲料配比,它由玉米粉和大豆组成.其配比要求和价格见下表. 求最优配比使饲料成本最低
设每千克中含玉米为x……..
minZ=2x+1.6y
4x+2y>=2.8
90x+300y>=220
x+y=1 (如不去掉,则结果会出错)
x,y>=0
命令如下:
>> f=[2,1.6];
>> a=[4,2;90,300]; a=-a;
>> b=[2.8;220]; b=-b;
>> c=[1,1];d=1;
>> l=[0,0]
>> [x,fval,exitflag]=linprog(f,a,b,[],[],l)
x = 0.3922
0.6157
fval = 1.7694
exitflag = 1
4:最好在解决每个问题一开始执行clear
5: f行、列向量都可以,(如为行向量,
则目标函数的值fval也等于f*x 如为列向量,则为f’*x)
l,u 行、列向量都可以,还是用列向量更好
可以只有l/u中的某一个。

b,beq必须为列向量
如为>=条件,可以先对条件*-1再生成a; 也可以先生成a,再a=-a 如求最大值,可以先对函数*-1再生成f; 也可以先生成f,再f=-f
核对约束条件是否满足:A*x(-A.*x 如条件为>=)
核对原料冗余:b-A*x
核对目标函数:f*x (或f’*x)
(即核对fval的结果对否)
(aeq*x)
6:确定等式、不等式约束条件时,可以看表格的每行、每列
7、P344超市收银员的最优设置. 考虑超市的收银员周
一至周四需要人数为10人,但周五至周日因顾客增加,
周五需要收银员12人,周六及周日需要收银员14人.问
应如何配备最少的收银员来满足上述要求.收银员工作
日为每周5天.
解:设周一开始上班的有 x1人,称为1班, 周二开始上班的有 x2人,称为2班…….(假设它连续上班5天后再休息) 则目标函数为: minZ=x1+x2+…+x7
约束条件为: x1+x5+x6+x7+x4=10(即周一的10人由这几天(周一及往前4天)开
始上班的人担当,)
x2+x6+x7+x1+x5=10
x3+x2+x1+x7+x6=10
x4+x3+x2+x1+x7=10
x5+x4+x3+x2+x1+12
x6+x5+x4+x3+x2=14
x7+x6+x5+x3+x4=14
命令如下:
>> clear
>> f=ones(7,1);
>>
a=[1,0,0,1,1,1,1;1,1,0,0,1,1,1;1,1,1,0,0,1,1;1,1,1,1,0,0,1;1,1,1,1,1,0,0;0,1,1,1,1,1,0;0,0,1,1,1,1,1] ;
>> b=[10;10;10;10;12;14;14];
>> l=zeros(7,1);
>> [x,fval,exitflag]=linprog(f,[],[],a,b,l)
Optimization terminated.
x =
0.0000
2.0000
4.0000
2.0000
4.0000
2.0000
2.0000
fval =
16.0000
exitflag = 1
结果为: 0 2 4 2 4 2 2 即周一开始上班的人没有,其由4,5,6,7班担当, 周二进制开始上班的人为2人,……
(此题结果正好为整数,若出现非整数的情况,可以试用整数规划方法求解)
8、在等式或不等式的系数矩阵中必须包括所有的变量(没有的用0补)
加上去即可。

9: format long 设置15位的数字格式
size(a) 行数*列数
size(a,1) 行数
size(a,2) 列数
求最小数中(linprog/fmincon)几个矩阵的规定:
f ,x0,l,u: 逗号与分号都可以;
a,aeq逗号与分号必须严格区分行内与行间-----矩阵
b,beq必须用分号(列向量)----(常数)列向量
10:脚本式的程序最好一开始用clear
它是全局变量k=1;
fval=0; 清空fval数组,以免
前面数据影响(有了
clear它就可以不要) 11:x=max(a)
[x,i]=max(a) 如a为矩阵,则在每列中分别找出一个最大
(还返回最大元素所在的位置i)max(a(1,:)) 找第一行中的最大值
max(a(:,2)) 找第二列中的最大值
max( : ) 或max(max(a)) 在整个矩阵(向量)只中找一个最大值min
12: P356b
[zm,mi]=max(z) 找出了最大值及其它的位置。

x=v(mi,:) 也可以分别写成x=v(mi,1) y=v(mi,2)
这四条语句最好不要用分号(为了显示结果)
v(k,1)=x; v(k,2)=y; 可以合成一条语句:v(k,:)=[x,y]或[x;y]
k也可以赋初值为0, 则先k 加1后再使用, 最后k也不需要减1
13: 整数规划的程序采用脚本式程序/函数式也可以。

合并出行解表(水平合并两个矩阵): z=horzcat(f’,v)
相当于是f=[f’,v]
14:整数规划的解法有枚举法、分子定界法、割平面法等,可以求助于专用软件,例如商业量化系统软件QSB。

15、s.t. 表示约束条件
16:fval(k)=…..P359
fval=[fval;fval(k)] 加了第二条语句,不会影响结果
fval由行向量变成了列向量,但结果不影响
17:在整数规划或0-1规划中最后的k=k-1不要也是可以的。

附:for i=1:100 循环结束后i的值是100而不是101
for i=1:2:100循环结束后i的值是99(即最后一次循环时i的值)(因为把i视作一个向量,依次取该向量中的每一个元素)
一、整数规划
1、线性规划的解往往带有小数,但有
的实际问题要求变量必须是整数,如工作人数、船数、车数、产品件数、设备台数等,这类问题不能简单的将结果取整。

2、用枚举法来求解整数规划问题:即把所有可能的解都计算出来。

(不论最大/最小,方法都是一样的,如结果不是整数,则不能用枚举法) 还如鸡狗同笼
3、一般步骤:(没有特定的函数,
必须自己编写脚本式/函
数式程序来解决)
(1)确定每个变量的变化范围(2)用for……end循环,如有n 个变量,则用n重循环。

(3)循环体中(最内层)用if……end 来判断条件(所有条件)(含所有的等式与不等式条件、线性与非线性)是否满足:如满足,则计算该组变量所对应的函数值,并保存该函数值和该组变量的取值。

(4)最后(循环结束后),用函数max或min查找目标函数的最大(小)值及对应的变量值。

即一般的形式为:
clear; k=1;(用作保存结果的数组下标)
for y
if & & & …..
保存该函数值和所有变量的值分别到两个数组中;
最后max/min
.......找函数值数组的最大/小值即可。


for(多个)---if(一个、所有条件)----计算并保存函数结果和变量值---最后max(min)
4、例1:求下列整数规划问题
目标函数:maxF=5x+8y
约束条件:x+y<=6
5x+9y<=45
x,y>0,且x,y
----如再复杂的函数,再更多的变量---
(1)先用linprog来解决,其结果为2.25,3.75; 41.25(最大值,先要取反),这是最理想的情况,也不能再对其取整. 整数规划的求解的最大值肯定要小点.(3,3, 39)
并在最后口述一下这种解题的真正流程, 笨方法,但计算机速度极快
最后还可查看fval, v ,i 或把它们水平合并horzcat(fval’,v)
整数规划问题可以先用linprog/fmincon求一下,如X结果为整数,则最理想了,那就不要编程序了。

>> f=[5,8];
>> a=[1,1;5,9];
>> b=[6,45];
>> f=-f;
>> [x,fval,exitflag]=linprog(f,a,b,[],[],[0,0])
x = 2.2500
3.7500
fval = -41.2500
exitflag = 1
(2)x,y的取值范围都为1-6
编制程序如下(函数式或脚本式): function f=zhzs1()
clear
k=1;
for x=1:6 %把1:6全改成1:16,结果是一样的1:5也可以for y=1:6
if (x+y)<=6 & (5*x+9*y)<=45
f(k)=5*x+8*y;
v(k,1)=x; 这两行可以合成一条:v(k,:)=[x,y]
v(k,2)=y; x y
fx(k)=x; 上面两条可换成这两条:
fy(k)=y;
k=k+1; %如k初值为0,则此语句放在前面
end
end
end
k=k-1; 此语句可以不要[fval,i]=max(f) 如求最小值,则用min
x=fx(i)
y=fy(i)
x=v(i,1);y=v(i,2) 这两行可以合成一条x=v(i,:),则x为一个向量,包括x和y. 最后可以输出fval,x,y (fprintf/disp)
x,y,maxf
[fx;fy;fv]
2011年程序
function f=zs1()
i=1;
for x=1:5
for y=1:5
if (x+y<=6) & (5*x+9*y<=45)
z(i)=5*x+8*y;
fx(i)=x;
fy(i)=y;
i=i+1;
end
end
end
[maxval,j]=max(z);
x=fx(j)
y=fy(j)
maxval
(运行后可查看f,fx,fy三个数组---或三个数组进行合并:
[f;fx;fy]/[f..’.,fx
...’.,f..y’..])..
如想查看满足条件的所有解及其位置,可以将f和v水平合成一个矩阵。

Z=horzcat(f’,v)
(1)为此题再加非线性条件x^3+exp(y)>=35
是为了说明自己编程可以任意编,自由灵活,想这么样就这么样。

可以求最大和最小,条件可以<= 和>=, 可以任意函数,任意n元,任意条件(线性和非线性)
(2)1:6变成1:60、1:600都可以,但最好不要太大,以浪费资源。

但绝对不能太小,可能会切掉正确结果。

如此是1:5就可以,但没必要这么精确。

(3)领导开一个房间
多个对应变量(秘书)可以各自开一个房间,也可以只开一个大(4人间/6人间…)的房间,即一个二维数组。

(4)保存自变量:最好各自开一个房间fx(k)=x;fy(k)=y;fz(k)=z (学生更好理解) v(k,:)=[x,y,z] 是一行整体赋值,它就是相当于v(k,1)=x;v(k,2)=y; v(k,3)=z;……
最后也是v(i,:)----可以x=v(i,1); y=v(i,2); z=v(i,3); 也可以f=v(i,:);即一次整体读出一行,绝对不能写成[x,y,z]=v(i,:),反之可以, 即f(1)代表x , f(2) 代表y, f(3) 代表z.
也可以k=0;…..k=k+1; f(k)=…;v(k)=….;
最后结果的分号可以加,也可以不加(要否看结果)
5:例2 求解下列整数规划问题
目标函数: maxf=4x+6y+2z
约束条件: -x+3y<=8
-y+3z<=10
5x-z<=8
x,y,z>0
先用linprog来解决,其结果为2.25,3.75; 41.25(最大值,先要取反),这是最理想的情况,也不能再对其取整. f=[-4,-6,-2];a=[-1,3,0;0,-1,3;5,0,-1];b=[8;10;8];l=[0,0,0];[x,fval,exitflag]=linprog(f,a,b,[],[],l)--2.5/3.5/4.5/ (-(-40))
确定每个变量的变化范围有点难度,可以把三个式子相加再看或用其它方法结果为2,3,4;34
(但最好不要大得太离谱,大一些不影响结果---可试验一下子)
clear
k=1;
for x=1:13 (1:6即可)
for y=1:13
for z=1:13
if (-x+3*y<=8) & (-y+3*z<=10) & (5*x-z<=8)
fval(k)=4*x+6*y+2*z; %要保存两方面的值
fx(k)=x;也要讲解
fy(k)=y;
fz(k)=z;
k=k+1;
end
end
end
end
k=k-1;
[maxf,i]=max(fval);
disp(maxf);
x=fx(i); y=fy(i); z=fz(i); %x=v(i,:)
2011年程序
function f=zs2()
i=1;
for x=1:6
for y=1:12
for z=1:13
if (-x+3*y<=8 & -y+3*z<=10 & 5*x-z<=8)
fv(i)=4*x+6*y+2*z;
fx(i)=x;
fy(i)=y;
fz(i)=z;
i=i+1;
end
end
end
end
[maxval,k]=max(fv);
x=fx(k)
y=fy(k)
z=fz(k)
maxval
function f=zs2()
i=1;
for x=1:6
for y=1:12
for z=1:13
if (-x+3*y<=8 & -y+3*z<=10 & 5*x-z<=8) fv(i)=4*x+6*y+2*z;
ff(i,:)=[x,y,z];
i=i+1;
end
end
end
end
[maxval,k]=max(fv);
ff(k,:)
maxval
function f=zs2()
i=1;
for x=1:6
for y=1:12
for z=1:13
if (-x+3*y<=8 & -y+3*z<=10 & 5*x-z<=8) fv(i)=4*x+6*y+2*z;
ff(i,:)=[x,y,z];
i=i+1;
end
end
end
end
[maxval,k]=max(fv);
x=ff(k,1)
y=ff(k,2)
z=ff(k,3)
maxval
如求最小值呢?只要把最后max改成min即可。

n元,任意条件,最大/最小都可,<= >=均可(大不要转换成小)
如不是整数,则不能用枚举法---因为即使1到2之间都有无数个数字,不可能全部列举得完。

二、0-1规划
1、是整数规划的一种特殊形式,即
每个变量只能取0或1
(0/1用来表示是/否)
2、也是采用枚举法,编程方法与整
数完全相同
3、例1:今有一集装箱,拟运输下列
物品A1-A5,A1、A3由于体积
大,集装箱内只能装其中之一。

A4、A5由于重量大也只能装一件。

A1是食品不能与化工产品A4放在一起。

A2与A5是配套产品,必需一起运输。

A1的运费是1500元,A2的运费是2000元,A3的运费是1300元,A4的运费是2300元,A5的运费是2800元,问集装箱应如何装箱才能使这运费收入达到最大。

设A1-A5是否装运的控制变量是x1-x5, xi=0表示物品Ai不装,xi=1表示物品Ai装箱运输
结果为1 1 0 0 1;6.3
则目标函数为:maxf=1.5x1+2x2+
1.3x3+
2.3x4+2.8x5 约束条件为:
x1+x3<=1或~=2 (两者取一)
x4+x5<=1或~=2 (两者取一)
x1≠x4 (两者排斥)(或x1+x4≠2)
x2=x5 (两者同时装或同时不装或
x2+x5~=1,=0/=2)
x1,x2,x3,x4,x5为0、1元素
编制程序如下:
clear
k=1;
for x1=0:1
for x2=0:1
for x3=0:1
for x4=0:1
for x5=0:1
if x1+x3<=1 & x4+x5<=1 & x2==x5 & x1~=x4( 可变成
x1+x4~=2)
fval(k)=1.5*x1+2*x2+1.3*x3+2.3*x4+2.8*x5;
v(k,:)=[x1,x2,x3,x4,x5];
k=k+1;
end
end
end
end
end
end
k=k-1;
[maxf,i]=max(fval);
maxf
x=v(i,:)
结果为:maxf =6.3000
x =1 1 0 0 1
2009------
clear
k=1;
for x1=0:1
for x2=0:1
for x3=0:1
for x4=0:1
for x5=0:1
if (x1+x3~=2) & (x4+x5~=2) & (x1+x4~=2) & (x2+x5~=1)
f(k)=1.5*x1+2*x2+ 1.3*x3+2.3*x4+2.8*x5;
v(k,:)=[x1,x2,x3,x4,x5];
k=k+1;
end
end
end
end
end
end
[fmax,j]=max(f);
fx=v(j,:);
fmax,fx
2011年程序
function f=ly()
i=1;
for x1=0:1
for x2=0:1
for x3=0:1
for x4=0:1
for x5=0:1
if x1+x3<=1 & x4+x5<=1 & x1+x4~=2 & x2==x5
fv(i)=1500*x1+2000*x2+1300*x3+2300*x4+2800*x5;
ff(i,:)=[x1,x2,x3,x4,x5];
i=i+1;
end
end
end
end
end
end
[maxval,k]=max(fv);
ff(k,:)
maxval
4、例2:求解0-1规划
目标函数:maxF=x1+2x2+2x3-6x4-4x5 约束条件:3x1+2x2-x3+3x4+2x5<=5
x1+4x2-2x3-x4-2x5<=5
x1,x2,x3,x4,x5=0或1
结果为:1 1 1 0 0; 5
程序如下:
clear
k=1;
for x1=0:1
for x2=0:1
for x3=0:1
for x4=0:1
for x5=0:1
if 3*x1+2*x2-x3+3*x4+2*x5<=5 &
2*x1+4*x2-2*x3-x4-2*x5<=5
fval(k)=x1+2*x2+2*x3-6*x4-4*x5;
v(k,:)=[x1,x2,x3,x4,x5];
k=k+1;
end
end
end
end
end
end
k=k-1;
[maxf,i]=max(fval);
maxf,x=v(i,:)。

相关文档
最新文档