优化建模LPQPNLPIP全局优化(选)ILPIQPINLPLINGO软件的求解过程LINGO预处理程序线性优化求解程序非线性优化求解程序分枝定界管理程序1.确定常数2.识别类型1.单纯形算法2.内点算法(选)1、顺序线性规划法(SLP)2、广义既约梯度法(GRG)(选)3、多点搜索(Multistart)(选)优化建模三、LINGO软件的基本使用方法1、Lingo入门2、在Lingo中使用集合3、运算符和函数4、Lingo的主要菜单命令优化建模1、Lingo入门LINGO的界面•LINGO软件的主窗口(用户界面),所有其他窗口都在这个窗口之内。•模型窗口(ModelWindow),用于输入LINGO优化模型(即LINGO程序)。•状态行(最左边显示“Ready”,表示“准备就绪”)•当前时间•当前光标的位置优化建模•简单程序举例:•Lindo程序:max2x+3yst4x+3y103x+5y12end•Lingo程序:MODEL:max=2*x+3*y;4*x+3*y10;3*x+5*y12;end请大家仔细区分它们的不同。求z=2x+3y在约束条件4x+3y=10,3x+5y=12下的最大值•这是lingo程序最基本的格式之一在lingo模型窗口中输入右框中的程序,并保存为LG4格式文件,这是LINGO格式的模型文件,保存了模型窗口中所能够看到的所有文本和其他对象及其格式信息;在LINGO中使用LINDO模型优化建模运行程序:点“LINGO菜单Solve命令”或按ctrl+s运行或用鼠标点在LINGO中使用LINDO模型优化建模•运行状态窗口求解器(求解程序)状态框当前解的状态:GlobalOptimum,LocalOptimum,Feasible,Infeasible“(不可行),Unbounded“(无界),Interrupted“(中断),Undetermined“(未确定)解的目标函数值优化建模④运行程序的LINGO报告窗口(如下图)在LINGO中使用LINDO模型注:LINGO不询问是否进行敏感性分析,敏感性分析需要将来通过修改系统选项启动敏感性分析后,再调用“REPORT|RANGE”菜单命令来实现。现在同样可以把模型和结果报告保存在文件中。优化建模一个简单的LINGO程序例直接用LINGO来解如下二次规划问题:40,322100..123.02779821212122212121为整数xxxxxxtsxxxxxxMax输入窗口如下:优化建模程序语句输入的备注:max=98*x1+277*x2-x1^2-0.3*x1*x2-2*x2^2;•LINGO总是根据“MAX=”或“MIN=”寻找目标函数。@gin(x1);@gin(x2);•限定变量取整数值的语句为“@GIN(X1)”和“@GIN(X2)”•LINGO中函数一律需要以“@”开头。@BIN(x)—限定变量x为0/1变量函数@FREE(x)—设定变量x的取值范围为实数。注意:如果0/1变量的个数很多,还可以采用循环语句设定。优化建模选择全局求解的方法:点Lindo菜单optionsGlobalSolver,在useGlobalSolver前打钩。点save,应用,ok.然后运行这个程序优化建模输出结果:最优整数解X=(35,65)最大利润=11077.5优化建模一个简单的LINGO程序LINGO的基本用法的几点注意事项•LINGO中不区分大小写字母;变量和行名可以超过8个字符,但不能超过32个字符,且必须以字母开头。•用LINGO解优化模型时已假定所有变量非负(除非用限定变量取值范围的函数@free或@sub或@slb另行说明)。•变量可以放在约束条件的右端(同时数字也可放在约束条件的左端)。但为了提高LINGO求解时的效率,应尽可能采用线性表达式定义目标和约束(如果可能的话)。•语句是组成LINGO模型的基本单位,每个语句都以分号结尾,编写程序时应注意模型的可读性。例如:一行只写一个语句,按照语句之间的嵌套关系对语句安排适当的缩进,增强层次感。•以感叹号开始的是说明语句(说明语句也需要以分号结束))。优化建模课堂练习:求解下列模型且为整数,0,;2054;62;max21212121xxxxxxxxz22121222121212min(,)(3)(2)50240,0fxxxxstxxxxxx22121222122min(,)(1)(1)2010fxxxxstxxx优化建模二、集合的基本用法和LINGO模型的基本要素理解LINGO建模语言最重要的是理解集合(Set)及其属性(Attribute)的概念。优化建模例SAILCO公司需要决定下四个季度的帆船生产量。下四个季度的帆船需求量分别是40条,60条,75条,25条,这些需求必须按时满足。每个季度正常的生产能力是40条帆船,每条船的生产费用为400美元。如果加班生产,每条船的生产费用为450美元。每个季度末,每条船的库存费用为20美元。假定生产提前期为0,初始库存为10条船。如何安排生产可使总费用最小?DEM,RP,OP,INV对每个季度都应该有一个对应的值,也就说他们都应该是一个由4个元素组成的数组,其中DEM是已知的,而RP,OP,INV是未知数。第一季度第二季度第三季度第四季度DEM:需求量(为已知)40607525RP:正常生产的产量OP:加班生产的产量INV:库存量总费用:四个季度的(生产费用+加班费用+库存费用)设优化建模问题的模型(可以看出是LP模型)目标函数是所有费用的和4,3,2,1)}(20)(450)(400{MINIIINVIOPIRP约束条件主要有两个:1)能力限制:RP()40,1,2,3,4II2)产品数量的平衡方程:()(1)()()(),1,2,3,4INVIINVIRPIOPIDEMII10)0(INV加上变量的非负约束正常生产的产量加班产量库存量优化建模注:LINDO中没有数组,只能对每个季度分别定义变量,如正常产量就要有RP1,RP2,RP3,RP44个变量等。写起来就比较麻烦,尤其是更多(如1000个季度)的时候。记四个季度组成的集合QUARTERS={1,2,3,4},它们就是上面数组的下标集合,而数组DEM,RP,OP,INV对集合QUARTERS中的每个元素1,2,3,4分别对应于一个值。LINGO正是充分利用了这种数组及其下标的关系,引入了“集合”及其“属性”的概念,把QUARTERS={1,2,3,4}称为集合,把DEM,RP,OP,INV称为该集合的属性(即定义在该集合上的属性)。优化建模•QUARTERS集合的属性•DEM•RP•OP•INV•QUARTERS集合•2•3•4•1集合及其属性优化建模集合元素及集合的属性确定的所有变量集合QUARTERS的元素1234定义在集合QUARTERS上的属性DEMDEM(1)DEM(2)DEM(3)DEM(4)RPRP(1)RP(2)RP(3)RP(4)OPOP(1)OP(2)OP(3)OP(4)INVINV(1)INV(2)INV(3)INV(4)优化建模LINGO中定义集合及其属性LP模型在LINGO中的一个典型输入方式以“MODEL:”开始以“END”结束集合定义部分从(“SETS:”到“ENDSETS”):定义集合及其属性集合定义部分从(“DATA:”到“ENDDATA”)给出优化目标和约束优化建模目标函数的定义方式对语句中冒号“:”后面的表达式,按照“:”前面的集合指定的下标(元素)进行求和。本例中目标函数也可以等价地写成@SUM(QUARTERS(i):400*RP(i)+450*OP(i)+20*INV(i)),“@SUM”相当于求和符号“∑”,由于本例中目标函数对集合QUARTERS的所有元素(下标)都要求和,所以可以将下标i省去。•min=@sum(Quarters:400*RP+450*OP+20*INV);@SUM(集合(下标):关于集合的属性的表达式)优化建模约束的定义方式循环函数@FOR(集合(下标):关于集合的属性的约束关系式)对冒号“:”前面的集合的每个元素(下标),冒号“:”后面的约束关系式都要成立本例中,每个季度正常的生产能力是40条帆船,这正是语句“@FOR(QUARTERS(I):RP(I)40);”的含义。这个语句可以简化成“@FOR(QUARTERS:RP40);”。•@for(quarters(I):RP(I)40);优化建模@For(Quarters(I)|I#GT#1:INV(I)=INV(I-1)+RP(I)+OP(I)-DEM(I););对下标集合的元素(下标i)增加了一个逻辑关系式“i#GT#1”(这个限制条件与集合之间有一个竖线“|”分开,称为过滤条件)。限制条件“I#GT#1”是一个逻辑表达式,意思就是I1;“#GT#”是逻辑运算符号,意思是“大于(GreaterThan的字首字母缩写)”。约束的定义方式()(1)()()(),1,2,3,4INVIINVIRPIOPIDEMII10)0(INV优化建模问题的求解:运行菜单命令“LINGO|Solve”全局最优解RP=(40,40,40,25),OP=(0,10,35,0)最小成本=78450优化建模•Lingo模型的基本结构(1)集合段(SETS):sets:Quarters/1,2,3,4/:DEM,RP,OP,INV,I;endsets或者sets:Quarters/1..4/:DEM,RP,OP,INV,I;endsets(2)目标与约束段:min=@sum(Quarters:400*RP+450*OP+20*INV);@For(quarters(I):RP(I)40);@For(Quarters(I)|I#GT#1:INV(I)=INV(I-1)+RP(I)+OP(I)-DEM(I););INV(1)=10+RP(1)+OP(1)-DEM(1);优化建模(3)数据段(DATA):DATA:DEM=40,60,75,25;(或写成DEM=40607525;)Enddata优化建模(4)初始段(INIT):以“INIT:”开始,“ENDINIT”结束,对集合的属性(数组)定义初值(因为求解算法一般是迭代算法,所以用户如果能给出一个比较好的迭代初值,对提高算法的计算效果是有益的)。如果有一个接近最优解的初值,对LINGO求解模型是有帮助的。定义初值的格式为:“attribute(属性)=value_list(常数列表);”这与数据段中的用法是类似的。上例中没有初始化部分,我们将在下一个例子中举例说明。优化建模(5)计算段(CALC):以“CALC:”开始,“ENDCALC”结束,对一些原始数据进行计算处理。在实际问题中,输入的数据通常是原始数据,不一定能在模型中直接使用,可以在这个段对这些原始数据进行一定的“预处理”,得到模型中真正需要的数据。例如上例,如果希望得到全年的总需求和季度平均需求,可以增加这个段:CALC:T_DEM=@SUM(quarters:DEM);!总需求;A_DEM=T_DEM/@size(quarters);!平均需求;ENDCALC在计算段中也可以使用集合函数(其中函数@size(quarters)表示集合quarters的元素个数,这里也就是4)。这时,变量T_DEM的值就是总需求,A_DEM的值就是平均需求(如果需要的话,这两个变量就可以在程序的其它地方作为常数使用了)。注:上面的两个语句不能交换顺序,因为计算A_DEM必须要用到T_DEM的值。此外,在计算段中只能直接使用赋值语句,而不能包含需要经过解方程或经过求解优化问题以后才能决定的变量。优化建模基本集合与派生集合例3.4建筑工地的位置(用平面坐标a,b表示,距离单位:公里)及水泥日用量d(吨)下表给出。有两