1、运筹学实验14实验一 线性规划模型建立与求解一、 实验目的与要求掌握小型线性规划模用lingo软件求解,要求会使用此软件解决一般的线性规划问题二、 实验原理对于小型线性规划模型,在lingo中用直接输入模型的方式求解。对于含有很多变量和约束条件的模型,要求会用编程的方法来求解。三、 主要仪器设备安装了Windows、lingo软件的计算机。四、 实验内容与步骤1、 求小型线性规划模型的解。例1.1 求解下面的线性规划max z=2x1+3x2 x1+2x28 4x1 16 4x216 x1,x20LINGO中的输入代码,点菜单栏的LINGOSolver,或直接点工具栏上的 ,可得求解结果即解的
2、状况(Solver Status)和解报告(Solution Report):例1.2 求解下面线性规划的数学模型min z=-3x1+4x2-2x3+5x4;4x1-x2+2x3-x4=-2;x1+x2+3x3-x414;-2x1+3x2-x3+2x42;x1,x2,x30,x4无约束;LINGO中输入如下的代码:min =-3*x1+4*x2-2*x3+5*x4;4*x1-x2+2*x3-x4=-2;x1+x2+3*x3-x4=2;free(x4);求解可得解报告:Global optimal solution found. Objective value: 2.000000 Total
3、solver iterations: 0 Variable Value Reduced Cost X1 0.000000 15.50000 X2 8.000000 0.000000 X3 0.000000 8.500000 X4 -6.000000 0.000000 Row Slack or Surplus Dual Price 1 2.000000 -1.000000 2 0.000000 4.500000 3 0.000000 0.5000000 4 10.00000 0.0000002、 用编程的方法求解大型线性规划模型的解例1.3 用LINGO编程求解例1.1的线性规划模型!定义变量与
4、常量,给出了值的为常量;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=2 3;b=8 16 12;a=1 2 4 0 0 4;end dataend求解可得Solution ReportGlobal optimal solution found. Objective value: 14.00000 Total solver iterations: 1
5、Variable Value Reduced Cost B( 1) 8.000000 0.000000 B( 2) 16.00000 0.000000 B( 3) 12.00000 0.000000 C( 1) 2.000000 0.000000 C( 2) 3.000000 0.000000 X( 1) 4.000000 0.000000 X( 2) 2.000000 0.000000 A( 1, 1) 1.000000 0.000000 A( 1, 2) 2.000000 0.000000 A( 2, 1) 4.000000 0.000000 A( 2, 2) 0.000000 0.000
6、000 A( 3, 1) 0.000000 0.000000 A( 3, 2) 4.000000 0.000000 Row Slack or Surplus Dual Price 1 14.00000 1.000000 2 0.000000 1.500000 3 0.000000 0.1250000 4 4.000000 0.000000实验二、运输问题的计算机求解一、实验目的与要求 掌握中小型运输问题的直接输入运输问题的数学模型代码求解。对于大型运输问题,要求用编程的方法求解,简化模型的直接输入。二、实验原理 将运输问题转换为线性规划问题后,直接输入数学模型代码,利用lingo软件求解三、主
7、要仪器设备安装了Windows、lingo软件的计算机。四、实验内容与步骤 1、中小型运输问题的求解中小型运输问题可以和小型线性规划一样,直接输入运输问题的数学模型代码求解。例2.1 求解下面运输问题的数学模型单位 销地运价产地B1B2B3B4产量A13113107A219284A3741059销量3656LINGO中的输入代码为: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+
8、x33+ x34 = 9;x11+ x21+ x31= 3;x12+ x22+ x32 = 6;x13+ x23+ x33 = 5;x14+ x24+ x34 = 6;求解可得:Global optimal solution found. Objective value: 83.00000 Total solver iterations: 0 V Variable Value Reduced Cost X11 0.000000 0.000000 X12 0.000000 2.000000 X13 5.000000 0.000000 X14 2.000000 0.000000 X21 3.000
9、000 0.000000 X22 0.000000 2.000000 X23 0.000000 1.000000 X24 1.000000 0.000000 X31 0.000000 9.000000 X32 6.000000 0.000000 X33 0.000000 12.00000 X34 3.000000 0.000000 Row Slack or Surplus Dual Price 1 85.00000 -1.000000 2 0.000000 -3.000000 3 0.000000 -1.000000 4 0.000000 2.000000 5 0.000000 0.00000
10、0 6 0.000000 -6.000000 7 0.000000 0.000000 8 0.000000 -7.000000 2、大规模运输问题的求解对于变量多和约束条件多的运输问题数学模型,用编程的方法求解,简化了模型的输入,带来了很大的方便。例2.2 用编程的方法求解例2.1LINGO编程为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)
11、;! 销量约束;FOR(Bs(J): SUM(As(I):x(I,J)=b(J);! Here is the data;DATA: a=7 4 9; b=3 6 5 6; c=3 11 3 10 1 9 2 8 7 4 10 5;ENDDATAEND上述编程对应的数学模型为如下形式:求解可得解报告:Global optimal solution found. Objective value: 85.00000 Total solver iterations: 7 Variable Value Reduced Cost A( A1) 7.000000 0.000000 A( A2) 4.0000
12、00 0.000000 A( A3) 9.000000 0.000000 B( B1) 3.000000 0.000000 B( B2) 6.000000 0.000000 B( B3) 5.000000 0.000000 B( B4) 6.000000 0.000000 C( A1, B1) 3.000000 0.000000 C( A1, B2) 11.00000 0.000000 C( A1, B3) 3.000000 0.000000 C( A1, B4) 10.00000 0.000000 C( A2, B1) 1.000000 0.000000 C( A2, B2) 9.00000
13、0 0.000000 C( A2, B3) 2.000000 0.000000 C( A2, B4) 8.000000 0.000000 C( A3, B1) 7.000000 0.000000 C( A3, B2) 4.000000 0.000000 C( A3, B3) 10.00000 0.000000 C( A3, B4) 5.000000 0.000000 X( A1, B1) 0.000000 0.000000 X( A1, B2) 0.000000 2.000000 X( A1, B3) 5.000000 0.000000 X( A1, B4) 2.000000 0.000000
14、 X( A2, B1) 3.000000 0.000000 X( A2, B2) 0.000000 2.000000 X( A2, B3) 0.000000 1.000000 X( A2, B4) 1.000000 0.000000 X( A3, B1) 0.000000 9.000000 X( A3, B2) 6.000000 0.000000 X( A3, B3) 0.000000 12.00000 X( A3, B4) 3.000000 0.000000 Row Slack or Surplus Dual Price 1 85.00000 -1.000000 2 0.000000 -3.
15、000000 3 0.000000 -1.000000 4 0.000000 2.000000 5 0.000000 0.000000 6 0.000000 -6.000000 7 0.000000 0.000000 8 0.000000 -7.000000 实验三、整数规划数学模型的求解一、实验目的与要求 掌握整数规划数学模型的计算机求解二、实验原理 LINGO中求解整数规划或0-1规划,只需要在一个线性规划的代码或程序中添加整数约束,x1为整数可用gin(x1) 表示,x2为0-1变量可用bin(x2)表示。三、主要仪器设备安装了Windows、lingo软件的计算机。四、实验内容与步骤
16、1、 例 求解下面混合整数规划min z=-3x1+4x2-2x3+5x4;4x1-x2+2x3-x4=-2;x1+x2+3x3-x414;-2x1+3x2-x3+2x42;x1为整数,x2=0或1,x30,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(3);!自由变量;gin(x(1);bi
17、n(x(2);free(x(4);!指定常量的值;data:c=-3 4 -2 5;b=-2 14 2;a=4 -1 2 -1 1 1 3 -1 -2 3 -1 2;end data!结束;End3、求解可得解报告:Global optimal solution found. Objective value: 9.000000 Extended solver steps: 0 Total solver iterations: 0 Variable Value Reduced Cost B( 1) -2.000000 0.000000 B( 2) 14.00000 0.000000 B( 3)
18、2.000000 0.000000 C( 1) -3.000000 0.000000 C( 2) 4.000000 0.000000 C( 3) -2.000000 0.000000 C( 4) 5.000000 0.000000 X( 1) 0.000000 17.00000 X( 2) 1.000000 -1.000000 X( 3) 0.000000 8.000000 X( 4) 1.000000 0.000000 A( 1, 1) 4.000000 0.000000 A( 1, 2) -1.000000 0.000000 A( 1, 3) 2.000000 0.000000 A( 1,
19、 4) -1.000000 0.000000 A( 2, 1) 1.000000 0.000000 A( 2, 2) 1.000000 0.000000 A( 2, 3) 3.000000 0.000000 A( 2, 4) -1.000000 0.000000 A( 3, 1) -2.000000 0.000000 A( 3, 2) 3.000000 0.000000 A( 3, 3) -1.000000 0.000000 A( 3, 4) 2.000000 0.000000 Row Slack or Surplus Dual Price 1 9.000000 -1.000000 2 0.0
20、00000 5.000000 3 14.00000 0.000000 4 3.000000 0.000000实验四、指派问题的计算机求解一、实验目的与要求 掌握指派问题的计算机求解,要求会用lingo软件编程求解。二、实验原理指派问题的数学模型实质就是一个特殊的运输问题,产地个数和销地个数相同,每个产地的产量和每个销地的销量都是1个单位,变量也都为0-1变量。三、主要仪器设备安装了Windows、lingo软件的计算机。四、实验内容与步骤1、用运输问题的数学模型求解一个指派问题2、编写程序并输入model: !7个工人,7个工作的分配问题;sets: workers/w1.w7/; jobs/
21、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= 6 2 6 7 4 2 5 4 9 5 3 8 5 8 5 2 1 9 7 4 3 7 6 7 3 9 2 7 2 3 9 5 7 2 6 5 5 2 2 8 11 4 9 2 3 12 4 5 10;enddataend3、输出结果