实验目的:掌握线性规划、整数规划、非线性规划问题的基本形式,会根据实际问题构建相应的基本形式,并利用MATLAB或LINGO软件实现。
1.写出求解以下规划问题的MATLAB程序或Lingo程序:
(1)指派问题其系数矩阵为:
(2)线性规划问题:
(3)已知某商品有8个配送中心,有15个用户需要该商品,用户的需求量和配送中心的供应量,以及运费(见数据data.xlsx),若配送中心给用户配送,配送量要大于1000小于2000,则求最小运费调用计划。(数据data.xlsx如下图)
用户 | 单位商品运费 | 需求量 | |||||||
中心1 | 中心2 | 中心3 | 中心4 | 中心5 | 中心6 | 中心7 | 中心8 | ||
用户1 | 390.6 | 618.5 | 553 | 442 | 113.1 | 5.2 | 1217.7 | 1011 | 3000 |
用户2 | 370.8 | 636 | 440 | 401.8 | 25.6 | 113.1 | 1172.4 | 894.5 | 3100 |
用户3 | 876.3 | 1098.6 | 497.6 | 779.8 | 903 | 1003.3 | 907.2 | 40.1 | 2900 |
用户4 | 745.4 | 1037 | 305.9 | 725.7 | 445.7 | 531.4 | 1376.4 | 768.1 | 3100 |
用户5 | 144.5 | 354.6 | 624.7 | 238 | 290.7 | 269.4 | 993.2 | 974 | 3100 |
用户6 | 200.2 | 242 | 691.5 | 173.4 | 560 | 589.7 | 661.8 | 855.7 | 3400 |
用户7 | 235 | 205.5 | 801.5 | 326.6 | 477 | 433.6 | 966.4 | 1112 | 3500 |
用户8 | 517 | 541.5 | 338.4 | 219 | 249.5 | 335 | 937.3 | 701.8 | 3200 |
用户9 | 542 | 321 | 1104 | 576 | 896.8 | 878.4 | 728.3 | 1243 | 3000 |
用户10 | 665 | 827 | 427 | 523.2 | 725.2 | 813.8 | 692.2 | 284 | 3100 |
用户11 | 799 | 855.1 | 916.5 | 709.3 | 1057 | 1115.5 | 300 | 617 | 3300 |
用户12 | 852.2 | 798 | 1083 | 714.6 | 1177.4 | 1216.8 | 40.8 | 898.2 | 3200 |
用户13 | 602 | 614 | 820 | 517.7 | 899.6 | 952.7 | 272.4 | 727 | 3300 |
用户14 | 903 | 1092.5 | 612.5 | 790 | 932.4 | 1034.9 | 777 | 152.3 | 2900 |
用户15 | 600.7 | 710 | 522 | 448 | 726.6 | 811.8 | 563 | 426.8 | 3100 |
供应量 | 18600 | 19600 | 17100 | 18900 | 17000 | 19100 | 20500 | 17200 |
3000 | ||||||||
3100 | ||||||||
2900 | ||||||||
3100 | ||||||||
3100 | ||||||||
3400 | ||||||||
3500 | ||||||||
3200 | ||||||||
3000 | ||||||||
3100 | ||||||||
3300 | ||||||||
3200 | ||||||||
3300 | ||||||||
2900 | ||||||||
3100 | ||||||||
18600 | 19600 | 17100 | 18900 | 17000 | 19100 | 20500 | 17200 |
2.一家公司准备在某个地区建立两个分公司,向7个区的居民经营,每个区的居民数如下图,每个分公司只能向本区和相邻区的居民经营,分店应建在何处,才能使得所能供应的居民的 数量最大?请给出数学模型及求解程序。
3.写出求解下列非线性问题的M程序及Lingo程序
1.(1)
%方法一:MATLAB程序
clear all
clc
C=[16 15 19 22;17 21 19 18;24 22 18 17;17 19 22 16]';
%生成目标函数系数矩阵
c=reshape(C,1,4*4);
%生成等式约束系数矩阵
Aeq=zeros(8,16);
a=ones(1,4);
for i=1:4
Aeq(i,4*(i-1)+1:4*i)=a;
end
for i=1:4
for j=1:4
Aeq(i+4,4*(j-1)+i)=1;
end
end
beq=ones(8,1);
%套用MATLAB混合整形规划函数求解
intlinprog(c,1:16,[],[],Aeq,beq,zeros(1,16),ones(1,16))
解答结果:
LP: Optimal objective value is 66.000000
ans= 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 1
即x12=x21=x33=x44=1
故工作1-4分别由第2、1、3 、4个人去做,代价最小为66.
%方法二:LINGO程序
model:
sets:
ren/1..4/:a;
work/1..4/:b;
link(ren,work):c,x;
endsets
data:
c=16 15 19 22 17 21 19 18 24 22 18 17 17 19 22 16;
enddata
min=@sum(link:c*x);
@for(ren(i):@sum(work(j):x(i,j))=1);
@for(work(j):@sum(ren(i):x(i,j))=1);
@for(link(i,j):@bin(x(i,j)));
end
解答结果:
(2)解:将线性规划问题化为MATLAB标准型:
%方法一:MATLAB程序
c=-[100 90 80 70];
A=[-1 -1 0 0;0 0 -1 -1;3 0 2 0;0 3 0 2];
b=[-30 -30 120 48]';
[x,fval]=linprog(c,A,b,[],[],zeros(4,1),[])
求解结果:
x =
14.0000
16.0000
39.0000
0
fval =
-5.9600e+03
%方法二:LINGO程序
max=100*x1+90*x2+80*x3+70*x4;
x1+x2>30;
x3+x4>30;
3*x1+2*x3<120;
3*x2+2*x4<48;
求解结果:
(3)解:
%方法一:MATLAB程序
clear all
clc
C=[390.6 618.5 553 442 113.1 5.2 1217.7 1011;370.8 636 440 401.8 25.6 113.1 1172.4 894.5; 876.3 1098.6 497.6 779.8 903 1003.3 907.2 40.1;745.4 1037 305.9 725.7 445.7 531.4 1376.4 768.1;144.5 354.6 624.7 238 290.7 269.4 993.2 974;200.2 242 691.5 173.4 560 589.7 661.8 855.7; 235 205.5 801.5 326.6 477 433.6 966.4 1112;517 541.5 338.4 219 249.5 335 937.3 701.8; 542 321 1104 576 896.8 878.4 728.3 1243; 665 827 427 523.2 725.2 813.8 692.2 284;799 855.1 916.5 709.3 1057 1115.5 300 617;852.2 798 1083 714.6 1177.4 1216.8 40.8 898.2;602 614 820 517.7 899.6 952.7 272.4 727;903 1092.5 612.5 790 932.4 1034.9 777 152.3; 600.7 710 522 448 726.6811.8 563 426.8];
beq=[3000 3100 2900 3100 3100 3400 3500 3200 3000 3100 3300 3200 3300 2900 3100]';
b=[18600 19600 17100 18900 17000 19100 20500 17200]';
%生成目标函数系数矩阵
%可以利用xlsread函数读取数据
%C=xlsread(‘data.xls’,’B3:I17’);
%beg= xlsread(‘data.xls’,’J3:J17’);
%b= xlsread(‘data.xls’,’B18:I18’);
c=reshape(C,1,8*15);
c=[c,zeros(1,120)];
%生成不等约束系数矩阵
A=zeros(8,2*8*15);
a=ones(1,15);
for i=1:8
A(i,15*(i-1)+1:15*i)=a;
end
%生成等式约束矩阵
Aeq=zeros(15,2*8*15);
k=1;
for i=1:15
for j=1:8
Aeq(i,15*(j-1)+k)=1;
end
k=k+1;
end
A1=zeros(2*8*15);
j=1;
for i=1:2:239;
A1(i,j)=-1;
A1(i,120+j)=1000;
A1(i+1,j)=1;
A1(i+1,120+j)=-2000;
j=j+1;
end
A=[A;A1];
b=[b;zeros(240,1)];
intlinprog(c,121:240,A,b,Aeq,beq,zeros(1,8*15),[])
%方法二:LINGO程序
model:
sets:
yonghu/1..15/:a;
dian/1..8/:b;
link(yonghu,dian):c,x,y;
endsets
data:
a=@file('data.txt');
b=@file('data.txt');
c=@file('data.txt');
@text(data2.txt)=@table(x);
@text()=@table(x);
enddata
min=@sum(link:c*x);
@for(dian(j):@sum(yonghu(i):x(i,j))<b(j));
@for(yonghu(i):@sum(dian(j):x(i,j))=a(i));
@for(link:1000*y<x; x<2000*y; @bin(y));
end
2. 解:
MATLAB程序:
解法一:利用面向问题求解:
clear all
clc
x = optimvar('x',11,1,'Type','integer','LowerBound',0,'UpperBound',1);
%依照上述数学模型,声明了一个11维0-1变量x
c=[109 89 104 122 117 83 100 115 81 56 73];
prob = optimproblem;
prob.Objective = -c*x;
prob.Constraints.cons1 =sum(x)<=2;
prob.Constraints.cons2 = sum(x(1:3))<=1;
prob.Constraints.cons3 = sum(x([1,4]))<=1;
prob.Constraints.cons4 = sum(x([2,4,5:7]))<=1;
prob.Constraints.cons5 = sum(x([3,5,8]))<=1;
prob.Constraints.cons6 = sum(x([6,9,10]))<=1;
prob.Constraints.cons7 = sum(x([7:9,11]))<=1;
options = optimoptions('intlinprog','Display','off');
[sol,fval] = solve(prob,'Options',options)
解法二:利用求解器intlinproc求解:
f=[109 89 104 122 117 83 100 115 81 56 73];
A=zeros(7,11);
A(1,:)=1;
A(2,1:3)=1;
A(3,[1,4])=1;
A(4,[2,4,5:7])=1;
A(5,[3,5,8])=1;
A(6,[6,9,10])=1;
A(7,[7:9,11])=1;
b=ones(7,1);
b(1)=2;
intcon=1:11;
lb=zeros(11,1);
ub=ones(11,1);
[x,fval,exitflag,output] = intlinprog(-f,intcon,A,b,[],[],lb,ub)
LINGO程序:
max=109*x12+89*x13+104*x14+ 122*x23+ 117*x34+ 83*x35+ 100*x36+ 115*x46+ 81*x56+ 56 *x57+73*x67;
x12+x13+x14+ x23+ x34+ x35+ x36+ x46+ x56+ x57+x67<=2;
x12+x13+x14<=2;
x12+ x23<=1;
x13+x23+ x34+ x35+ x36<=1;
x14+ x34+ x46<=1;
x35+x56+ x57<=1;
x36+ x46+ x56+x67<=1;
@bin(x12);
@bin(x13);
@bin(x14);
@bin(x23);
@bin(x34);
@bin(x35);
@bin( x36);
@bin(x46);
@bin(x56);
@bin(x57);
@bin(x67);
3.解:
%方法一:MATLAB程序
定义目标函数:
function y=fun1(x);
y=[2 3 1]*x+[3 1 0]*x.^2;
y=-y;
end
定义非线性约束条件:
function [f,g]=fun2(x);
f=[x(1)+2*x(1)^2+x(2)+2*x(2)^2+x(3)-10
x(1)+x(1)^2+x(2)+x(2)^2-x(3)-50
2*x(1)+x(1)^2+2*x(2)+x(3)-40];
g=x(1)^2+x(3)-2;
end
定义线性不等约束矩阵
A=[-1 -2 0;-1 0 0];b=[-1;-10];
[x,y]=fmincon(@fun1,rand(3,1),A,b,[],[],[],[],@fun2)
%方法二:LINGO程序
max=2*x1+3*x1^2+3*x2+x2^2+x3;
x1+2*x1^2+x2+x2^2+x3<10;
x1+x1^2+x2+x2^2-x3<50;
2*x1+x1^2+2*x2+x3<40;
x1^2+x3=2;
x1+2*x2>1;
x1>10;
@free(x2);
@free(x3);
答案供参考,如有错误请自行改正,本人只是随意分享之前的作业,代码均来源于网络+个人稍微修改,认为有用可参考哈~