LINGO数学规划软件二、Lingo基本语法1、定义了目标函数为min=..max=..2、以一个分号“;”结尾——除sets,endsets,data,enddata,end之外3、表达式可以放在约束条件的右端,同时数字也可放在约束条件的左端。4、假定各变量非负。5、注释:“!”6、、为≤、≥7、不区分大小写制订生产计划,使每天获利最大1桶牛奶3公斤A112小时8小时4公斤A2或获利24元/公斤获利16元/公斤50桶牛奶时间480小时至多加工100公斤A1每天:例1:加工奶制品的生产计划1桶牛奶3公斤A112小时8小时4公斤A2或获利24元/公斤获利16元/公斤x1桶牛奶生产A1x2桶牛奶生产A2获利24×3x1获利16×4x2原料供应5021xx劳动时间48081221xx加工能力10031x决策变量目标函数216472xxzMax每天获利约束条件非负约束0,21xx时间480小时至多加工100公斤A150桶牛奶每天模型求解代码:max=72*x1+64*x2;x1+x250;12*x1+8*x2480;3*x1=100;1212121127264.501284803100,0Maxzxxstxxxxxxx20桶牛奶生产A130桶生产A2利润3360元结果Objectivevalue:3360.000VariableValueReducedCostX120.000000.000000X230.000000.000000RowSlackorSurplusDualPrice13360.0001.00000020.00000048.0000030.0000002.000000440.000000.000000reducedcost值表示当该非基变量增加一个单位时(其他非基变量保持不变)目标函数减少的量(对max型问题)Objectivevalue:3360.000VariableValueReducedCostX120.000000.000000X230.000000.000000RowSlackorSurplusDualPrice13360.0001.00000020.00000048.0000030.0000002.000000440.000000.000000也可理解为:为了使该非基变量变成基变量,目标函数中对应系数应增加的量结果Objectivevalue:3360.000VariableValueReducedCostX120.000000.000000X230.000000.000000RowSlackorSurplusDualPrice13360.0001.00000020.00000048.0000030.0000002.000000440.000000.000000原料无剩余时间无剩余加工能力剩余40max72x1+64x2st2)x1+x2503)12x1+8x24804)3x1100end三种资源“资源”剩余为零的约束为紧约束(有效约束)结果解释Objectivevalue:3360.000VariableValueReducedCostX120.000000.000000X230.000000.000000RowSlackorSurplusDualPrice13360.0001.00000020.00000048.0000030.0000002.000000440.000000.000000最优解下“资源”增加1单位时“效益”的增量原料增1单位,利润增48时间加1单位,利润增2能力增减不影响利润影子价格结果解释练习1、求解线性规划2、求解非线性规划0,,501024020233022)532min(zyxzyxzyxzyxzyx222min(4)(12)fxyx练习题代码练习1:min=2*x+3*y+5*z;x+2*y+2*z=30;3*x+y+2*z=20;2*x+y+10=40;2*x+y+10=50;练习2:min=(x^2-4*y)^2+(1-2*x)^2;逻辑运算符#NOT#否定#EQ#相等#NE#不等#AND#并且#OR#或者#GT#大于#GE#大于等于#LT#小于#LE#小于等于算术运算符+-*/^关系运算符(=)=(=)三、Lingo运算符和函数1、运算符及其优先级运算符的优先级最高——————————————最低#NOT#—(负号)^*/+—(减法)#EQ##NE##GT##GE##LT##LE##AND##OR#=先左后右先括号内,后括号外Lingo内部函数——”@”注:三角函数中变量为弧度制@ABS(X)返回x的绝对值@SIN(X)返回x的正弦值。@COS(X)返回x的余弦值@TAN(X)返回x的正切值@SIGN(X)如果x0返回-1;否则,返回1@EXP(X)返回常数e的x次方@SMAX(一组数)返回这组数中的最大值@LOG(X)返回x的自然对数@SMIN(一组数)返回这组数中的最小值2、Lingo基本数学函数@GIN(X)整数变量@BIN(X)0-1变量@FREE(X)自由变量@BND(L,X,N)[L,U]3、Lingo变量定界函数分段函数@IF(logical_condition,true_result,false_result)4、Lingo条件判断函数5、Lingo集合循环函数@function(setname[(set_index_list)[|conditional_qualifier]]:expression_list);对数据集合进行操作例2min=1.4*x1+7.0*x2+0.9*x3+6*x4+3*x5+4.1*x6;6.1*x1+8.4*x2+0.9*x3+8.5*x4+4.8*x5+2.3*x6=31.82;x6=x4+0.1;x3=@if(x5#gt#0,x5-0.2,x1+0.4);x4=@if(x6#gt#0,x6-0.1,x4);@bnd(-5,x1,5);@bnd(0,x3,1.3);@free(x2);练习3、求解数学规划min(235)22303220402101001,3,6,0xyzxyzxyzxyzifxzelsezxy练习4min=2*x+3*y+5*z;x+2*y+2*z=30;3*x+y+2*z=20;2*x+y+10*z=40;2*x+y+10*z=100;z=@if(x#ge#1,-3,6);构成:4个段目标与约束段集合段(setsendsets)数据段(dataenddata)初始段(initendinit)(计算段)四、Lingo建模语言例4.1:可以定义一个名为students的原始集,它具有成员John、Jill、Rose和Mike,属性有sex和age:sets:students/JohnJill,RoseMike/:sex,age;endsets一、集合段(setsendsets)可以把集、集成员和集属性同C语言中的结构体作个类比。如下图:集←→结构体集成员←→结构体的域相当于下标集属性←→结构体元素二、数据段(setsendsets)sets:students/John,Jill,Rose,Mike/:sex,age;endsetsdata:sex,age=116014014113;enddata!此处无分号例4.2:将上述定义的集合赋值,其中性别1表示男,0表示女三、初始段(initendinit)4.3、初始段和数据段区别:数据段是对常量进行初始化,而初始段是对变量选择一个初值,一个好的初始点会减少模型求解的时间。init:x,y=0,.1;!对于变量初值未知,可省略endinitmax=x+y;x^2+y^2=1;四、Lingo集合循环函数---@sum@sum:该函数返回遍历指定的集成员的一个表达式的和。例4.4求向量[5,1,3,4,6,10]前5个数的和。题目分析:1.建立数组用于存储数据(sets)2.数组元素初始化(data)3.求数组前5个元素的和(@sum)sets:a/1..6/:num;endsetsdata:num=5,1,3,4,6,10;enddatasun=@sum(a(i)|i#le#5:num);五、Lingo集合循环函数---@for@for:该函数用来产生对集成员的约束。基于建模语言的标量需要显式输入每个约束,不过@for函数允许只输入一个约束,然后LINGO自动产生每个集成员的约束。例4.5产生序列{1,4,9,16,25}sets:a/1..5/:num;endsets@for(a(i):num=i^2);六、Lingo集合循环函数---@max,@min例4.12求向量[5,1,3,4,6,10]前5个数的最小值,后3个数的最大值。题目分析:1.建立数组用于存储数据(sets)2.数组元素初始化(data)3.分析题目要求,选择好循环的位置sets:a/1..6/:num;endsetsdata:num=5,1,3,4,6,10;enddataminv=@min(a(i)|i#le#5:num);maxv=@max(a(i)|i#ge#4:num);某公司有6个建筑工地,位置坐标为(ai,bi)(单位:公里),水泥日用量di(单位:吨)假设:料场和工地之间有直线道路(1)现有2料场,位于A(5,1),B(2,7),记(xj,yj),j=1,2,日储量ej各有20吨。制定每天的供应计划:即从A,B两料场分别向各工地运送多少吨水泥,使总的吨公里数最小。i123456a28.750.55.7537.25b30.754.7556.57.75d1.25547611例3选址问题决策目标约束解:决策变量:料场j到工地i的运量——cij——2维数组线性规划模型?lingo——表达式?26221/2112161min[()()].,1,...,6,1,20,1,...,6,1,2ijjijijiijijijjiijcxaybstcdicejcij目标:吨公里约束:需求供应sets:demand/1..6/:a,b,d;supply/1..2/:x,y,e;link(demand,supply):c;endsetsdata:a=1.25,8.75,0.5,5.75,3,7.25;b=1.25,0.75,4.75,5,6.5,7.75;d=3,5,4,7,6,11;e=20,20;x,y=5,1,2,7;enddatainit:endinitmin=@sum(link(i,j):c(i,j)*((x(j)-a(i))^2+(y(j)-b(i))^2)^(1/2));@for(demand(i):@sum(supply(j):c(i,j))=d(i););@for(supply(i):@sum(demand(j):c(j,i))=e(i););END练习5、使用集合循环函数求解105111015151max()100200:()150,0ijijijiijjiiiijaxyxystxyxy1051256710()464750ija其中练习5:sets:a/1..10/:x;b/1..5/:y;link(a,b):c;endsets@for(link(i,j):c(i,j)=(i-1)*5+j);max=@sum(link(i,j):c(i,j)*(x(i)+y(j)));@sum(a(i):x)=100;@sum(b(i):y)=200;@sum(b(i):x(i)+y(i))=150;界面主窗口模型窗口ModelWindow状态栏当前时间当前光标位置五、Lingo的菜单及对话框1、L