当前位置:文档之家› lingo解决线性规划问题的程序

lingo解决线性规划问题的程序

Lingo12软件培训教案Lingo 主要用于求解线性规划,整数规划,非线性规划,V10以上版本可编程。

例1 一个简单的线性规划问题0 ,600 2100350 st.3 2max >=<=+=<<=++=y x y x x y x y x z! 源程序max = 2*x+3*y;[st_1] x+y<350;[st_2] x<100;2*x+y<600; !决策变量黙认为非负; <相当于<=; 大小写不区分当规划问题的规模很大时,需要定义数组(或称为矩阵),以及下标集(set) 下面定义下标集和对应数组的三种方法,效果相同::r1 = r2 = r3, a = b = c.sets :r1/1..3/:a;r2 : b;r3 : c;link2(r1,r2): x;link3(r1,r2,r3): y;endsetsdata :ALPHA = ;a=11 12 13 ;r2 = 1..3;b = 11 12 13;c = 11 12 13;enddata例2 运输问题解: 设决策变量ij x = 第i 个发点到第j 个售点的运货量,i =1,2,…m; j =1,2,…n; 记为ij c =第i 个发点到第j 个售点的运输单价,i =1,2,…m;j =1,2,…n记i s =第i 个发点的产量, i =1,2,…m; 记j d =第j 个售点的需求量, j =1,2,…n. 其中,m = 6; n = 8.设目标函数为总成本,约束条件为(1)产量约束;(2)需求约束。

