Lingo使用教程东南大学数模培训材料LINGOisacomprehensivetooldesignedtomakebuildingandsolvingLinear,Nonlinear(convex&nonconvex/Global),Quadratic,QuadraticallyConstrained,SecondOrderCone,Stochastic,andIntegeroptimizationmodelsfaster,easierandmoreefficient.LINGOprovidesacompletelyintegratedpackagethatincludesapowerfullanguageforexpressingoptimizationmodels,afullfeaturedenvironmentforbuildingandeditingproblems,andasetoffastbuilt-insolvers.TherecentlyreleasedLINGO12.0includesanumberofsignificantenhancementsandnewfeatures.LINGOprovidesallofthetoolsyouwillneedtogetupandrunningquickly.YougettheLINGOUserManual(inprintedformandavailableviatheonlineHelp),whichfullydescribesthecommandsandfeaturesoftheprogram.AlsoincludedwithsuperversionsandlargerisacopyofOptimizationModelingwithLINGO,=com_content&view=article&id=38&Itemid=24acomprehensivemodelingtextdiscussingallmajorclassesoflinear,integerandnonlinearoptimizationproblems.LINGOalsocomeswithdozensofreal-worldbasedexamplesforyoutomodifyandexpand.12minmax..0,1,,0,1,,:,ijnfxstgximhxjmfDRDR优化问题的一般形式LP,ILP,BILP,NLP,INLP,QP,IQP,PIP,ZOP1122min..,,TnfxcxstAxbAxbxDR线性规划问题LP的标准形式1122max..,,TnfxcxstAxbAxbxDRMATLAB命令:linprog,bintprog例1.如何在LINGO中求解如下的LP问题:LINGO代码:min=2*x1+3*x2;x1+x2=350;x1=100;2*x1+x2=600;121211212min()23..3501002600,0fxxxstxxxxxxx例2.如何在LINGO中求解如下的IQP问题:LINGO代码:max=98*x1+277*x2-x1^2-0.3*x1*x2-2*x2^2;x1+x2=100;x12*x2;@gin(x1);@gin(x2);22121122121212max()982770.32..1002,0fxxxxxxxstxxxxxx为整数例3。职员时序安排模型一项工作一周7天都需要有人(比如护士工作),每天(周一至周日)所需的最少职员数为20、16、13、16、19、14和12,并要求每个职员一周连续工作5天,试求每周所需最少职员数,并给出安排。注意这里我们考虑稳定后的情况。model:sets:days/mon..sun/:required,start;endsetsdata:!每天所需的最少职员数;required=20161316191412;enddata!最小化每周所需职员数;min=@sum(days:start);@for(days(J):@sum(days(I)|I#le#5:start(@wrap(J+I+2,7)))=required(J));end例2。职员时序安排模型一项工作一周7天都需要有人(比如护士工作),每天(周一至周日)所需的最少职员数为20、16、13、16、19、14和12,并要求每个职员一周连续工作5天,试求每周所需最少职员数,并给出安排。注意这里我们考虑稳定后的情况。model:sets:days/mon..sun/:required,start;endsetsdata:!每天所需的最少职员数;required=20161316191412;enddata!最小化每周所需职员数;min=@sum(days:start);@for(days(J):@sum(days(I)|I#le#5:start(@wrap(J+I+2,7)))=required(J));end最优解决方案是:每周最少需要22个职员,周一安排8人,周二安排2人,周三无需安排人,周四安排6人,周五和周六都安排3人,周日无需安排人。LINDO/LINGO软件LINGO:LinearINteractiveGeneralOptimizer(V12.0)求解数学规划问题MinZ=f(x)s.txD(Rn)需要掌握的几个重要方面基本语法结构掌握集合(SETS)的应用正确阅读求解报告正确理解求解状态窗口学会设置基本的求解选项(OPTIONS)一、Lingo基本语法1、定义了目标函数为MIN=..2、以一个分号“;”结尾——除SETS,ENDSETS,DATA,ENDDATA,END之外3、变量可以放在约束条件右端,也可放在约束条件的左端。4、默认假定各变量非负。5、注释:“!”6、、为≤、≥建模时需要注意的几个基本问题尽量使用实数优化,减少整数约束和整数变量尽量使用光滑优化,减少非光滑约束的个数尽量少使用绝对值、符号函数、多个变量求最大/最小值、四舍五入、取整函数等尽量使用线性模型,减少非线性约束和非线性变量的个数如x/y5改为x5y合理设定变量上下界,尽可能给出变量初始值模型中使用的参数数量级要适当不同参数绝对值数量级之间差距一般要求小于3LINGO函数LINGO有9种类型的函数:1.基本运算符:包括算术运算符、逻辑运算符和关系运算符2.数学函数:三角函数和常规的数学函数3.金融函数:LINGO提供的两种金融函数4.概率函数:LINGO提供了大量概率相关的函数5.变量界定函数:这类函数用来定义变量的取值范围6.集操作函数:这类函数为对集的操作提供帮助7.集循环函数:遍历集的元素,执行一定的操作的函数8.数据输入输出函数:这类函数允许模型和外部数据源相联系,进行数据的输入输出9.辅助函数:各种杂类函数过滤条件使用——结果:014.1运算符及其优先级逻辑运算符#NOT#否定#EQ#相等#NE#不等#AND#并且#OR#或者#GT#大于#GE#大于等于#LT#小于#LE#小于等于算术运算符+-*/^关系运算符(=)=(=)4.1.3关系运算符在LINGO中,关系运算符主要是被用来指定一个表达式的左边是否等于、小于等于、或者大于等于右边,形成模型的一个约束条件。关系运算符与逻辑运算符#eq#、#le#、#ge#截然不同,前者是模型中该关系运算符所指定关系的为真描述,而后者仅仅判断一个该关系是否被满足:满足为真,不满足为假。LINGO有三种关系运算符:“=”、“=”和“=”。LINGO中还能用“”表示小于等于关系,“”表示大于等于关系。LINGO并不支持严格小于和严格大于关系运算符。然而,如果需要严格小于和严格大于关系,比如让A严格小于B:AB,那么可以把它变成如下的小于等于表达式:A+ε=B,这里ε是一个小的正数,它的值依赖于模型中A小于B多少才算不等。运算符的优先级最高——————————————最低#NOT#—(负号)^*/+—(减法)#EQ##NE##GT##GE##LT##LE##AND##OR#=先左后右,先括号内,后括号外4.2数学函数LINGO提供了大量的标准数学函数:@abs(x)返回x的绝对值@sin(x)返回x的正弦值,x采用弧度制@cos(x)返回x的余弦值@tan(x)返回x的正切值@exp(x)返回常数e的x次方@log(x)返回x的自然对数@lgm(x)返回x的gamma函数的自然对数@sign(x)如果x0返回-1;否则,返回1@floor(x)返回x的整数部分。当x=0时,返回不超过x的最大整数;当x0时,返回不低于x的最大整数。@smax(x1,x2,…,xn)返回x1,x2,…,xn中的最大值@smin(x1,x2,…,xn)返回x1,x2,…,xn中的最小值Lingo内部函数——”@”4.3金融函数目前LINGO提供了两个金融函数。1.@fpa(I,n)返回如下情形的净现值:单位时段利率为I,连续n个时段支付,每个时段支付单位费用。若每个时段支付x单位的费用,则净现值可用x乘以@fpa(I,n)算得。@fpa的计算公式为.净现值就是在一定时期内为了获得一定收益在该时期初所支付的实际费用。例4.4贷款买房问题贷款金额50000元,贷款年利率5.31%,采取分期付款方式(每年年末还固定金额,直至还清)。问拟贷款10年,每年需偿还多少元?LINGO代码如下:50000=x*@fpa(.0531,10);答案是x=6573.069元。2.@fpl(I,n)返回如下情形的净现值:单位时段利率为I,第n个时段支付单位费用.@fpl(I,n)的计算公式为nI)1(4.4概率函数1.@pbn(p,n,x)二项分布的累积分布函数。当n和(或)x不是整数时,用线性插值法进行计算。2.@pcx(n,x)自由度为n的χ2分布的累积分布函数。3.@peb(a,x)当到达负荷为a,服务系统有x个服务器且允许无穷排队时的Erlang繁忙概率。4.@pel(a,x)当到达负荷为a,服务系统有x个服务器且不允许排队时的Erlang繁忙概率。5.@pfd(n,d,x)自由度为n和d的F分布的累积分布函数。6.@pfs(a,x,c)当负荷上限为a,顾客数为c,平行服务器数量为x时,有限源的Poisson服务系统的等待或返修顾客数的期望值。a是顾客数乘以平均服务时间,再除以平均返修时间。当c和(或)x不是整数时,采用线性插值进行计算。7.@phg(pop,g,n,x)超几何(Hypergeometric)分布的累积分布函数。pop表示产品总数,g是正品数。从所有产品中任意取出n(n≤pop)件。pop,g,n和x都可以是非整数,这时采用线性插值进行计算。8.@ppl(a,x)Poisson分布的线性损失函数,即返回max(0,z-x)的期望值,其中随机变量z服从均值为a的Poisson分布。9.@pps(a,x)均值为a的Poisson分布的累积分布函数。当x不是整数时,采用线性插值进行计算。10.@psl(x)单位正态线性损失函数,即返回max(0,z-x)的期望值,其中随机变量z服从标准正态分布。11.@psn(x)标准正态分布的累积分布函数。12.@ptd(n,x)自由度为n的t分布的累积分布函数。13.@qrand(seed)产生服从(0,1)区间的拟随机数。@qrand只允许在模型的数据部分使用,它将用拟随机数填满集属性。通常,声明一个m×n的二维表,m表示运行实验的次数,n表示每次实验所需的随机数的个数。在行内,随机数是独立分布的;在行间,随机数是非常均匀的。这些随机数是用“分层取样”的方法产生的。4.5变量界定函数变量界定函数实现对变量取值范围的附加限制,共4种