运筹学实验14.docx
《运筹学实验14.docx》由会员分享,可在线阅读,更多相关《运筹学实验14.docx(13页珍藏版)》请在冰豆网上搜索。
![运筹学实验14.docx](https://file1.bdocx.com/fileroot1/2023-1/29/35a0de32-d873-457d-940d-e21c5f392277/35a0de32-d873-457d-940d-e21c5f3922771.gif)
运筹学实验14
实验一线性规划模型建立与求解
一、实验目的与要求
掌握小型线性规划模用lingo软件求解,要求会使用此软件解决一般的线性规划问题
二、实验原理
对于小型线性规划模型,在lingo中用直接输入模型的方式求解。
对于含有很多变量和约束条件的模型,要求会用编程的方法来求解。
三、主要仪器设备
安装了Windows、lingo软件的计算机。
四、实验内容与步骤
1、求小型线性规划模型的解。
例1.1求解下面的线性规划
maxz=2x1+3x2
x1+2x2≤8
4x1≤16
4x2≤16
x1,x2≥0
LINGO中的输入代码,点菜单栏的LINGO→Solver,或直接点工具栏上的,可得求解结果即解的状况(SolverStatus)和解报告(SolutionReport):
例1.2求解下面线性规划的数学模型
minz=-3x1+4x2-2x3+5x4;
4x1-x2+2x3-x4=-2;
x1+x2+3x3-x4≤14;
-2x1+3x2-x3+2x4≥2;
x1,x2,x3≥0,x4无约束;
LINGO中输入如下的代码:
min=-3*x1+4*x2-2*x3+5*x4;
4*x1-x2+2*x3-x4=-2;
x1+x2+3*x3-x4<=14;
-2*x1+3*x2-x3+2*x4>=2;
@free(x4);
求解可得解报告:
Globaloptimalsolutionfound.
Objectivevalue:
2.000000
Totalsolveriterations:
0
VariableValueReducedCost
X10.00000015.50000
X28.0000000.000000
X30.0000008.500000
X4-6.0000000.000000
RowSlackorSurplusDualPrice
12.000000-1.000000
20.0000004.500000
30.0000000.5000000
410.000000.000000
2、用编程的方法求解大型线性规划模型的解
例1.3用LINGO编程求解例1.1的线性规划模型
!
定义变量与常量,给出了值的为常量;
sets:
is/1..3/:
b;
js/1..2/:
c,x;
links(is,js):
a;
endsets
!
目标函数;
max=@sum(js(J):
c(J)*x(J));
!
约束条件;
@for(is(I):
@sum(js(J):
a(I,J)*x(J))<=b(I));
!
指定常量的值;
data:
!
直接输入数据;
c=23;
b=81612;
a=12
40
04;
enddata
end
求解可得SolutionReport
Globaloptimalsolutionfound.
Objectivevalue:
14.00000
Totalsolveriterations:
1
VariableValueReducedCost
B
(1)8.0000000.000000
B
(2)16.000000.000000
B(3)12.000000.000000
C
(1)2.0000000.000000
C
(2)3.0000000.000000
X
(1)4.0000000.000000
X
(2)2.0000000.000000
A(1,1)1.0000000.000000
A(1,2)2.0000000.000000
A(2,1)4.0000000.000000
A(2,2)0.0000000.000000
A(3,1)0.0000000.000000
A(3,2)4.0000000.000000
RowSlackorSurplusDualPrice
114.000001.000000
20.0000001.500000
30.0000000.1250000
44.0000000.000000
实验二、运输问题的计算机求解
一、实验目的与要求
掌握中小型运输问题的直接输入运输问题的数学模型代码求解。
对于大型运输问题,要求用编程的方法求解,简化模型的直接输入。
二、实验原理
将运输问题转换为线性规划问题后,直接输入数学模型代码,利用lingo软件求解
三、主要仪器设备
安装了Windows、lingo软件的计算机。
四、实验内容与步骤
1、中小型运输问题的求解
中小型运输问题可以和小型线性规划一样,直接输入运输问题的数学模型代码求解。
例2.1求解下面运输问题的数学模型
单
位销地
运
价
产地
B1
B2
B3
B4
产量
A1
3
11
3
10
7
A2
1
9
2
8
4
A3
7
4
10
5
9
销量
3
6
5
6
LINGO中的输入代码为:
min=3*x11+11*x12+3*x13+10*x14+x21+9*x22+2*x23+8*x24+7*x31+4*x32
+10*x33+5*x34;
x11+x12+x13+x14=7;
x21+x22+x23+x24=4;
x31+x32+x33+x34=9;
x11+x21+x31=3;
x12+x22+x32=6;
x13+x23+x33=5;
x14+x24+x34=6;
求解可得:
Globaloptimalsolutionfound.
Objectivevalue:
83.00000
Totalsolveriterations:
0
VVariableValueReducedCost
X110.0000000.000000
X120.0000002.000000
X135.0000000.000000
X142.0000000.000000
X213.0000000.000000
X220.0000002.000000
X230.0000001.000000
X241.0000000.000000
X310.0000009.000000
X326.0000000.000000
X330.00000012.00000
X343.0000000.000000
RowSlackorSurplusDualPrice
185.00000-1.000000
20.000000-3.000000
30.000000-1.000000
40.0000002.000000
50.0000000.000000
60.000000-6.000000
70.0000000.000000
80.000000-7.000000
2、大规模运输问题的求解
对于变量多和约束条件多的运输问题数学模型,用编程的方法求解,简化了模型的输入,带来了很大的方便。
例2.2用编程的方法求解例2.1
LINGO编程为
MODEL:
!
!
定义变量和常量;
SETS:
As/A1..A3/:
a;
Bs/B1..B4/:
b;
LINKS(As,Bs):
c,x;
ENDSETS
!
目标函数;
MIN
=@SUM(LINKS(I,J):
C(I,J)*x(I,J));
!
产量约束;
@FOR(As(I):
@SUM(Bs(J):
x(I,J))=a(I));
!
销量约束;
@FOR(Bs(J):
@SUM(As(I):
x(I,J))=b(J));
!
Hereisthedata;
DATA:
a=749;
b=3656;
c=311310
1928
74105;
ENDDATA
END
上述编程对应的数学模型为如下形式:
求解可得解报告:
Globaloptimalsolutionfound.
Objectivevalue:
85.00000
Totalsolveriterations:
7
VariableValueReducedCost
A(A1)7.0000000.000000
A(A2)4.0000000.000000
A(A3)9.0000000.000000
B(B1)3.0000000.000000
B(B2)6.0000000.000000
B(B3)5.0000000.000000
B(B4)6.0000000.000000
C(A1,B1)3.0000000.000000
C(A1,B2)11.000000.000000
C(A1,B3)3.0000000.000000
C(A1,B4)10.000000.000000
C(A2,B1)1.0000000.000000
C(A2,B2)9.0000000.000000
C(A2,B3)2.0000000.000000
C(A2,B4)8.0000000.000000
C(A3,B1)7.0000000.000000
C(A3,B2)4.0000000.000000
C(A3,B3)10.000000.000000
C(A3,B4)5.0000000.000000
X(A1,B1)0.0000000.000000
X(A1,B2)0.0000002.000000
X(A1,B3)5.0000000.000000
X(A1,B4)2.0000000.000000
X(A2,B1)3.0000000.000000
X(A2,B2)0.0000002.000000
X(A2,B3)0.0000001.000000
X(A2,B4)1.0000000.000000
X(A3,B1)0.0000009.000000
X(A3,B2)6.0000000.000000
X(A3,B3)0.00000012.00000
X(A3,B4)3.0000000.000000
RowSlackorSurplusDualPrice
185.00000-1.000000
20.000000-3.000000
30.000000-1.000000
40.0000002.000000
50.0000000.000000
60.000000-6.000000
70.0000000.000000
80.000000-7.000000
实验三、整数规划数学模型的求解
一、实验目的与要求
掌握整数规划数学模型的计算机求解
二、实验原理
LINGO中求解整数规划或0-1规划,只需要在一个线性规划的代码或程序中添加整数约束,x1为整数可用@gin(x1)表示,x2为0-1变量可用@bin(x2)表示。
三、主要仪器设备
安装了Windows、lingo软件的计算机。
四、实验内容与步骤
1、例求解下面混合整数规划
minz=-3x1+4x2-2x3+5x4;
4x1-x2+2x3-x4=-2;
x1+x2+3x3-x4≤14;
-2x1+3x2-x3+2x4≥2;
x1为整数,x2=0或1,x3≥0,x4无约束
2、编写程序
LINGO编程为:
!
定义变量与常量,给出了值的为常量;
sets:
is/1..3/:
b;
js/1..4/:
c,x;
links(is,js):
a;
endsets
!
目标函数;
min=@sum(js(J):
c(J)*x(J));
!
约束条件;
@sum(js(J):
a(1,J)*x(J))=b
(1);
@sum(js(J):
a(2,J)*x(J))<=b
(2);
@sum(js(J):
a(3,J)*x(J))>=b(3);
!
自由变量;
@gin(x
(1));@bin(x
(2));@free(x(4));
!
指定常量的值;
data:
c=-34-25;
b=-2142;
a=4-12-1
113-1
-23-12;
enddata
!
结束;
End
3、求解可得解报告:
Globaloptimalsolutionfound.
Objectivevalue:
9.000000
Extendedsolversteps:
0
Totalsolveriterations:
0
VariableValueReducedCost
B
(1)-2.0000000.000000
B
(2)14.000000.000000
B(3)2.0000000.000000
C
(1)-3.0000000.000000
C
(2)4.0000000.000000
C(3)-2.0000000.000000
C(4)5.0000000.000000
X
(1)0.00000017.00000
X
(2)1.000000-1.000000
X(3)0.0000008.000000
X(4)1.0000000.000000
A(1,1)4.0000000.000000
A(1,2)-1.0000000.000000
A(1,3)2.0000000.000000
A(1,4)-1.0000000.000000
A(2,1)1.0000000.000000
A(2,2)1.0000000.000000
A(2,3)3.0000000.000000
A(2,4)-1.0000000.000000
A(3,1)-2.0000000.000000
A(3,2)3.0000000.000000
A(3,3)-1.0000000.000000
A(3,4)2.0000000.000000
RowSlackorSurplusDualPrice
19.000000-1.000000
20.0000005.000000
314.000000.000000
43.0000000.000000
实验四、指派问题的计算机求解
一、实验目的与要求
掌握指派问题的计算机求解,要求会用lingo软件编程求解。
二、实验原理
指派问题的数学模型实质就是一个特殊的运输问题,产地个数和销地个数相同,每个产地的产量和每个销地的销量都是1个单位,变量也都为0-1变量。
三、主要仪器设备
安装了Windows、lingo软件的计算机。
四、实验内容与步骤
1、用运输问题的数学模型求解一个指派问题
2、编写程序并输入
model:
!
7个工人,7个工作的分配问题;
sets:
workers/w1..w7/;
jobs/j1..j7/;
links(workers,jobs):
cost,volume;
endsets
!
目标函数;
min=@sum(links:
cost*volume);
!
每个工人只能有一份工作;
@for(workers(I):
@sum(jobs(J):
volume(I,J))=1;);
!
每份工作只能有一个工人;
@for(jobs(J):
@sum(workers(I):
volume(I,J))=1;);
data:
cost=6267425
4953858
5219743
7673927
2395726
55228114
923124510;
enddata
end
3、输出结果