于是形成如下规划问题:nj m i x n j d xm i s x x c ij j n i ij i mj ij m i nj ij ij ,...,2,1,,...,2,1,0 ,...,2,1,,...,2,1, st.z min 1111==>=<==<==∑∑∑∑====把上述程序翻译成LINGO 语言,编制程序如下:! 源程序model: !6发点8收点运输问题;sets:rows/1..6/: s; !发点的产量限制;cols/1..8/: d; !售点的需求限制;links(rows,cols): c, x; !运输单价,决策运输量; endsets!-------------------------------------;data:s = 60,55,51,43,41,52;d = 35 37 22 32 41 32 43 38;c = 6 2 6 7 4 2 9 54 95 3 8 5 8 25 2 1 9 7 4 3 37 6 7 3 9 2 7 12 3 9 5 7 2 6 55 5 2 2 8 1 4 3;enddata!------------------------------------;min = @sum(links: c*x); !目标函数=运输总成本;@for(rows(i):@sum(cols(j): x(i,j))<=s(i) ); ! 产量约束;@for(cols(j):@sum(rows(i): x(i,j))=d(j) ); !需求约束;end例3把上述程序进行改进,引进运行子模块和打印运算结果的语句:! 源程序model: !6发点8收点运输问题;sets:rows/1..6/: s; !发点的产量限制;cols/1..8/: d; !售点的需求限制;links(rows,cols): c, x; !运输单价,决策运输量; endsets!==================================;data:s = 60,55,51,43,41,52;d = 35 37 22 32 41 32 43 38;c = 6 2 6 7 4 2 9 54 95 3 8 5 8 25 2 1 9 7 4 3 37 6 7 3 9 2 7 12 3 9 5 7 2 6 55 5 2 2 8 1 4 3;enddata!==================================;submodel transfer:min = cost; ! 目标函数极小化;cost = @sum(links: c*x); !目标函数:运输总成本;@for(rows(i):@sum(cols(j): x(i,j)) < s(i) ); ! 产量约束;@for(cols(j):@sum(rows(i): x(i,j)) > d(j) ); !需求约束; endsubmodel!==================================;calc:@solve(transfer); !运行子模块(解线性规划);@divert('');!向.txt文件按自定格式输出数据;@write('最小运输成本=',cost,@newline(1),'最优运输方案x=');@for(rows(i):@write(@newline(1));@writefor(cols(j): ' ',@format(x(i,j),'') ) );@divert(); !关闭输出文件;endcalcend打开文件,内容为:最小运输成本=664最优运输方案x=0 19 0 0 41 0 0 01 0 0 32 0 0 0 00 11 0 0 0 0 40 00 0 0 0 0 5 0 3834 7 0 0 0 0 0 00 0 22 0 0 27 3 0例4 data段的编写技巧(1):从txt文件中读取原始数据 ! 源程序中的data也可以写为:data:s = @file('');d = @file('');c = @file('');enddata其中,的内容为:!程序的数据;!产量约束s= ;60,55,51,43,41,52 ~!需求约束d= ;35 37 22 32 41 32 43 38 ~!运输单价c= ;6 2 67 4 2 9 54 95 3 8 5 8 25 2 1 9 7 4 3 37 6 7 3 9 2 7 12 3 9 5 7 2 6 55 5 2 2 8 1 4 3 ~!注:字符~是数据分割符,若无此符,视所有数据为一个数据块,只赋给一个变量;例5lingo程序的的3种输入和3种输出方法;!的源程序;sets:rows/1..3/: ;cols/1..4/: ;link(rows,cols): a, b, mat1, mat2;endsetsdata:b = 1,2,3,45,6,7,89,10,11,12; !程序内输入;a = @file(''); !外部txt文件输入;mat1 = @ole('d:\lingo12\',mat1); !EXcel文件输入;enddatacalc:@text('') = a; !列向量形式输出数据;@for(link: mat2 = 2*mat1);@ole('d:\lingo12\') = mat2 ;!把mat2输出到xls文件中的同名数据块;!向.txt文件按自定格式输出数据(参照前例);Endcalc例6程序段中的循环和选择结构举例!的源程序;sets:rows/1..5/:;cols/1..3/:;links(rows,cols):d;endsetsdata:d=0 2 34 3 21 3 24 7 22 1 6;enddatacalc:i=1;@while(i#le#5:a = d(i,1);b = d(i,2);c = d(i,3);@ifc(a#eq#0:@write('infeasible!',@newline(1));@elsedelta = b^2-4*a*c;sqrt = @sqrt(@if(delta#ge#0, delta,-delta));@ifc(delta#ge#0:@write('x1=',(-b+sqrt)/2/a,'x2=',(-b-sqrt)/2/a,@newline(1));@else@write('x1=',-b/2/a,'+',sqrt/2/a,'i', 'x2=',-b/2/a,'-',sqrt/2/a,'i',@newline(1));););i=i+1;);endcalc本程序中的循环结构也可以用@for(rows(i): 程序体);进行计算。

例7指派问题(n人n任务费用最小)解: 设决策变量ij x =1或0, 表示第i 个人是否完成第j 项任务,i,j =1,2,…n; 记ij c =第i 个人完成第j 项任务的费用,i,j =1,2,…n; n =6.设目标函数为总费用,约束条件为(1)每人只完成一项任务;(2)每项任务只由一人完成。

于是形成如下规划问题:nj n i x nj xn i x x c ij n i ij nj ij n i nj ij ij ,...,2,1,,...,2,1,10 ,...,2,1,1,...,2,1,1 st.z min 1111========∑∑∑∑====或 !的源程序;model : !6人6任务指派问题;sets :rows/1..6/: ; !6人6任务;links(rows,rows): c, x; !费用和决策变量;endsets!-------------------------------------;data :c = 6 2 6 7 4 24 95 3 8 55 2 1 9 7 47 6 7 3 9 22 3 9 5 7 25 5 2 2 8 1;enddata!==================================;submodel appointment:min = cost; ! 目标函数极小化;cost = @sum (links: c*x); !目标函数:总费用;@for (rows(i):@sum (rows(j): x(i,j)) = 1 ); !每人完成一项 ;@for (rows(j):@sum (rows(i): x(i,j))= 1 ); !每项由一人完成;@for(links: @bin(x)); !0-1变量约束;endsubmodelsubmodel binVar:@for(links: @bin(x)); !0-1变量约束;endsubmodel!==================================;calc:@solve(appointment,binVar); !运行子模块(解线性规划);@divert('');!向.txt文件按自定格式输出数据;@write('最小指派费用=',cost,@newline(1),'分配方案x=');@for(rows(i):@write(@newline(1));@writefor(rows(j): ' ',@format(x(i,j),'') ) );@divert(); !关闭输出文件;endcalcend例8多目标规划转化为单目标规划问题举例把上述运输问题稍加修改,考虑到运输量可以要取整数,就变成整数规划问题,而且运输问题除了成本最小一个目标以外,有时也要考虑各发点的运输量尽量均衡作为另一个目标。

相关主题