数学模型与lingo软件数学模型与数学模型与lingolingo软件软件西南交通大学数学系西南交通大学数学系需要掌握的几个重要方面•掌握集合(SETS)的应用;•正确阅读求解报告;•正确理解求解状态窗口;•学会设置基本的求解选项(OPTIONS);•应用实例LINDO和LINGO软件能求解的优化模型LINGO8.0有两种命令模式Windows模式,通过下拉式菜单命令驱动LINGO运行命令行(Command-Line)模式,仅在命令窗口下操作与LINDO相比,LINGO软件主要具有两大优点1、除具有LINDO的全部功能外,还可用于求解非线性规划问题,包括非线性整数规划问题2、LINGO包含了内置的建模语言,允许以简练、直观的方式描述较大规模的优化问题,模型中所需的数据可以以一定格式保存在独立的文件中在LINGO中使用LINDO模型LINGO的界面•LINGO软件的主窗口(用户界面),所有其他窗口都在这个窗口之内。•模型窗口(ModelWindow),用于输入LINGO优化模型(即LINGO程序)。•状态行(最左边显示“Ready”,表示“准备就绪”)•当前时间•当前光标的位置工具栏File|Open(F3)打开文件File|Print(F7)打印文件Edit|Copy(Ctrl+C)复制Edit|Undo(Ctrl+Z)取消操作Edit|Find(Ctrl+F)查找LINGO|Solution(Alt+O)显示解答Edit|MatchParenthesis(Ctrl+P)匹配括号LINGO|Options(Ctrl+I)选项设置Window|CloseAll(Alt+X)关闭所有窗口Help|Contents(F1)在线帮助File|New(F2)新建文件File|Save(F4)保存文件Edit|Cut(Ctrl+X)剪切Edit|Paste(Ctrl+V)粘贴Edit|Redo(Ctrl+Y)恢复操作Edit|GoToLine(Ctrl+T)定位某行LINGO|Solve(Ctrl+S)求解模型LINGO|Picture(Ctrl+K)模型图示Window|SendtoBack(Ctrl+B)窗口后置Window|Tile(Alt+T)平铺窗口上下文相关的帮助LP问题在lindo和lingo中不同的输入形式Lindo:max2x+3yst4x+3y103x+5y12endLingo:max=2*x+3*y;4*x+3*y10;3*x+5*y12;(1)将目标函数的表示方式从“MAX”变成了“MAX=”(2)“ST”在LINGO模型中不再需要,所以被删除了(3)每个系数与变量间增加了运算符“*”(即乘号不能省略)(4)每行(目标、约束和说明语句)后面均增加了一个分号“;”(5)模型结束标志“END”也被删除了(LINGO中只有当模型以“MODEL:”开始时才能以“END”结束)。这是LINGO模型的最基本特征直接将lindo模型文件转化为lingo文件Lindo:max2x+3yst4x+3y103x+5y12endLingo:max=2*x+3*y;4*x+3*y10;3*x+5*y12;为保证能将LINDO模型移植到LINGO中去,在LINDO模型输入时应尽量采用“规范化”的格式Lingo的不同保存类型“LG4”表示LINGO格式的模型文件,是一种特殊的二进制格式文件,保存了我们在模型窗口中所能够看到的所有文本和其他对象及其格式信息,只有LINGO能读出它,用其他系统打开这种文件时会出现乱码“LNG”表示LINGO文本文件,以这个格式保存模型时系统将给出警告,因为模型中的格式信息(如字体、颜色等)将会丢失“LDT”表示数据文件“LTF”表示命令脚本文件“LGR”表示报告文件除“LG4”文件外,这里的另外几种格式的文件其实都是普通的文本文件,可以用任何文本编辑器打开和编辑•运行状态窗口Variables(变量数量):变量总数(Total)、非线性变量数(Nonlinear)、整数变量数(Integer)。Constraints(约束数量):约束总数(Total)、非线性约束个数(Nonlinear)。Nonzeros(非零系数数量):总数(Total)、非线性项系数个数(Nonlinear)。GeneratorMemoryUsed(K)(内存使用量)•ElapsedRuntime(hh:mm:ss)(求解花费的时间)状态窗口的参数解释•运行状态窗口求解器(求解程序)状态框当前模型的类型:LP,QP,ILP,IQP,PILP,PIQP,NLP,INLP,PINLP(以I开头表示IP,以PI开头表示PIP)当前解的状态:GlobalOptimum,LocalOptimum,Feasible,Infeasible“(不可行),Unbounded“(无界),Interrupted“(中断),Undetermined“(未确定)解的目标函数值当前约束不满足的总量(不是不满足的约束的个数):实数(即使该值=0,当前解也可能不可行,因为这个量中没有考虑用上下界命令形式给出的约束)目前为止的迭代次数状态窗口的参数解释•运行状态窗口扩展的求解器(求解程序)状态框使用的特殊求解程序:B-and-B(分枝定界算法)Global(全局最优求解程序)Multistart(用多个初始点求解的程序)目前为止找到的可行解的最佳目标函数值目标函数值的界特殊求解程序当前运行步数:分枝数(对B-and-B程序);子问题数(对Global程序);初始点数(对Multistart程序)有效步数状态窗口的参数解释用LINGO来解二次规划问题22121122121212982770.32..1002,0MAXzxxxxxxstxxxxxx=+---+≤≤≥为整数max=98*x1+277*x2-x1^2-0.3*x1*x2-2*x2^2;x1+x2100;x12*x2;@gin(x1);@gin(x2);注意事项:1)变量和行名可以超过8个字符,但不能超过32个字符,且必须以字母开头2)LINGO已假定各变量非负(除非用函数@free或@sub或@slb另行说明)3)变量可以放在约束条件的右端(同时数字也可放在约束条件的左端)。但为了提高效率,应尽可能采用线性表达式定义目标和约束(如果可能)Lingo的编程优化问题的一种建模语言。使用者可以只用键入一行文字就可以建立起含有大规模变量的目标函数和成千上万条约束LINGO模型的构成:4个段集合段(SETSENDSETS)数据段(DATAENDDATA)初始段(INITENDINIT)目标与约束段LINGO中的集对实际问题建模的时候,总会遇到一群或多群相联系的对象,比如工厂、消费者群体、交通工具和雇工等等。LINGO允许把这些相联系的对象聚合成集(sets)。一旦把对象聚合成集,就可以利用集来最大限度的发挥LINGO建模语言的优势。集是LINGO建模语言的基础,是程序设计最强有力的基本构件。借助于集,能够用一个单一的、长的、简明的复合公式表示一系列相似的约束,从而可以快速方便地表达规模较大的模型集是一群相联系的对象,这些对象也称为集的成员。每个集成员可能有一个或多个与之有关联的特征,我们把这些特征称为属性。属性值可以预先给定,也可以是未知的,有待于LINGO求解。集部分是LINGO模型的一个可选部分。在LINGO模型中使用集之前,必须在集部分事先定义。集部分以关键字“sets:”开始,以“endsets”结束。一个模型可以没有集部分,或有一个简单的集部分,或有多个集部分。一个集部分可以放置于模型的任何地方,但是一个集及其属性在模型约束中被引用之前必须定义了它们定义原始集setname[/member_list/][:attribute_list];Setname是你选择的来标记集的名字,最好具有较强的可读性。集名字必须严格符合标准命名规则:以拉丁字母或下划线(_)为首字符,其后由拉丁字母(A—Z)、下划线、阿拉伯数字(0,1,…,9)组成的总长度不超过32个字符的字符串,且不区分大小写。Member_list是集成员列表。如果集成员放在集定义中,那么对它们可采取显式罗列和隐式罗列两种方式。如果集成员不放在集定义中,那么可以在随后的数据部分定义它们sets:students/JohnJill,RoseMike/:sex,age;endsets模型的数据部分数据部分提供了模型相对静止部分和数据分离的可能性。显然,这对模型的维护和维数的缩放非常便利。数据部分以关键字“data:”开始,以关键字“enddata”结束。在这里,可以指定集成员、集的属性。其语法如下:object_list=value_list;对象列(object_list)包含要指定值的属性名、要设置集成员的集名,用逗号或空格隔开。一个对象列中至多有一个集名,而属性名可以有任意多。如果对象列中有多个属性名,那么它们的类型必须一致。如果对象列中有一个集名,那么对象列中所有的属性的类型就是这个集。数值列(value_list)包含要分配给对象列中的对象的值,用逗号或空格隔开。注意属性值的个数必须等于集成员的个数。sets:set1/A,B,C/:X,Y;endsetsdata:X=1,2,3;Y=4,5,6;enddata数据部分的未知数值有时只想为一个集的部分成员的某个属性指定值,而让其余成员的该属性保持未知,以便让LINGO去求出它们的最优值。在数据声明中输入两个相连的逗号表示该位置对应的集成员的属性值未知。两个逗号间可以有空格sets:years/1..5/:capacity;endsetsdata:capacity=,34,20,,;enddata属性capacity的第2个和第3个值分别为34和20,其余的未知模型的初始部分初始部分是LINGO提供的另一个可选部分。在初始部分中,可以输入初始声明(initializationstatement),和数据部分中的数据声明相同。对实际问题的建模时,初始部分并不起到描述模型的作用,在初始部分输入的值仅被LINGO求解器当作初始点来用,并且仅仅对非线性模型有用。和数据部分指定变量的值不同,LINGO求解器可以自由改变初始部分初始化的变量的值。一个初始部分以“init:”开始,以“endinit”结束。初始部分的初始声明规则和数据部分的数据声明规则相同。也就是说,我们可以在声明的左边同时初始化多个集属性,可以把集属性初始化为一个值,可以用问号实现实时数据处理,还可以用逗号指定未知数值。init:X,Y=0,.1;endinitY=@log(X);X^2+Y^2=1;好的初始点会减少模型的求解时间。运算符及其优先级算术运算符:+(加法),—(减法或负号),*(乘法),/(除法),^(求幂)关系运算符:(即=,小于等于),=(等于),(即=,大于等于)逻辑运算符:#AND#(与),#OR#(或),#NOT#(非),#EQ#(等于),#NE#(不等于),#GT#(大于),#GE#(大于等于),#LT#(小于),#LE#(小于等于)。结果只有“真”(1)和“假”(0)两个值LINGO函数一览(1)LINGO函数一览(2)LINGO函数一览(3)LINGO函数一览(4)LINGO函数一览(5)LINGO函数一览(6)@smax(x1,x2,…,xn)给定一个直角三角形,求包含该三角形的最小正方形@for函数产生序列{1,4,9,16,25}@sum函数求向量[5,1,3,4,6,10]前5个数的和该函数用来产生对集成员的约束。基于建模语言的标量需要显式输入每个约束,不过@for函数允许只输入一个约束,然后LINGO自动产生每个集成员的约束该函数返回遍历指定的集成员的一个表达式的和@min和@max求向量[5,1,3,4,6,10]前5个数最小值,后3个数最大值返回指定的集成员的一个表达式的最小值或最大值通过文件输入输出数据•通过文件输入输出数据可以将LINGO程序和程序处理的数据分离开