版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第2讲LINGO软件与优化建模LINGO快速入门LINGO中的集模型的数据部分LINGO函数窗口菜单例子本讲内容2美国芝加哥(Chicago)大学的LinusSchrage教授于1980年前后开发,后来成立LINDO系统公司(LINDOSystemsInc.),网址:
LINDO:LinearINteractiveandDiscreteOptimizer(V6.1)LINGO:LinearINteractiveGeneralOptimizer(V8.0)LINDOAPI:LINDOApplicationProgrammingInterface(V2.0)What’sBest!:(SpreadSheete.g.EXCEL)(V7.0)演示(试用)版、学生版、高级版、超级版、工业版、扩展版…(求解问题规模和选件不同)LINDO公司软件产品简要介绍3LINGO模型的优点包含了LINDO的全部功能提供了灵活的编程语言(矩阵生成器)LINGO模型的构成:4个段目标与约束段集合段(SETSENDSETS)数据段(DATAENDDATA)初始段(INITENDINIT)LINGO软件简介4
LPQPNLPIP全局优化(选)
ILPIQPINLP
LINGO软件的求解过程5LINGO预处理程序线性优化求解程序非线性优化求解程序分枝定界管理程序1.确定常数2.识别类型1.单纯形算法2.内点算法(选)1、顺序线性规划法(SLP)2、广义既约梯度法(GRG)(选)
3、多点搜索(Multistart)(选)LINGO软件的主要特色两种命令模式Windows模式:通过下拉式菜单命令驱动LINGO运行(多数菜单命令有快捷键,常用的菜单命令有快捷按钮),图形界面,使用方便;命令行模式:仅在命令窗口(CommandWindow)下操作,通过输入行命令驱动LINGO运行。6从LINDO到LINGO如今LINGO功能增强,性能稳定,解答结果可靠。与LINDO相比,LINGO软件主要具有两大优点:除具有LINDO的全部功能外,还可用于求解非线性规划问题,包括非线性整数规划问题;内置建模语言,允许以简练、直观的方式描述较大规模的优化问题,所需的数据可以以一定格式保存在独立的文件中。7LINGO软件的主窗口(用户界面),所有其他窗口都在这个窗口之内。模型窗口(ModelWindow)用于输入LINGO优化模型状态行(最左边显示“Ready”,表示“准备就绪”)当前时间当前光标的位置LINGO的界面8LINGO是用来求解线性和非线性优化问题的简易工具。LINGO内置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用LINGO高效的求解器可快速求解并分析结果。当你在windows下开始运行LINGO系统时,会得到类似下面的一个窗口: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)选项设置Help|Contents(F1)在线帮助File|New(F2)新建文件File|Save(F4)保存文件Edit|Cut(Ctrl+X)剪切Edit|Paste(Ctrl+V)粘贴Window|CloseAll(Alt+X)关闭所有窗口Edit|Redo(Ctrl+Y)恢复操作Edit|GoToLine(Ctrl+T)定位某行LINGO|Solve(Ctrl+S)求解模型LINGO|Picture(Ctrl+K)模型图示Window|SendtoBack(Ctrl+B)窗口后置Window|Tile(Alt+T)
平铺窗口上下文相关的帮助工具栏9除“LG4”文件外,另外几种格式的文件都是普通的文本文件,可以用任何文本编辑器打开和编辑。.LG4:LINGO格式的模型文件,保存了模型窗口中所能够看到的所有文本和其他对象及其格式信息;.LNG:文本格式的模型文件,不保存模型中的格式信息(如字体、颜色、嵌入对象等);.LDT:LINGO数据文件;.LTF:LINGO命令脚本文件;.LGR:LINGO报告文件;.LTX:LINDO格式的模型文件;.MPS:示MPS(数学规划系统)格式的模型文件。LINGO的文件类型10Variables(变量数量)变量总数(Total)非线性变量数(Nonlinear)整数变量数(Integer)。Constraints(约束数量)约束总数(Total)非线性约束个数(Nonlinear)Nonzeros(非零系数数量)总数(Total)非线性项系数个数(Nonlinear)GeneratorMemoryUsed(K)(内存使用量)ElapsedRuntime(hh:mm:ss)(求解花费的时间)运行状态窗口11求解器(求解程序)状态框当前模型的类型:LP,QP,ILP,IQP,PILP,PIQP,NLP,INLP,PINLP(以I开头表示IP,以PI开头表示PIP)当前解的状态:"GlobalOptimum","LocalOptimum","Feasible","Infeasible“(不可行),"Unbounded“(无界),"Interrupted“(中断),"Undetermined“(未确定)解的目标函数值当前约束不满足的总量(不是不满足的约束的个数):实数(即使该值=0,当前解也可能不可行,因为这个量中没有考虑用上下界命令形式给出的约束)目前为止的迭代次数运行状态窗口12扩展的求解器(求解程序)状态框目前为止找到的可行解的最佳目标函数值目标函数值的界特殊求解程序当前运行步数:分枝数(对B-and-B程序);子问题数(对Global程序);初始点数(对Multistart程序)有效步数运行状态窗口13使用的特殊求解程序:B-and-B(分枝定界算法)Global(全局最优求解程序)Multistart(用多个初始点求解的程序)注:凡是可以从一个约束直接解出变量取值时,这个变量就不认为是决策变量而是固定变量,不列入统计中;只含有固定变量的约束也不列入约束统计中。外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。在主窗口内的标题为LINGOModel–LINGO1的窗口是LINGO的默认模型窗口,建立的模型都要在该窗口内编码实现。下面举两个例子。例1.1如何在LINGO中求解如下的LP问题:一个简单的LINGO程序14在模型窗口中输入如下代码:min=2*x1+3*x2;x1+x2>=350;x1>=100;2*x1+x2<=600;然后点击工具条上的按钮或者Ctrl+U即可。一个简单的LINGO程序15最小值=800最优解X1=250,x2=100程序语句输入的备注LINGO总是根据“MAX=”或“MIN=”寻找目标函数,而除注释语句和TITLE语句外的其他语句都是约束条件,因此语句的顺序并不重要。限定变量取整数值的语句为“@GIN(X1)”和“@GIN(X2)”,不可以写成“@GIN(2)”,否则LINGO将把这个模型看成没有整数变量。LINGO中函数一律需要以“@”开头,其中整型变量函数(@BIN、@GIN)和上下界限定函数(@FREE、@BND(L,X,U))。而且0/1变量函数是@BIN函数。16通过菜单“WINDOW|StatusWindow”看到状态窗口,可看到最佳目标值“BestObj”与问题的上界“ObjBound”已经是一样的,当前解的最大利润与这两个值非常接近,是计算误差引起的。如果采用全局最优求解程序(后面介绍),可以验证它就是全局最优解。输出结果备注LINGO是将它作为PINLP(纯整数非线性规划)来求解,因此找到的是局部最优解。17LINGO的基本用法的几点注意事项LINGO中不区分大小写字母;变量和行名可以超过8个字符,但不能超过32个字符,且必须以字母开头。用LINGO解优化模型时已假定所有变量非负(除非用限定变量取值范围的函数@free或@BND另行说明)。变量可以放在约束条件的右端(同时数字也可放在约束条件的左端)。但为了提高LINGO求解时的效率,应尽可能采用线性表达式定义目标和约束(如果可能的话)。语句是组成LINGO模型的基本单位,每个语句都以分号结尾,编写程序时应注意模型的可读性。例如:一行只写一个语句,按照语句之间的嵌套关系对语句安排适当的缩进,增强层次感。以感叹号开始的是说明语句(说明语句也需要以分号结束))。18LINGO快速入门LINGO中的集模型的数据部分LINGO函数窗口菜单例子本节内容19对实际问题建模的时候,总会遇到一群或多群相联系的对象,比如工厂、消费者群体、交通工具和雇工等等。LINGO允许把这些相联系的对象聚合成集(sets)。一旦把对象聚合成集,就可以利用集来最大限度的发挥LINGO建模语言的优势。现在我们将深入介绍如何创建集,并用数据初始化集的属性。学完本节后,你对基于建模技术的集如何引入模型会有一个基本的理解。为什么使用集集是LINGO建模语言的基础,是程序设计最强有力的基本构件。借助于集,能够用一个单一的、长的、简明的复合公式表示一系列相似的约束,从而可以快速方便地表达规模较大的模型。LINGO中的集20集是一群相联系的对象,这些对象也称为集的成员。一个集可能是一系列产品、卡车或雇员。每个集成员可能有一个或多个与之有关联的特征,我们把这些特征称为属性。属性值可以预先给定,也可以是未知的,有待于LINGO求解。例如,产品集中的每个产品可以有一个价格属性;卡车集中的每辆卡车可以有一个牵引力属性;雇员集中的每位雇员可以有一个薪水属性,也可以有一个生日属性等等。LINGO有两种类型的集:原始集(primitive
set)和派生集(derivedset)。原始集是由一些最基本的对象组成的。派生集是用一个或多个其它集来定义的,也就是说,它的成员来自于其它已存在的集。LINGO中的集21模型的集部分集部分是LINGO模型的一个可选部分。在LINGO模型中使用集之前,必须在集部分事先定义。集部分以关键字“sets:”开始,以“endsets”结束。一个模型可以没有集部分,或有一个简单的集部分,或有多个集部分。一个集部分可以放置于模型的任何地方,但是一个集及其属性在模型约束中被引用之前必须定义了它们。定义原始集为了定义一个原始集,必须详细声明:集的名字可选,集的成员可选,集成员的属性定义一个原始集,用下面的语法:setname[/member_list/][:attribute_list];注意:用“[]”表示该部分内容可选。下同,不再赘述。LINGO中的集22用DEM,RP,OP,INV分别表示需求量、正常生产的产量、加班生产的产量、库存量,则DEM,RP,OP,INV对每个季度都应该有一个对应的值,也就说他们都应该是一个由4个元素组成的数组,其中DEM是已知的,而RP,OP,INV是未知数。例SAILCO公司需要决定下四个季度的帆船生产量。下四个季度的帆船需求量分别是40条,60条,75条,25条,这些需求必须按时满足。每个季度正常的生产能力是40条帆船,每条船的生产费用为400美元。如果加班生产,每条船的生产费用为450美元。每个季度末,每条船的库存费用为20美元。假定生产提前期为0,初始库存为10条船。如何安排生产可使总费用最小?LINGO中的集23问题的模型(可以看出是LP模型)目标函数是所有费用的和
约束条件主要有:1)能力限制:2)产品数量的平衡方程:3)非负约束LINGO中的集24注: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称为该集合的属性(即定义在该集合上的属性)。LINGO中的集25QUARTERS集合的属性DEMRPOPINVQUARTERS集合2341LINGO中的集26集合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中的集集合元素及集合的属性确定的所有变量27LP模型在LINGO中的一个典型输入方式以“MODEL:”开始以“END”结束集合定义部分从(“SETS:”到“ENDSETS”):定义集合及其属性数据定义部分从(“DATA:”到“ENDDATA”)给出优化目标和约束LINGO中的集28@SUM(集合(下标):关于集合的属性的表达式)对语句中冒号“:”后面的表达式,按照“:”前面的集合指定的下标(元素)进行求和。本例中目标函数也可以等价地写成@SUM(QUARTERS(i):400*RP(i)+450*OP(i)+20*INV(i)),“@SUM”相当于求和符号“∑”,由于本例中目标函数对集合QUARTERS的所有元素(下标)都要求和,所以可以将下标i省去。目标函数的定义方式29循环函数@FOR(集合(下标):关于集合的属性的约束关系式)对冒号“:”前面的集合的每个元素(下标),冒号“:”后面的约束关系式都要成立本例中,每个季度正常的生产能力是40条帆船,这正是语句“@FOR(QUARTERS(I):RP(I)<40);”的含义。由于对所有元素(下标I),约束的形式是一样的,所以也可以像上面定义目标函数时一样,将下标i省去,这个语句可以简化成“@FOR(QUARTERS:RP<40);”。约束的定义方式30本例中,对于产品数量的平衡方程,由于下标i=1时的约束关系式与i=2,3,4时有所区别,所以不能省略下标“i”。实际上,i=1时要用到变量INV(0),但定义的属性变量中INV不包含INV(0)(INV(0)=10是一个已知的)。为了区别i=1和i=2,3,4,把i=1时的约束关系式单独写出,即“INV(1)=10+RP(1)+OP(1)-DEM(1);”;而对i=2,3,4对应的约束,对下标集合的元素(下标i)增加了一个逻辑关系式“i#GT#1”(这个限制条件与集合之间有一个竖线“|”分开,称为过滤条件)。限制条件“i#GT#1”是一个逻辑表达式,意思就是i>1;“#GT#”是逻辑运算符号,意思是“大于(GreaterThan的字首字母缩写)”。约束的定义方式31全局最优解RP=(40,40,40,25),OP=(0,10,35,0)最小成本=78450问题的求解32注:由于输入中没有给出行名,所以行名是系统自动按照行号1-9生成的。选择菜单命令“LINGO|Generate|Displymodel(Ctrl+G)”,可以得到展开形式的模型(如图),可以看到完整的模型,也能确定行号(行号放在方括号“[]”中,且数字前面带有下划线“_”)。最好在输入模型时用户主动设定约束的行名(即约束名),使程序清晰些。单一约束的行名设置方法就是将行名放在方括号“[]”中,置于约束之前。后面将结合具体例子介绍在使用集合的情况下如何设置行名。问题的求解33一般来说,LINGO中建立的优化模型可以由个四部分组成,或称为四“段”(SECTION):(1)集合段(SETS):以“SETS:”开始,“ENDSETS”结束,定义必要的集合变量(SET)及其元素(MEMBER,含义类似于数组的下标)和属性(ATTRIBUTE,含义类似于数组)。如上例中定义了集合quarters(含义是季节),它包含四个元素即四个季节指标(1,2,3,4),每个季节都有需求(DEM)、正常生产量(RP)、加班生产量(OP)、库存量(INV)等属性(相当于数组,数组下标由quarters元素决定)。一旦这样的定义建立起来,如果quarters的数量不是4而是1000,只需扩展其元素为1,2,...,1000,每个季节仍然都有DEM,RP,OP,INV这样的属性(这些量的具体数值如果是常量,则可在数据段输入;如果是未知数,则可在初始段输入初值)。当quarters的数量不是4而是1000时,没有必要把1,2,...,1000全部一个一个列出来,而是可以如下定义quarters集合:“quarters/1..1000/:DEM,RP,OP,INV;”,“1..1000”的意思就是从1到1000的所有整数。小结:LINGO模型最基本的组成要素34(2)目标与约束段:目标函数、约束条件等,没有段的开始和结束标记,因此实际上就是除其它四个段(都有明确的段标记)外的LINGO模型。这里一般要用到LINGO的内部函数,尤其是与集合相关的求和函数@SUM和循环函数@FOR等。上例中定义的目标函数与quarters的元素数目是4或1000并无具体的关系。约束的表示也类似。小结:LINGO模型最基本的组成要素35(3)数据段(DATA):以“DATA:”开始,“ENDDATA”结束,对集合的属性(数组)输入必要的常数数据。格式为:“attribute(属性)=value_list(常数列表);”常数列表(value_list)中数据之间可以用逗号“,”分开,也可以用空格分开(回车等价于一个空格),如上面对DEM的赋值也可以写成“DEM=40607525;”。在LINGO模型中,如果想在运行时才对参数赋值,可以在数据段使用输入语句。但这仅能用于对单个变量赋值,输入语句格式为:“变量名=?;”。例如,上例中如果需要在求解模型时才给出初始库存量(记为A),则可以在模型中数据段写上语句:”A=?;”在求解时LINDO系统给出提示界面,等待用户输入变量A的数值。当然,此时的约束语句INV(1)=10+RP(1)+OP(1)-DEM(1);也应该改写成INV(1)=A+RP(1)+OP(1)-DEM(1);这样,模型就可以计算任意初始库存量(而不仅仅只能计算初始库存量为10)的情况了。小结:LINGO模型最基本的组成要素36(4)初始段(INIT):以“INIT:”开始,“ENDINIT”结束,对集合的属性(数组)定义初值(因为求解算法一般是迭代算法,所以用户如果能给出一个比较好的迭代初值,对提高算法的计算效果是有益的)。如果有一个接近最优解的初值,对LINGO求解模型是有帮助的。定义初值的格式为:“attribute(属性)=value_list(常数列表);”这与数据段中的用法是类似的。上例中没有初始化部分,我们将在下一个例子中举例说明。小结:LINGO模型最基本的组成要素37例3.4建筑工地的位置(用平面坐标a,b表示,距离单位:公里)及水泥日用量d(吨)下表给出。有两个临时料场位于P(5,1),Q(2,7),日储量各有20吨。从A,B两料场分别向各工地运送多少吨水泥,使总的吨公里数最小。两个新的料场应建在何处,节省的吨公里数有多大?123456a1.258.750.55.7537.25b1.250.754.7556.57.75d3547611基本集合与派生集合38记工地的位置为,水泥日用量为;料场位置为,日储量为;从料场
向工地的运送量为
。使用现有临时料场时,决策变量只有(非负),所以这是LP模型;当为新建料场选址时决策变量为和,由于目标函数对是非线性的,所以在新建料场时是NLP模型。先解NLP模型,而把现有临时料场的位置作为初始解告诉LINGO。建立模型39利用集合的概念,可以定义需求点DEMAND和供应点SUPPLY两个集合,分别有6个和2个元素(下标)。但决策变量(运送量)与集合DEMAND和集合SUPPLY都有关系的。该如何定义这样的属性?集合的属性相当于以集合的元素为下标的数组。这里的相当于二维数组。它的两个下标分别来自集合DEMAND和SUPPLY,因此可以定义一个由二元对组成的新的集合,然后将定义成这个新集合的属性。本例中集合的概念40包含了两个基本集合构成的所有二元有序对的派生集合称为稠密集合(简称稠集)。有时候,在实际问题中,一些属性(数组)只在笛卡儿积的一个真子集合上定义,这种派生集合称为稀疏集合(简称疏集)。例(最短路问题)在纵横交错的公路网中,货车司机希望找到一条从一个城市到另一个城市的最短路.下图表示的是公路网,节点表示货车可以停靠的城市,弧上的权表示两个城市之间的距离(百公里).那么,货车从城市S出发到达城市T,如何选择行驶路线,使所经过的路程最短?STA1
A2
A3
B1
B2
C1
C2
633665874678956稠密集合与稀疏集合41假设从S到T的最优行驶路线P经过城市C1,则P中从S到C1的子路也一定是从S到C1的最优行驶路线;
假设P经过城市C2,则P中从S到C2的子路也一定是从S到C2的最优行驶路线.因此,为得到从S到T的最优行驶路线,只需要先求出从S到Ck(k=1,2)的最优行驶路线,就可以方便地得到从S到T的最优行驶路线.同样,为了求出从S到Ck(k=1,2)的最优行驶路线,只需要先求出从S到Bj(j=1,2)的最优行驶路线;为了求出从S到Bj(j=1,2)的最优行驶路线,只需要先求出从S到Ai(i=1,2,3)的最优行驶路线.而S到Ai(i=1,2,3)的最优行驶路线是很容易得到的(实际上,此例中S到Ai(i=1,2,3)只有唯一的道路)分析42STA1
A2
A3
B1
B2
C1
C2
633665874678956此例中可把从S到T的行驶过程分成4个阶段,即S→Ai
(i=1,2或3),Ai
→Bj(j=1或2),Bj→Ck(k=1或2),Ck→T.记d(Y,X)为城市Y与城市X之间的直接距离(若这两个城市之间没有道路直接相连,则可以认为直接距离为∞),用L(X)表示城市S到城市X的最优行驶路线的路长:分析43STA1
A2
A3
B1
B2
C1
C2
633665874678956所以,从S到T的最优行驶路线的路长为20.进一步分析以上求解过程,可以得到从S到T的最优行驶路线为S→A3→B2→C1→T这种计算方法在数学上称为动态规划(DynamicProgramming)本例的计算44STA1
A2
A3
B1
B2
C1
C2
633665874678956“CITIES”(城市):一个基本集合(元素通过枚举给出)L:CITIES对应的属性变量(我们要求的最短路长)“ROADS”(道路):由CITIES导出的一个派生集合(请特别注意其用法),由于只有一部分城市之间有道路相连,所以不应该把它定义成稠密集合,将其元素通过枚举给出,这就是一个稀疏集合。D:稀疏集合ROADS对应的属性变量(给定的距离)本例的LINGO求解45从模型中还可以看出:这个LINGO程序可以没有目标函数,这在LINGO中,可以用来找可行解(解方程组和不等式组)。在数据段对L进行赋值,只有L(S)=0已知,后面的值为空(但位置必须留出来,即逗号“,”一个也不能少,否则会出错)。如果这个语句直接写成“L=0;”,语法上看也是对的,但其含义是L所有元素的取值全部为0,所以也会与题意不符。本例的LINGO求解46虽然集合CITIES中的元素不是数字,但当它以CITIES(I)的形式出现在循环中时,引用下标I却实际上仍是正整数,也就是说I指的正是元素在集合中的位置(顺序),一般称为元素的索引(INDEX)。在@for循环中的过滤条件里用了一个函数“@index”,其作用是返回一个元素在集合中的索引值,这里@index(S)=1(即元素S在集合中的索引值为1),所以逻辑关系式“I#GT#@index(S)”可以直接等价地写成“I#GT#1”。这里@index(S)实际上还是@index(CITIES,S)的简写,即返回S在集合CITIES中的索引值。本例的LINGO求解47从S到T的最优行驶路线的路长为20(进一步分析,可以得到最优行驶路线为S→A3→B2→C1→T)。本例中定义稀疏集合ROADS的方法是将其元素通过枚举给出,有时如果元素比较多,用起来不方便。另一种定义稀疏集合的方法是“元素过滤”法,能够从笛卡儿积中系统地过滤下来一些真正的元素。本例的LINGO求解结果48基本集合的定义格式为(方括号“[]”中的内容是可选项,可以没有):setname[/member_list/][:attribute_list];其中setname为定义的集合名,member_list为元素列表,attribute_list为属性列表。元素列表可以采用显式列举法(即直接将所有元素全部列出,元素之间用逗号或空格分开),也可以采用隐式列举法。隐式列举法可以有几种不同格式,类型隐式列举格式示例示例集合表示的元素数字型1..n1..51,2,3,4,5字符-数字型stringM..stringNCar101..car208Car101,car102,…,car208日期(星期)型dayM..dayNMON..FRIMON,TUE,WED,THU,FRI月份型monthM..monthNOCT..JANOCT,NOV,DEC,JAN年份-月份型monthYearM..monthYearNOCT2001..JAN2002OCT2001,NOV2001,DEC2001,JAN2002基本集合的定义语法49
元素列表和属性列表都是可选的。当属性列表不在集合定义中出现时,这样的集合往往只是为了将来在程序中作为一个循环变量来使用,或者作为构造更复杂的派生集合的父集合使用(匹配问题中的集合STUDENTS没有属性列表)。而当元素列表不在基本集合的定义中出现时,则必须在程序的数据段以赋值语句的方式直接给出元素列表。例如,前例中SAILCO公司决定四个季度的帆船生产量模型的集合段和数据段可以分别改为:SETS:QUARTERS:DEM,RP,OP,INV;!注意没有给出集合的元素列表;ENDSETSDATA:QUARTERSDEM=140260375425;!注意LINGO按列赋值的特点;ENDDATA基本集合的定义语法50派生集合的定义格式为(方括号“[]”中的内容是可选项,可以没有):setname(parent_set_list)[/member_list/][:attribute_list];与基本集合的定义相比较多了一个parent_set_list(父集合列表)。父集合列表中的集合(如set1,set2,…,等)称为派生集合setname的父集合,它们本身也可以是派生集合。当元素列表(member_list)不在集合定义中出现时,还可以在程序的数据段以赋值语句的方式给出元素列表;若在程序的数据段也不以赋值语句的方式给出元素列表,则认为定义的是稠密集合,即父集合中所有元素的有序组合(笛卡儿积)都是setname的元素。当元素列表在集合定义中出现时,又有“元素列表法”(直接列出元素)和“元素过滤法”(利用过滤条件)两种不同方式。派生集合的定义语法51集合的不同类型及其关系集合的使用小结集合派生集合稀疏集合稠密集合基本集合元素过滤法
直接列举法
隐式列举法
元素列表法52LINGO快速入门LINGO中的集模型的数据部分LINGO函数窗口菜单例子本节内容53在处理模型的数据时,需要为集指派一些成员并且在LINGO求解模型之前为集的某些属性指定值。为此,LINGO为用户提供了两个可选部分:输入集成员和数据的数据部分(DataSection)和为决策变量设置初始值的初始部分(InitSection)。模型的数据部分数据部分提供了模型相对静止部分和数据分离的可能性。显然,这对模型的维护和维数的缩放非常便利。数据部分以关键字“data:”开始,以关键字“enddata”结束。在这里,可以指定集成员、集的属性。模型的数据部分54其语法如下:object_list=value_list;对象列(object_list)包含要指定值的属性名、要设置集成员的集名,用逗号或空格隔开。一个对象列中至多有一个集名,而属性名可以有任意多。如果对象列中有多个属性名,那么它们的类型必须一致。如果对象列中有一个集名,那么对象列中所有的属性的类型就是这个集。数值列(value_list)包含要分配给对象列中的对象的值,用逗号或空格隔开。注意属性值的个数必须等于集成员的个数。看下面的例子。例3.1sets:set1/A,B,C/:X,Y;endsetsdata:X=1,2,3;Y=4,5,6;enddata在集set1中定义了两个属性X和Y。X的三个值是1、2和3,Y的三个值是4、5和6。也可采用如下例子中的复合数据声明(datastatement)实现同样的功能。
模型的数据部分55例3.2sets:set1/A,B,C/:X,Y;endsetsdata:X,Y=142536;Enddata看到这个例子,可能会认为X被指定了1、4和2三个值,因为它们是数值列中前三个,而正确的答案是1、2和3。假设对象列有n个对象,LINGO在为对象指定值时,首先在n个对象的第1个索引处依次分配数值列中的前n个对象,然后在n个对象的第2个索引处依次分配数值列中紧接着的n个对象,……,以此类推。模型的数据部分56参数在数据部分也可以指定一些标量变量(scalarvariables)。当一个标量变量在数据部分确定时,称之为参数。看一例,假设模型中用利率8.5%作为一个参数,就可以象下面一样输入一个利率作为参数。例3.3data:interest_rate=.085;enddata也可以同时指定多个参数。例3.4data:interest_rate,inflation_rate=.085.03;enddata模型的数据部分57实时数据处理在某些情况,对于模型中的某些数据并不是定值。譬如模型中有一个通货膨胀率的参数,我们想在2%至6%范围内,对不同的值求解模型,来观察模型的结果对通货膨胀的依赖有多么敏感。我们把这种情况称为实时数据处理(whatifanalysis)。LINGO有一个特征可方便地做到这件事。在本该放数的地方输入一个问号(?)。例3.5data:
interest_rate,inflation_rate=.085?;enddata模型的数据部分58每一次求解模型时,LINGO都会提示为参数inflation_rate输入一个值。在WINDOWS操作系统下,将会接收到一个类似下面的对话框:直接输入一个值再点击OK按钮,LINGO就会把输入的值指定给inflation_rate,然后继续求解模型。除了参数之外,也可以实时输入集的属性值,但不允许实时输入集成员名。模型的数据部分59指定属性为一个值可以在数据声明的右边输入一个值来把所有的成员的该属性指定为一个值。看下面的例子。例3.6sets:days/MO,TU,WE,TH,FR,SA,SU/:needs;endsetsdata:needs=20;enddataLINGO将用20指定days集的所有成员的needs属性。对于多个属性的情形,见下例。例3.7sets:days/MO,TU,WE,TH,FR,SA,SU/:needs,cost;endsetsdata:needscost=20100;enddata
模型的数据部分60数据部分的未知数值有时只想为一个集的部分成员的某个属性指定值,而让其余成员的该属性保持未知,以便让LINGO去求出它们的最优值。在数据声明中输入两个相连的逗号表示该位置对应的集成员的属性值未知。两个逗号间可以有空格。例3.8sets:years/1..5/:capacity;endsetsdata:capacity=,34,20,,;enddata属性capacity的第2个和第3个值分别为34和20,其余的未知。
模型的数据部分61模型的初始部分初始部分是LINGO提供的另一个可选部分。在初始部分中,可以输入初始声明(initializationstatement),和数据部分中的数据声明相同。对实际问题的建模时,初始部分并不起到描述模型的作用,在初始部分输入的值仅被LINGO求解器当作初始点来用,并且仅仅对非线性模型有用。和数据部分指定变量的值不同,LINGO求解器可以自由改变初始部分初始化的变量的值。一个初始部分以“init:”开始,以“endinit”结束。初始部分的初始声明规则和数据部分的数据声明规则相同。也就是说,我们可以在声明的左边同时初始化多个集属性,可以把集属性初始化为一个值,可以用问号实现实时数据处理,还可以用逗号指定未知数值。模型的数据部分62LINGO快速入门LINGO中的集模型的数据部分LINGO函数窗口菜单例子本节内容63基本运算符:包括算术运算符、逻辑运算符和关系运算符数学函数:三角函数和常规的数学函数金融函数:LINGO提供的两种金融函数概率函数:LINGO提供了大量概率相关的函数变量界定函数:这类函数用来定义变量的取值范围集操作函数:这类函数为对集的操作提供帮助集循环函数:遍历集的元素,执行一定的操作的函数数据输入输出函数:这类函数允许模型和外部数据源相联系,进行数据的输入输出辅助函数:各种杂类函数LINGO函数64
4.1基本运算符这些运算符是非常基本的,甚至可以不认为它们是一类函数。事实上,在LINGO中它们是非常重要的。4.1.1算术运算符算术运算符是针对数值进行操作的。LINGO提供了5种二元运算符:^乘方﹡乘/除﹢加﹣减LINGO唯一的一元算术运算符是取反函数“﹣”。
这些运算符的优先级由高到底为:高﹣(取反)^
﹡/低﹢﹣运算符的运算次序为从左到右按优先级高低来执行。运算的次序可以用圆括号“()”来改变。例4.1算术运算符示例。2﹣5/3,(2﹢4)/5等等。
LINGO函数654.1.2逻辑运算符在LINGO中,逻辑运算符主要用于集循环函数的条件表达式中,来控制在函数中哪些集成员被包含,哪些被排斥。在创建稀疏集时用在成员资格过滤器中。LINGO具有9种逻辑运算符:#not#否定该操作数的逻辑值,#not#是一个一元运算符#eq#若两个运算数相等,则为true;否则为flase#ne#若两个运算符不相等,则为true;否则为flase#gt#若左边的运算符严格大于右边的运算符,则为true;否则为flase#ge#若左边的运算符大于或等于右边的运算符,则为true;否则为flaseLINGO函数66
#lt#若左边的运算符严格小于右边的运算符,则为true;否则为flase#le#若左边的运算符小于或等于右边的运算符,则为true;否则为flase#and#仅当两个参数都为true时,结果为true;否则为flase#or#仅当两个参数都为false时,结果为false;否则为true这些运算符的优先级由高到低为:高#not##eq##ne##gt##ge##lt##le#低#and##or#例4.2逻辑运算符示例2#gt#3#and#4#gt#2,其结果为假(0)。LINGO函数67
4.1.3关系运算符在LINGO中,关系运算符主要是被用在模型中,来指定一个表达式的左边是否等于、小于等于、或者大于等于右边,形成模型的一个约束条件。关系运算符与逻辑运算符#eq#、#le#、#ge#截然不同,前者是模型中该关系运算符所指定关系的为真描述,而后者仅仅判断一个该关系是否被满足:满足为真,不满足为假。LINGO函数68
LINGO有三种关系运算符:“=”、“<=”和“>=”。LINGO中还能用“<”表示小于等于关系,“>”表示大于等于关系。LINGO并不支持严格小于和严格大于关系运算符。然而,如果需要严格小于和严格大于关系,比如让A严格小于B:A<B,那么可以把它变成如下的小于等于表达式:A+ε<=B,这里ε是一个小的正数,它的值依赖于模型中A小于B多少才算不等。
下面给出以上三类操作符的优先级:高#not#﹣(取反)^
﹡/﹢﹣#eq##ne##gt##ge##lt##le##and##or#低<==>=LINGO函数69
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)如果x<0返回-1;否则,返回1@floor(x)返回x的整数部分。当x>=0时,返回不超过x的最大整数;当x<0时,返回不低于x的最大整数。@smax(x1,x2,…,xn)返回x1,x2,…,xn中的最大值@smin(x1,x2,…,xn)返回x1,x2,…,xn中的最小值LINGO函数70
4.3变量界定函数变量界定函数实现对变量取值范围的附加限制,共4种:@bin(x)限制x为0或1@bnd(L,x,U)限制L≤x≤U@free(x)取消对变量x的默认下界为0的限制,即x可以取任意实数@gin(x)限制x为整数在默认情况下,LINGO规定变量是非负的,也就是说下界为0,上界为+∞。@free取消了默认的下界为0的限制,使变量也可以取负值。@bnd用于设定一个变量的上下界,它也可以取消默认下界为0的约束。LINGO函数71例4.3给定一个直角三角形,求包含该三角形的最小正方形。解:如图所示。ABCDDAEabx求最小的正方形就相当于求如下的最优化问题:LINGO代码如下:model:sets:object/1..3/:f;endsetsdata:a,b=3,4;!两个直角边长,修改很方便;enddataf(1)=a*@sin(x);f(2)=b*@cos(x);f(3)=a*@cos(x)+b*@sin(x);min=@smax(f(1),f(2),f(3));@bnd(0,x,1.57);endLINGO函数724.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)的计算公式为细心的读者可以发现这两个函数间的关系:LINGO函数734.6集操作函数LINGO提供了几个函数帮助处理集。1.@in(set_name,primitive_index_1[,primitive_index_2,…])如果元素在指定集中,返回1;否则返回0。例4.7全集为I,B是I的一个子集,C是B的补集。sets:I/x1..x4/;B(I)/x2/;C(I)|#not#@in(B,&1):;Endsets2.@index([set_name,]primitive_set_element)该函数返回在集set_name中原始集成员primitive_set_element的索引。如果set_name被忽略,那么LINGO将返回与primitive_set_element匹配的第一个原始集成员的索引。如果找不到,则产生一个错误。LINGO函数74例4.8如何确定集成员(B,Y)属于派生集S3。sets:S1/ABC/;S2/XYZ/;S3(S1,S2)/AX,AZ,BY,CX/;endsetsX=@in(S3,@index(S1,B),@index(S2,Y));看下面的例子,表明有时为@index指定集是必要的。例4.9sets:girls/debble,sue,alice/;boys/bob,joe,sue,fred/;endsetsI1=@index(sue);I2=@index(boys,sue);I1的值是2,I2的值是3。我们建议在使用@index函数时最好指定集。LINGO函数753.@size(set_name)该函数返回集set_name的成员个数。在模型中明确给出集大小时最好使用该函数。它的使用使模型更加数据中立,集大小改变时也更易维护。
LINGO函数76
4.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_list,那么在expression_list中引用的所有属性的类型都是setname集。LINGO函数771.@for该函数用来产生对集成员的约束。基于建模语言的标量需要显式输入每个约束,不过@for函数允许只输入一个约束,然后LINGO自动产生每个集成员的约束。例4.10产生序列{1,4,9,16,25}model:sets:number/1..5/:x;endsets@for(number(I):x(I)=I^2);endLINGO函数78
2.@sum该函数返回遍历指定的集成员的一个表达式的和。例4.11求向量[5,1,3,4,6,10]前5个数的和。model:data:N=6;enddatasets:number/1..N/:x;endsetsdata:x=5134610;enddatas=@sum(number(I)|I#le#5:x);end
LINGO函数793.@min和@max返回指定的集成员的一个表达式的最小值或最大值。例4.12求向量[5,1,3,4,6,10]前5个数的最小值,后3个数的最大值。model:data:N=6;enddatasets:number/1..N/:x;endsetsdata:x=5134610;enddataminv=@min(number(I)|I#le#5:x);maxv=@max(number(I)|I#ge#N-2:x);endLINGO函数80下面看一个稍微复杂一点儿的例子。例4.13职员时序安排模型一项工作一周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));endLINGO函数81计算的部分结果为Globaloptimalsolutionfoundatiteration:0Objectivevalue:22.00000
VariableValueReducedCostREQUIRED(MON)20.000000.000000REQUIRED(TUE)16.000000.000000REQUIRED(WED)13.000000.000000REQUIRED(THU)16.000000.000000REQUIRED(FRI)19.000000.000000REQUIRED(SAT)14.000000.000000REQUIRED(SUN)12.000000.000000START(MON)8.0000000.000000START(TUE)2.0000000.000000START(WED)0.0000000.3333333START(THU)6.0000000.000000START(FRI)3.0000000.000000START(SAT)3.0000000.000000START(SUN)0.0000000.000000从而解决方案是:每周最少需要22个职员,周一安排8人,周二安排2人,周三无需安排人,周四安排6人,周五和周六都安排3人,周日无需安排人。LINGO函数823.@ole函数@OLE是从EXCEL中引入或输出数据的接口函数,它是基于传输的OLE技术。OLE传输直接在内存中传输数据,并不借助于中间文件。当使用@OLE时,LINGO先装载EXCEL,再通知EXCEL装载指定的电子数据表,最后从电子数据表中获得Ranges。为了使用OLE函数,必须有EXCEL5及其以上版本。OLE函数可在数据部分和初始部分引入数据。@OLE可以同时读集成员和集属性,集成员最好用文本格式,集属性最好用数值格式。原始集每个集成员需要一个单元(cell),而对于n元的派生集每个集成员需要n个单元,这里第一行的n个单元对应派生集的第一个集成员,第二行的n个单元对应派生集的第二个集成员,依此类推。@OLE只能读一维或二维的Ranges(在单个的EXCEL工作表(sheet)中),但不能读间断的或三维的Ranges。Ranges是自左而右、自上而下来读。
LINGO函数83例4.16sets:PRODUCT;!产品;MACHINE;!机器;WEEK;!周;ALLOWED(PRODUCT,MACHINE,WEEK):x,y;!允许组合及属性;endsetsdata:rate=0.01;PRODUCT,MACHINE,WEEK,ALLOWED,x,y=@OLE('D:\IMPORT.XLS');@OLE('D:\IMPORT.XLS')=rate;enddata代替在代码文本的数据部分显式输入形式,我们把相关数据全部放在如下电子数据表中来输入。下面是D:\IMPORT.XLS的图表。LINGO函数84除了输入数据之外,我们也必须定义Ranges名:PRODUCT,MACHINE,WEEK,ALLOWED,x,y.明确的,我们需要定义如下的Ranges名:NameRangePRODUCTB3:B4MACHINEC3:C4WEEKD3:D5ALLOWEDB8:D10XF8:F10YG8:G10rateC13为了在EXCEL中定义Ranges名:①按鼠标左键拖曳选择Range,②释放鼠标按钮,③选择“插入|名称|定义”,④输入希望的名字,⑤点击“确定”按钮。LINGO函数85我们在模型的数据部分用如下代码从EXECL中引入数据:PRODUCT,MACHINE,WEEK,ALLOWED,x,y=@OLE('D:\IMPORT.XLS');@OLE('D:\IMPORT.XLS')=rate;等价的描述为PRODUCT,MACHINE,WEEK,ALLOWED,x,y=@OLE('D:\IMPORT.XLS',PRODUCT,MACHINE,WEEK,ALLOWED,x,y);@OLE('D:\IMPORT.XLS',rate)=rate;这一等价描述使得变量名和Ranges不同亦可。
LINGO函数86
4.9辅助函数1.@if(logical_condition,true_result,false_result)@if函数将评价一个逻辑表达式logical_condition,如果为真,返回true_result,否则返回false_result。例4.18求解最优化问题LINGO函数87其LINGO代码如下:model:min=fx+fy;fx=@if(x#gt#0,100,0)+2*x;fy=@if(y#gt#0,60,0)+3*y;x+y>=30;end
LINGO函数882.@warn(’text’,logical_condition)如果逻辑条件logical_condition为真,则产生一个内容为’text’的信息框。例4.19示例。model:x=1;@warn('x是正数',x#gt#0);end
LINGO函数89LINGO快速入门LINGO中的集模型的数据部分LINGO函数窗口菜单例子本节内容905.1文件菜单(FileMenu)5.2编辑菜单(EditMenu)
5.3LINGO菜单1.求解模型(Slove)从LINGO菜单中选用“求解”命令、单击“Slove”按钮或按Ctrl+S组合键可以将当前模型送入内存求解。2.求解结果...(Solution...)从LINGO菜单中选用“Solution...”命令、单击“Solution...”按钮或直接按Ctrl+O组合键可以打开求解结果的对话框。这里可以指定查看当前内存中求解结果的那些内容。3.查看...(Look...)从LINGO菜单中选用“Look...”命令或直接按Ctrl+L组合键可以查看全部的或选中的模型文本内容。LINGOWINDOWS命令LINGOWINDOWS命令914.灵敏性分析(Range,Ctrl+R)用该命令产生当前模型的灵敏性分析报告:研究当目标函数的费用系数和约束右端项在什么范围(此时假定其它系数不变)时,最优基保持不变。灵敏性分析是在求解模型时作出的,因此在求解模型时灵敏性分析是激活状态,但是默认是不激活的。为了激活灵敏性分析,运行LINGO|Options…,选择GeneralSolverTab,在DualComputations列表框中,选择PricesandRanges选项。灵敏性分析耗费相当多的求解时间,因此当速度很关键时,就没有必要激活它。LINGOWINDOWS命令92状态窗口(LINDOSolverStatus)93当前状态:已达最优解迭代次数:18次约束不满足的“量”(不是“约束个数”):0当前的目标值:94最好的整数解:94整数规划的界:93.5分枝数:1所用时间:0.00秒(太快了,还不到0.005秒)刷新本界面的间隔:1(秒)选项设置94选项设置95
Preprocess:预处理(生成割平面);
PreferredBranch:优先的分枝方式:“Default”(缺省方式)、“Up”(向上取整优先)、“Down”(向下取整优先);
IPOptimalityTol:IP最优值允许的误差上限(一个百分数,如5%即0.05);
IPObjectiveHurdle:IP目标函数的篱笆值,即只寻找比这个值更优最优解(如当知道当前模型的某个整数可行解时,就可以设置这个值);
IPVarFixingTol:固定一个整数变量取值所依据的一个上限(如果一个整数变量的判别数(REDUCEDCOST)的值很大,超过该上限,则以后求解中把该整数变量固定下来)。NonzeroLimit:非零系数的个数上限;IterationL
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 贵州财经职业学院《体育舞蹈II》2023-2024学年第一学期期末试卷
- 2025年云南建筑安全员考试题库
- 广州中医药大学《化工原理2》2023-2024学年第一学期期末试卷
- 广州医科大学《生物考古学》2023-2024学年第一学期期末试卷
- 广州幼儿师范高等专科学校《软件系统分析》2023-2024学年第一学期期末试卷
- 2025江西省建筑安全员-B证(项目经理)考试题库
- 2025年辽宁建筑安全员考试题库
- 绪论现代西方哲学思潮专题教学课件
- 河北省保定市竞秀区2024-2025学年九年级上学期11月期中数学试题(含答案)
- 2024年江西科技职业学院单招职业技能测试题库及完整答案
- 《组织与胚胎学》课程期末考试复习题库及答案
- (八省联考)河南省2025年高考综合改革适应性演练 化学试卷(含答案)
- 部编版三年级上册道德与法治期末测试卷带答案(巩固)
- 教师个人工作业绩总结范文
- 《中华人民共和国政府采购法》专题培训
- 郑州大学《高等代数》2023-2024学年第一学期期末试卷
- 对银行领导班子的评价意见和建议范文(3篇)
- 如何保护个人手机数据的安全
- 2024医疗设备维修与保养合同
- 第6课 战国时期的社会变革(说课稿)2024-2025学年七年级历史上册同步高效课堂(统编版2024)
- 汽车内饰件及材料气味评价标准解析
评论
0/150
提交评论