lingo解决线性规划问题的程序(经典).pdf
《lingo解决线性规划问题的程序(经典).pdf》由会员分享,可在线阅读,更多相关《lingo解决线性规划问题的程序(经典).pdf(24页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 1 Lingo12 软件培训教案 Lingo 主要用于求解线性规划,整数规划,非线性规划,V10 以上版本可编程。例 1 一个简单的线性规划问题 0 ,600 2 100 350 st.3 2max yxyxxyxyxz !源程序 max=2*x+3*y;st_1 x+y350;st_2 x100;2*x+y600;!决策变量黙认为非负;相当于=;大小写不区分 当规划问题的规模很大时,需要定义数组(或称为矩阵),以及下标集(set)下面定义下标集和对应数组的三种方法,效果相同::r1=r2=r3,a=b=c.sets:r1/1.3/:a;r2:b;r3:c;link2(r1,r2):x;li
2、nk3(r1,r2,r3):y;endsets 2 data:ALPHA=;a=11 12 13;r2=1.3;b=11 12 13;c=11 12 13;enddata 例2 运输问题 计算 6 个发点 8 个收点的最小费用运输问题。产销单位运价如下表。B1 B2 B3 B4 B5 B6 B7 B8 产量 A1 6 2 6 7 4 2 5 9 60 A2 4 9 5 3 8 5 8 2 55 A3 5 2 1 9 7 4 3 3 51 A4 7 6 7 3 9 2 7 1 43 A5 2 3 9 5 7 2 6 5 41 A6 5 5 2 2 8 1 4 3 52 销量 35 37 22 3
3、2 41 32 43 38 解:设决策变量ijx=第 i 个发点到第 j 个售点的运货量,i=1,2,m;j=1,2,n;记为ijc=第i个发点到第j个售点的运输单价,i=1,2,m;j=1,2,n 记is=第i个发点的产量,i=1,2,m;记jd=第j个售点的需求量,j=1,2,n.其中,m=6;n=8.设目标函数为总成本,约束条件为(1)产量约束;(2)需求约束。3 于是形成如下规划问题:njmixnjdxmisxxcijjniijimjijminjijij,.,2,1,.,2,1,0 ,.,2,1,.,2,1,st.zmin 1111 把 上 述 程 序 翻 译 成L I N G O 语
4、 言,编 制 程 序 如 下:!源程序 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 5 4 9 5 3 8 5 8 2 5 2 1 9 7 4 3 3 7 6 7 3 9 2 7 1 4 2 3 9 5 7 2 6 5 5 5 2 2 8 1 4 3;enddata!-;min=sum(li
5、nks: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 4
6、3 38;c=6 2 6 7 4 2 9 5 4 9 5 3 8 5 8 2 5 2 1 9 7 4 3 3 5 7 6 7 3 9 2 7 1 2 3 9 5 7 2 6 5 5 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)d(j);!需求约束;endsubmodel!=;calc:solve(transfer);!运行子模块(解线性规划);divert();!向.txt文件按自定格式输出数据;
7、write(最小运输成本=,cost,newline(1),最优运输方案x=);for(rows(i):write(newline(1);writefor(cols(j):,format(x(i,j),);divert();!关闭输出文件;endcalc end 打开文件,内容为:最小运输成本=664 6 最优运输方案 x=0 19 0 0 41 0 0 0 1 0 0 32 0 0 0 0 0 11 0 0 0 0 40 0 0 0 0 0 0 5 0 38 34 7 0 0 0 0 0 0 0 0 22 0 0 27 3 0 例 4 data 段的编写技巧(1):从 txt 文件中读取原始
8、数据 !源程序中的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 6 7 4 2 9 5 4 9 5 3 8 5 8 2 5 2 1 9 7 4 3 3 7 6 7 3 9 2 7 1 7 2 3 9 5 7 2 6 5 5 5 2 2 8 1 4 3 !注:字符是数据分割符,若无此符,视所有数据为一个数据块,只赋给一个变量;例5 lingo 程序的的 3 种输入和 3
9、 种输出方法;!的源程序;sets:rows/1.3/:;cols/1.4/:;link(rows,cols):a,b,mat1,mat2;endsets data:b=1,2,3,4 5,6,7,8 9,10,11,12;!程序内输入;a=file();!外部txt文件输入;mat1=ole(d:lingo12,mat1);!EXcel文件输入;enddata calc:text()=a;!列向量形式输出数据;for(link:mat2=2*mat1);ole(d:lingo12)=mat2;!把mat2输出到xls文件中的同名数据块;!向.txt文件按自定格式输出数据(参照前例);Endc
10、alc 8 例 6 程序段中的循环和选择结构举例!的源程序;sets:rows/1.5/:;cols/1.3/:;links(rows,cols):d;endsets data:d=0 2 3 4 3 2 1 3 2 4 7 2 2 1 6;enddata calc: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);else delta=b2-4*a*c;sqrt=sqrt(if(delta#ge#0,delta,-delta);ifc(delta#ge#0:write(x1=
11、,(-b+sqrt)/2/a,x2=,(-b-sqrt)/2/a,newline(1);9 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 任务费用最小)B1 B2 B3 B4 B5 B6 A1 6 2 6 7 4 2 A2 4 9 5 3 8 5 A3 5 2 1 9 7 4 A4 7 6 7 3 9 2 A5 2 3 9 5 7 2 A6 5 5 2 2 8 1
12、 解:设决策变量ijx=1 或 0,表示第 i 个人是否完成第 j 项任务,i,j=1,2,n;记ijc=第i个人完成第j项任务的费用,i,j=1,2,n;n=6.设目标函数为总费用,约束条件为(1)每人只完成一项任务;(2)每项任务只由一人完成。于是形成如下规划问题:10 njnixnjxnixxcijniijnjijninjijij,.,2,1,.,2,1,10 ,.,2,1,1 ,.,2,1,1 st.zmin 1111或 !的源程序;model:!6人6任务指派问题;sets:rows/1.6/:;!6人6任务;links(rows,rows):c,x;!费用和决策变量;endsets
13、 !-;data:c=6 2 6 7 4 2 4 9 5 3 8 5 5 2 1 9 7 4 7 6 7 3 9 2 2 3 9 5 7 2 5 5 2 2 8 1;enddata!=;submodel appointment:min =cost;!目标函数极小化;cost=sum(links:c*x);!目标函数:总费用;11 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变量约束;endsubmodel submodel
14、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();!关闭输出文件;endcalc end 例8 多目标规划转化为单目标规划问题举例 把上述运输问题稍加修改,考虑到运输量可以要取整数,就变成整
15、数规划问题,而且运输问题除了成本最小一个目标以外,有时也要考虑各发点的运输量尽量均衡作为另一个目标。本程序处理的方法一是两目标加权平均,方法二是只选一个目标,另一个目标转化为约束,从而把多目标改为单目标。12!源程序;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 5 4 9 5 3 8 5 8
16、2 5 2 1 9 7 4 3 3 7 6 7 3 9 2 7 1 2 3 9 5 7 2 6 5 5 5 2 2 8 1 4 3;enddata!=;submodel obj_1:min=minCost;!目标函数极小化;minCost=sum(links:c*x);!目标函数:运输总成本;endsubmodel submodel obj_2:min=objValue;objValue=*obj1+*obj2;!二目标加权平均;obj1=sum(links:c*x);!目标函数1:运输总成本;13 obj2=max1-min1;!目标函数2:发点运输量极差;for(links(i,j):su
17、m(cols(j):x(i,j)min1;);endsubmodel submodel obj_3:min=obj2;obj2=max1-min1;!目标函数:发点运输量极差;for(links(i,j):sum(cols(j):x(i,j)min1;);cost1=sum(links:c*x);!运输总成本;cost1 *minCost;!运输总成本约束;endsubmodel submodel subject_to_1:for(rows(i):sum(cols(j):x(i,j)d(j);!需求约束;endsubmodel submodel subject_to_2:for(links:g
18、in(x);!整数约束;endsubmodel !=;calc:solve(obj_1,subject_to_1,subject_to_2);!运行子模块(解线性整 14 数规划);divert();write(newline(2),整数规划的最小运输成本=,minCost,newline(1),最优运输方案x=);for(rows(i):write(newline(1);writefor(cols(j):,format(x(i,j),);divert();pause();solve(obj_2,subject_to_1,subject_to_2);!运行子模块(解线性整数规划);divert
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- lingo 解决 线性规划 问题 程序 经典
限制150内