lingo解决线性规划问题的程序(经典).doc_第1页
lingo解决线性规划问题的程序(经典).doc_第2页
lingo解决线性规划问题的程序(经典).doc_第3页
lingo解决线性规划问题的程序(经典).doc_第4页
lingo解决线性规划问题的程序(经典).doc_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Lingo12软件培训教案Lingo主要用于求解线性规划,整数规划,非线性规划,V10以上版本可编程。例1 一个简单的线性规划问题!exam_1.lg4 源程序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;link3(r1,r2,r3): y;endsetsdata: ALPHA = 0.7; a=11 12 13 ; r2 = 1.3; b = 11 12 13; c = 11 12 13; enddata例2 运输问题计算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 = 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 2 3 9 5 7 2 6 5 5 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 把上述程序进行改进,引进运行子模块和打印运算结果的语句:!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 = 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 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(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(); !关闭输出文件; endcalc end 打开transfer_out.txt文件,内容为:最小运输成本=664最优运输方案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文件中读取原始数据 !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= ;35 37 22 32 41 32 43 38 !运输单价c= ;6 2 6 7 4 2 9 5 4 9 5 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 !注:字符是数据分割符,若无此符,视所有数据为一个数据块,只赋给一个变量;例5 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:lingo12data.xls,mat1); !EXcel文件输入;enddatacalc: text(a_out.txt) = a; !列向量形式输出数据; for(link: mat2 = 2*mat1); ole(d:lingo12data.xls) = mat2 ;!把mat2输出到xls文件中的同名数据块; !向.txt文件按自定格式输出数据(参照前例);Endcalc例6 程序段中的循环和选择结构举例!exam_6.lg4的源程序;sets: rows/1.5/:; cols/1.3/:; links(rows,cols):d;endsetsdata: d=0 2 3 4 3 2 1 3 2 4 7 2 2 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); else delta = b2-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任务费用最小)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 = 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); !目标函数:总费用; 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(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(); !关闭输出文件; endcalc end例8 多目标规划转化为单目标规划问题举例把上述运输问题稍加修改,考虑到运输量可以要取整数,就变成整数规划问题,而且运输问题除了成本最小一个目标以外,有时也要考虑各发点的运输量尽量均衡作为另一个目标。本程序处理的方法一是两目标加权平均,方法二是只选一个目标,另一个目标转化为约束,从而把多目标改为单目标。!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 = 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 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); !目标函数:运输总成本; endsubmodelsubmodel obj_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) min1 ; );endsubmodelsubmodel obj_3:min = obj2; obj2 = max1-min1; !目标函数:发点运输量极差;for(links(i,j): sum(cols(j): x(i,j) min1 ; ); cost1 = sum(links: c*x); !运输总成本; cost1 1.05*minCost; !运输总成本约束; endsubmodelsubmodel subject_to_1:for(rows(i): sum(cols(j): x(i,j) d(j) ); !需求约束;endsubmodelsubmodel subject_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();endcalc end本例中的运输量均衡指标,可以用方差表示,但变成非线性规划问题,只能求出局部最优解,而线性规划的最优解是全局最优解。例9 杂例1model: !费波那契数列; !exam_9.lg4 源程序;sets: II/1.100/: Fi; !费波那契数列; endsets!=;submodel myProc: 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(); endcalc end例10 杂例2sets: II/1.3/:; links(II,II):a,x;endsetsdata: a = 1,2,3 2,1,4 3,2,2;enddatasubmodel fMin: !求函数的极值,极小值点; min = z2+4*z+3; free(z);endsubmodelsubmodel fzero: !解方程,求函数的零点; cos(y) = y; bnd(0,y,5);endsubmodelsubmodel get_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;否则为true 1.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) 如果x0 返回-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,sigma2)分布函数的反函数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(npop)件。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 或1 bnd(L,x,U) 限制LxU free(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_lis t,那么在expression_list 中引用的所有属性的类型都是setname 集。for 该函数用来产生对集成员的约束。基于建模语言的标量需要显式输入每个约束,不过for 函数允许只输入一个约束,然后LINGO 自动产生每个集成员的约束。 sum 该函数返回遍历指定的集成员的一个表达式的和。 prod 该函数返回遍历指定的集成员的一个表达式的积。 min 和max 返回指定的集成员的一个表达式的最小值或最大值。 2.8 输入和输出函数 file 函数 该函数用从外部文件中输

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论