![lingo解决线性规划问题的程序(经典)_第1页](http://file4.renrendoc.com/view11/M03/39/3D/wKhkGWV9KnWAZwQRAAHANgTVqmQ768.jpg)
![lingo解决线性规划问题的程序(经典)_第2页](http://file4.renrendoc.com/view11/M03/39/3D/wKhkGWV9KnWAZwQRAAHANgTVqmQ7682.jpg)
![lingo解决线性规划问题的程序(经典)_第3页](http://file4.renrendoc.com/view11/M03/39/3D/wKhkGWV9KnWAZwQRAAHANgTVqmQ7683.jpg)
![lingo解决线性规划问题的程序(经典)_第4页](http://file4.renrendoc.com/view11/M03/39/3D/wKhkGWV9KnWAZwQRAAHANgTVqmQ7684.jpg)
![lingo解决线性规划问题的程序(经典)_第5页](http://file4.renrendoc.com/view11/M03/39/3D/wKhkGWV9KnWAZwQRAAHANgTVqmQ7685.jpg)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
./Lingo12软件培训教案Lingo主要用于求解线性规划,整数规划,非线性规划,V10以上版本可编程。例1一个简单的线性规划问题!exam_1.lg4源程序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=0.7;a=111213;r2=1..3;b=111213;c=111213;enddata运输问题计算6个发点8个收点的最小费用运输问题。产销单位运价如下表。B1B2B3B4B5B6B7B8产量A16267425960A24953858255A35219743351A47673927143A52395726541A65522814352销量3537223241324338解:设决策变量=第i个发点到第j个售点的运货量,i=1,2,…m;j=1,2,…n;记为=第i个发点到第j个售点的运输单价,i=1,2,…m;j=1,2,…n记=第i个发点的产量,i=1,2,…m;记=第j个售点的需求量,j=1,2,…n.其中,m=6;n=8.设目标函数为总成本,约束条件为〔1产量约束;〔2需求约束。于是形成如下规划问题:把上述程序翻译成LINGO语言,编制程序如下:!exam_2.lg4源程序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=3537223241324338; c=62674295 49538582 52197433 76739271 23957265 55228143;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把上述程序进行改进,引进运行子模块和打印运算结果的语句:!exam_3.lg4源程序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=3537223241324338; c=62674295 49538582 52197433 76739271 23957265 55228143;enddata!==================================;submodeltransfer: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<'transfer_out.txt'>;!向.txt文件按自定格式输出数据;write<'最小运输成本=',cost,newline<1>,'最优运输方案x='>;for<rows<i>:write<newline<1>>;writefor<cols<j>:'',format<x<i,j>,'3.0f'>>>;divert<>;!关闭输出文件;endcalcend打开transfer_out.txt文件,容为:最小运输成本=664最优运输方案x=019004100010032000001100004000000050383470000000022002730例4data段的编写技巧〔1:从txt文件中读取原始数据!exam_3.lg4源程序中的data也可以写为:data: s=file<'transfer_data.txt'>; d=file<'transfer_data.txt'>; c=file<'transfer_data.txt'>;enddata其中,transfer_data.txt的容为:!transfer.lg4程序的数据;!产量约束s=;60,55,51,43,41,52~!需求约束d=; 3537223241324338~!运输单价c=;626742954953858252197433767392712395726555228143~!注:字符~是数据分割符,若无此符,视所有数据为一个数据块,只赋给一个变量;lingo程序的的3种输入和3种输出方法;!exam_5.lg4的源程序;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<'a.txt'>;!外部txt文件输入;mat1=ole<'d:\lingo12\data.xls',mat1>;!EXcel文件输入;enddatacalc:text<'a_out.txt'>=a;!列向量形式输出数据;for<link:mat2=2*mat1>;ole<'d:\lingo12\data.xls'>=mat2;!把mat2输出到xls文件中的同名数据块;!向.txt文件按自定格式输出数据<参照前例>;Endcalc例6程序段中的循环和选择结构举例!exam_6.lg4的源程序;sets:rows/1..5/:;cols/1..3/:;links<rows,cols>:d;endsetsdata:d=023432132472216;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>>;elsewrite<'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>:程序体>;进行计算。指派问题〔n人n任务费用最小B1B2B3B4B5B6A1626742A2495385A3521974A4767392A5239572A6552281解:设决策变量=1或0,表示第i个人是否完成第j项任务,i,j=1,2,…n;记=第i个人完成第j项任务的费用,i,j=1,2,…n;n=6.设目标函数为总费用,约束条件为〔1每人只完成一项任务;〔2每项任务只由一人完成。于是形成如下规划问题:!exam_7.lg4的源程序;model:!6人6任务指派问题;sets:rows/1..6/:;!6人6任务;links<rows,rows>:c,x;!费用和决策变量;endsets!;data: c=626742 495385 521974 767392 239572 552281;enddata!==================================;submodelappointment: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变量约束;endsubmodelsubmodelbinVar:for<links:bin<x>>;!0-1变量约束;endsubmodel!==================================;calc:solve<appointment,binVar>;!运行子模块〔解线性规划;divert<'appointment_out.txt'>;!向.txt文件按自定格式输出数据;write<'最小指派费用=',cost,newline<1>,'分配方案x='>;for<rows<i>:write<newline<1>>;writefor<rows<j>:'',format<x<i,j>,'3.0f'>>>;divert<>;!关闭输出文件;endcalcend多目标规划转化为单目标规划问题举例把上述运输问题稍加修改,考虑到运输量可以要取整数,就变成整数规划问题,而且运输问题除了成本最小一个目标以外,有时也要考虑各发点的运输量尽量均衡作为另一个目标。本程序处理的方法一是两目标加权平均,方法二是只选一个目标,另一个目标转化为约束,从而把多目标改为单目标。!exam_8.lg4源程序;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=3537223241324338; c=62674295 49538582 52197433 76739271 23957265 55228143;enddata!==================================;submodelobj_1:min=minCost;!目标函数极小化; minCost=sum<links:c*x>;!目标函数:运输总成本;endsubmodelsubmodelobj_2:min=objValue;objValue=0.4*obj1+0.6*obj2;!二目标加权平均; obj1=sum<links:c*x>;!目标函数1:运输总成本;obj2=max1-min1;!目标函数2:发点运输量极差;for<links<i,j>:sum<cols<j>:x<i,j>><max1;sum<cols<j>:x<i,j>>>min1;>;endsubmodelsubmodelobj_3:min=obj2;obj2=max1-min1;!目标函数:发点运输量极差;for<links<i,j>:sum<cols<j>:x<i,j>><max1;sum<cols<j>:x<i,j>>>min1;>;cost1=sum<links:c*x>;!运输总成本;cost1<1.05*minCost;!运输总成本约束;endsubmodelsubmodelsubject_to_1:for<rows<i>:sum<cols<j>:x<i,j>><s<i>>;!产量约束;for<cols<j>:sum<rows<i>:x<i,j>>>d<j>>; !需求约束;endsubmodelsubmodelsubject_to_2: for<links:gin<x>>;!整数约束;endsubmodel!==================================;calc:solve<obj_1,subject_to_1,subject_to_2>;!运行子模块〔解线性整数规划;divert<'intModel_out.txt'>;write<newline<2>,'整数规划的最小运输成本=',minCost,newline<1>,'最优运输方案x='>;for<rows<i>:write<newline<1>>;writefor<cols<j>:'',format<x<i,j>,'3.0f'>>>;divert<>;pause<>;solve<obj_2,subject_to_1,subject_to_2>;!运行子模块〔解线性整数规划;divert<'intModel_out.txt','a'>;!向.txt文件追加输出数据;write<newline<2>,'二目标加权平均最小值=',objValue,newline<1>,'最优运输方案x='>;for<rows<i>:write<newline<1>>;writefor<cols<j>:'',format<x<i,j>,'3.0f'>>>;divert<>;pause<>;solve<obj_3,subject_to_1,subject_to_2>;!运行子模块〔解线性整数规划;divert<'intModel_out.txt','a'>;!向.txt文件追加输出数据;write<newline<2>,'成本约束时极差最小值=',obj2,newline<1>,'成本约束时运输量最平均方案x='>;for<rows<i>:write<newline<1>>;writefor<cols<j>:'',format<x<i,j>,'3.0f'>>>;divert<>;endcalcend本例中的运输量均衡指标,可以用方差表示,但变成非线性规划问题,只能求出局部最优解,而线性规划的最优解是全局最优解。杂例1model:!费波那契数列;!exam_9.lg4源程序;sets:II/1..100/:Fi;!费波那契数列;endsets!==================================;submodelmyProc:Fi<1>=1;Fi<2>=1;for<II<i>|<i#ge#3>#and#<i#le#n>:Fi<i>=Fi<i-1>+Fi<i-2>>;endsubmodel!==================================;calc:n=10;solve<myProc>;divert<'Fibo_out.txt'>;writefor<II<k>|k#le#n:'Fi<',format<k,'2.0f'>,'>=',format<Fi<k>,'3.0f'>,newline<1>>;divert<>;endcalcend杂例2sets:II/1..3/:;links<II,II>:a,x;endsetsdata:a=1,2,32,1,43,2,2;enddatasubmodelfMin:!求函数的极值,极小值点;min=z^2+4*z+3;free<z>;endsubmodelsubmodelfzero:!解方程,求函数的零点;cos<y>=y;bnd<0,y,5>;endsubmodelsubmodelget_invMat:!解矩阵方程,求逆阵;for<II<i>:for<II<j>:sum<II<k>:a<i,k>*x<k,j>>=if<i#eq#j,1,0>>>;for<links:free<x>>;endsubmodelcalc:solve<fMin>;solve<fzero>;solve<get_invMat>;endcalcLingo编程语言参考:LINGO有9种类型的函数:1.基本运算符:包括算术运算符、逻辑运算符和关系运算符2.数学函数:三角函数和常规的数学函数3.金融函数:LINGO提供的两种金融函数4.概率函数:LINGO提供了大量概率相关的函数5.变量界定函数:这类函数用来定义变量的取值围6.集操作函数:这类函数为对集的操作提供帮助7.集循环函数:遍历集的元素,执行一定的操作的函数8.数据输入输出函数:允许模型和外部数据源相联系,进行数据输入输出9.辅助函数:各种杂类函数1.基本运算符1.1算术运算符^、﹡、/、﹢、﹣1.2逻辑运算符:#not#否定该操作数的逻辑值,#not#是一个一元运算符#eq#若两个运算数相等,则为true;否则为flase#ne#若两个运算符不相等,则为true;否则为flase#gt#若左边的运算符严格大于右边的运算符,则为true;否则为flase#ge#若左边的运算符大于或等于右边的运算符,则为true;否则为flase#lt#若左边的运算符严格小于右边的运算符,则为true;否则为flase#le#若左边的运算符小于或等于右边的运算符,则为true;否则为flase#and#仅当两个参数都为true时,结果为true;否则为flase#or#仅当两个参数都为false时,结果为false;否则为true1.3关系运算符"="、"<="和">=",LINGO中还能用"<"表示小于等于关系,2.2数学函数三角函数sin<x>,sinh<x>,asin<x>,asinh<x>,cos<x>,cosh<x>,acos<x>,acosh<x>,tan<x>,tanh<x>,atan<x>,atanh<x>,atan2<x>abs<x>返回x的绝对值exp<x>返回常数e的x次方floor<x>返回去掉小数部分后的整数log<x>返回x的自然对数log10<x>返回x的以10为底的对数lgm<x>返回x的gamma函数的自然对数mod<m,n>返回用n整除m的余数.,如mod<5,3>返回2;pi<>返回圆周率pow<x,y>返回x的y次幂sign<x>如果x<0返回-1;否则,返回1smax<x1,x2,…,xn>返回x1,x2,…,xn中的最大值smin<x1,x2,…,xn>返回x1,x2,…,xn中的最小值sqr<x>返回x的平方.sqrt<x>返回x的平方根.2.3金融函数fpa<I,n>返回如下情形的净现值:单位时段利率为I,连续n个时段支付,每个时段支付单位费用。若每个时段支付x单位的费用,则净现值可用x乘以fpa<I,n>算得。fpl<I,n>返回如下情形的净现值:单位时段利率为I,第n个时段支付单位费用。2.4概率函数norminv<p,mu,sigma>N<mu,sigma^2>分布函数的反函数norminv<p,mu,sigma>N<0,1>分布函数的反函数pbn<p,n,x>二项分布的累积分布函数。当n和〔或x不是整数时,用线性插值法进行计算。pcx<n,x>自由度为n的χ2分布的累积分布函数。peb<a,x>当到达负荷为a,服务系统有x个服务器且允许无穷排队时的Erlang繁忙概率。pel<a,x>当到达负荷为a,服务系统有x个服务器且不允许排队时的Erlang繁忙概率。pfd<n,d,x>自由度为n和d的F分布的累积分布函数。pfs<a,x,c>当负荷上限为a,顾客数为c,平行服务器数量为x时,有限源的Poisson服务系统的等待或返修顾客数的期望值。a是顾客数乘以平均服务时间,再除以平均返修时间。〔或x不是整数时,采用线性插值进行计算。phg<pop,g,n,x>超几何〔Hypergeometric分布的累积分布函数。pop表示产品总数,g是正品数。从所有产品中任意取出n〔n≤pop件。pop,g,n和x都可以是非整数,这时采用线性插值进行计算。ppl<a,x>Poisson分布的线性损失函数,即返回max<0,z-x>的期望值,其中随机变量z服从均值为a的Poisson分布。pps<a,x>均值为a的Poisson分布的累积分布函数。当x不是整数时,采用线性插值进行计算。psl<x>单位正态线性损失函数,即返回max<0,z-x>的期望值,其中随机变量z服从标准正态分布。psn<x>标准正态分布的累积分布函数。ptd<n,x>自由度为n的t分布的累积分布函数。qrand<seed>产生服从<0,1>区间的拟随机数。rand<seed>返回0和1间的伪随机数,2.5变量界定函数变量界定函数实现对变量取值围的附加限制,共4种:bin<x>限制x为0或1bnd<L,x,U>限制L≤x≤Ufree<x>取消对变量x的默认下界为0的限制,即x可以取任意实数gin<x>限制x为整数在默认情况下,LINGO规定变量是非负的,也就是说下界为0,上界为+∞。free取消了默认的下界为0的限制,使变量也可以取负值。bnd用于设定一个变量的上下界,它也可以取消默认下界为0的约束。semic<L,x,U>,半连续约束。约束x或者取0或者取[L,U]数据。2.6集操作函数in<set_name,primitive_index_1[,primitive_index_2,…]>如果元素在指定集中,返回1;否则返回0。index<[set_name,]primitive_set_element>该函数返回在集set_name中原始集成员primitive_set_element的索引。如果set_name被忽略,那么LINGO将返回与primitive_set_element匹配的第一个原始集成员的索引。如果找不到,则产生一个错误。wrap<index,limit>该函数返回j=index-k*limit,其中k是一个整数,取适当值保证j落在区间[1,limit]。该函数相当于index模limit再加1。该函数在循环、多阶段计划编制中特别有用。size<set_name>该函数返回集set_name的成员个数。在模型中明确给出集大小时最好使用该函数。它的使用使模型更加数据中立,集大小改变时也更易维护。2.7集循环函数集循环函数遍历整个集进行操作。其语法为function<setname[<set_index_list>[|conditional_qualifier]]:expression_list>;function相应于下面罗列的五个集循环函数之一;setname是要遍历的集;set_index_list是集索引列表;conditional_qualifier是用来限制集循环函数的围,当集循环函数遍历集的每个成员时,LINGO都要对conditional_qualifier进行评价,若结果为真,则对该成员执行function操作,否则跳过,继续执行下一次循环。expression_list是被应用到每个集成员的表达式列表,当用的是for函数时,expression_list可以包含多个表达式,其间用逗号隔开。这些表达式将被作为约束加到模型中。当使用其余的三个集循环函数时,expression_list只能有一个表达式。如果省略set_index_list,那么在expression_list中引用的所有属性的类型都是setname集。for该函数用来产生对集成员的约束。基于建模语言的标量需要显式输入每个约束,不过for函数允许只输入一个约束,然后LINGO自动产生每个集成员的约束。sum该函数
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年机车空调电源整机测试仪项目可行性研究报告
- 2025年室内型温度传感器/变送器项目可行性研究报告
- 2025至2031年中国刚性防水干混砂浆行业投资前景及策略咨询研究报告
- 2025年冲浪板项目可行性研究报告
- 2025年上嘴过滤瓶项目可行性研究报告
- 2025至2030年高光水性高耐磨上光油项目投资价值分析报告
- 2025至2030年金属瓷牙项目投资价值分析报告
- 2025至2030年耐磨高锰钢轧臼壁项目投资价值分析报告
- 2025至2030年中国芝麻磨浆机数据监测研究报告
- 2025至2030年中国羊胎素数据监测研究报告
- 湘科版科学(2017)五年级下册全册教案
- GB/T 22751-2008台球桌
- GB/T 13234-2009企业节能量计算方法
- GB/T 10781.2-2006清香型白酒
- 易经中的人生智慧-职业生涯规划与个人发展课件
- ABAP开发培训经典入门课件
- 北邮工程数学作业1-4
- 广东省紧密型县域医共体双向转诊管理中心运行指南
- PEP人教版小学英语单词卡片四年级下卡片
- 新部编版六年级下册道德与法治全册教案(教学设计)
- 小学英语六年级上册Unit1-The-king’s-new-clothes-第1课时课件
评论
0/150
提交评论