《Lingo_快速入门55页.ppt》由会员分享,可在线阅读,更多相关《Lingo_快速入门55页.ppt(55页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1LINGO与LINDO比较LINGO除具有LINDO的全部功能外,还可用于求解非线性规划问题LINGO包含了内置的建模语言,允许以简练,直观的方式描述较大规模的优化问题,模型中所需的数据可以以一定格式保存在独立的文件中在LINGO中使用LINDO模型在9.0版本中可从FILE/OPEN直接打开,选择文件类型(LTX)在8.0版本中,要通过FILE/IMPORT LINDO FILE命令直接把LINDO模型文件转化成LINGO模型从LINDO到LINGO的转化实质:1)将目标函数的表达式从MAX变成了MAX=2)ST在LINGO中不再需要3)在每个系数与变量之间增加了运算符*4)每行(目标,约
2、束和说明语句)后面增加了一个分号5)约束的名字被放到了一对方括号 中,而不是放在右半括号之前6)LINGO中模型以MODEL:开始,以END结束,对简单的模型,这两个语句也可以省略2单单位位销地销地运运价价产地产地B1B2B3B4B5B6B7B8产量产量(capacity)A16267425960A24953858255A35219743351A47673927143A52395726541A65522814352销量销量(damand)3537223241324338例子:求解6个发货点到8个接收点的最小费用运输问题的最优方案。产/销/单位运价如下表思考:变量设置/目标函数/约束条件34mo
3、del:sets:a/a1.a6/:capacity;b/b1.b8/:demand;links(a,b):c,x;endsets min=sum(links:c*x);for(b(J):sum(a(I):x(I,J)=demand(J);for(a(I):sum(b(J):x(I,J)=capacity(I);data:capacity=60 55 51 43 41 52;demand=35 37 22 32 41 32 43 38;c=6 2 6 7 4 2 9 5 4 9 5 3 8 5 8 2 5 2 1 9 7 4 3 3 7 6 7 3 9 2 7 1 2 3 9 5 7 2 6
4、5 5 5 2 2 8 1 4 3;enddata endLINGO编编程程5 LINGO WINDOWS命令 外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。在主窗口内的标题为LINGO Model LINGO1的窗口是LINGO的默认模型窗口,建立的模型都都要在该窗口内编码实现。文件菜单(File Menu)1 新建(New)2 打开(Open)3 保存(Save)4 另存为(Save As)5 关闭(Close)6 打印(Print)7 打印设置(Print Setup)8 打印预览(Print Preview)9 输出到日志文件(Log Output)
5、用于生成一个日志文件,它存储接下来在“命令窗口”中输入的所有命令。10提交LINGO命令脚本文件(Take Commands)11.两种输出格式(Export File)12引入LINDO文件(Import Lindo File)13退出(Exit)6 LINGO WINDOWS命令 编辑菜单(Edit Menu)1 恢复(Undo)2 剪切(Cut)3 复制(Copy)4 粘贴(Paste)5 特殊粘贴.(Paste Special。)与上面的命令不同,它可以用于剪贴板中的内容不是文本的情形。6 全选(Select All)7 匹配小括号(Match Parenthesis)“Match P
6、arenthesis”可以为当前选中的开括号查找匹配的闭括号。8 粘贴函数(Paste Function)从编辑菜单中选用“Paste Function”命令可以将LINGO的内部函数粘贴到当前插入点。选择字体字形大小颜色效果等(Select Font)7LINGO菜单菜单 1 求解模型(Slove)将当前模型送入内存求解。2 求解结果(Solution)指定查看当前内存中求解结果的那些内容。3 查看(Look)只在命令窗口下才能使用,现实模型内容,并对所有行按顺序编号4 灵敏性分析(Range,Ctrl+R)灵敏性分析是在求解模型时作出的,因此在求解模型时灵敏性分析是激活状态,但是默认是不激
7、活的。为了激活灵敏性分析,运行LINGO|Options,选择General Solver Tab,在Dual Computations列表框中,选择Prices and Ranges选项。灵敏性分析会耗费相当多的求解时间5 模型的通常形式(Generate)可以创建当前模型的代数形式(非线性量前系数用(?)显示)模型的矩阵形式(icture)按照矩阵形式以图形方式显示模型(非线性项的系数以黑色显示为?线性项系数为正时显示为蓝色,为负时显示为红色)选项(Options)可以改变一些影响LINGO模型求解时的参数。该命令将打开一个含有7个选项卡的窗口,你可以通过它修改LINGO系统的各种参数和选
8、项。修改完以后,你如果单击“Apply(应用)”按钮,则新的设置马上生效;如果单击“OK(确定)”按钮,则新的设置马上生效,并且同时关闭该窗口。如果单击“Save(保存)”按钮,则将当前设置变为默认设置,下次启动LINGO时这些设置仍然有效。单击“Default(缺省值)”按钮,则恢复LINGO系统定义的原始默认设置(缺省设置)。LINGO WINDOWS命令 8窗口菜单(Windows Menu)1 命令行窗口(Open Command Window)有两种命令模式:模式和命令行模式在命令行窗口中可以获得命令行界面,在“:”提示符后可以输入LINGO的命令行命令。2 状态窗口(Status
9、Window)如果在编译期间没有表达错误,那么LINGO将调用适当的求解器来求解模型。LINGO WINDOWS命令 9 LINGO WINDOWS命令 命令行命令1 LINGO信息 Cat 显示所有命令类型 Com 按类型显示所用LINGO命令 Help 显示所需命令的简要帮助信息 Mem 显示内存变量的信息 2 输入(Input)model 以命令行方式输入一个模型 take 执行一个文件的命令正本或从磁盘中读取某个模型文件 3 显示(Display)look 显示当前模型的内容 genl 产生LINGO兼容的模型 gen 生成并显示整个模型 hide 为模型设置密码保护 pause 暂停
10、屏幕输出直至再次使用此命令 4 文件输出(File Ouput)div 将模型结果输出到文件 svrt 将模型结果输出到屏幕 save 将当前模型保存到文件 smps 将当前模型保存为MPS文件 10命令行窗口5 求解模型(Solution)go 求解当前模型 solu 显示当前模型的求解结果 6 编辑模型(Problem Editing)del 从当前模型中删除指定的某一行或某两行之间(包括这两行)的所有行 ext 在当前模型中添加几行 alt 用新字符串替换掉某一行中、或某两行之间的所有行中的旧字符串 7 退出系统(Quit)8 系统参数(System Parameters)page 以“
11、行”为单位设置每页长度 ter 以简略方式输出结果 ver 以详细方式输出结果 wid 以“字符”为单位设置显示和输出宽度 set 重新设置默认参数(SET SET parameter_nameparameter_name|parameter_indexparameter_index parameter_valueparameter_value )freeze 保存当前参数设置,以备下一次重新启动LINGO系统时还是这样的设置 time 显示本次系统的运行时间 LINGO WINDOWS命令 11 LINGO WINDOWS命令 状态窗口变量框(Variables)Total显示当前模型的全部
12、变量数,Nonlinear显示其中的非线性变量数,Integers显示其中的整数变量数约束(Constraints)框 Total显示当前模型扩展后的全部约束数,Nonlinear显示其中的非线性约束数。非线性约束是该约束中至少有一个非线性变量。如果一个约束中的所有变量都是定值,那么该约束就被剔除出模型(该约束为真),不计入约束总数中。非零(Nonzeroes)框 Total显示当前模型中全部非零系数的数目,Nonlinear显示其中的非线性变量系数的数目。内存使用(Generator Memory Used,单位:K)框 显示当前模型在内存中使用的内存量。可以通过使用LINGO|Option
13、s命令修改模型的最大内存使用量。已运行时间(Elapsed Runtime)框 显示求解模型到目前所用的时间,它可能受到系统中别的应用程序的影响。12域名域名含义含义可能的显示可能的显示ModelClass当前模型的类型当前模型的类型LP,QP,ILP,IQP,PILP,PIQP,NLP,INLP,PINLP(以(以I开头表示开头表示IP,以,以PI开头表开头表示示PIP)State当前解的状态当前解的状态GlobalOptimum,LocalOptimum,Feasible,Infeasible(不可行)(不可行),Unbounded(无界)(无界),Interrupted(中断)(中断),
14、Undetermined(未确定)(未确定)Objective当前解的目标函数值当前解的目标函数值实数实数Infeasibility当前约束不满足的总量(不是不满足的约当前约束不满足的总量(不是不满足的约束的个数)束的个数)实数(即使该值实数(即使该值=0,当前解也,当前解也可能不可行,因为这个量中没可能不可行,因为这个量中没有考虑用上下界形式给出的约有考虑用上下界形式给出的约束)束)Iterations目前为止的迭代次数目前为止的迭代次数非负整数非负整数求解器状态(Solver Status)框 显示当前模型求解器的运行状态。域的含义如下 LINGO WINDOWS命令 13 LINGO W
15、INDOWS命令 域名域名含义含义可能的显示可能的显示SolverType使用的特殊求解程序使用的特殊求解程序B-and-B(分枝定界法)(分枝定界法)Global(全局最优求解)(全局最优求解)Multistart(用多个初始点求(用多个初始点求解)解)BestObj目前为止找到的可行解的最佳目标函数目前为止找到的可行解的最佳目标函数值值实数实数ObjBound目标函数值的界目标函数值的界实数实数Steps特殊求解程序当前运行步数:特殊求解程序当前运行步数:分枝数(对分枝数(对B-and-B程序);程序);子问题数(对子问题数(对Global程序);程序);初始点数(对初始点数(对Multi
16、start程序)程序)非负整数非负整数Active有效步数有效步数非负整数非负整数扩展求解器状态(Extended Solver Status)框 显示LINGO中几个特殊求解器的运行状态。包括分枝定界求解器(Branch-and-Bound Solver)、全局求解器(Global Solver)和多初始点求解器(Multistart Solver)。该框中的域仅当这些求解器运行时才会更新。域的含义如下命令内容结束14LINGO有两种类型的集:原始集和派生集。一个原始集是由一些最基本的对象组成的。原始集是基本的对象,不能再被拆分成更小的组分 一个派生集是用一个或多个其它集来定义的,也就是说,
17、它的成员来自于其它已存在的集。一个模型可以没有集部分,或有一个简单的集部分,或有多个集部分。一个集部分可以放置于模型的任何地方,但是一个集及其属性在模型约束中被引用之前必须定义了它们 LINGO中的集15语法:setname/member_list/:attribute_list;注意:用“”表示该部分内容可选。Setname是集的名字,集名字必须严格符合标准命名规则:以拉丁字母或下划线(_)为首字符,其后由拉丁字母(AZ)、下划线、阿拉伯数字(0,1,9)组成的总长度不超过32个字符的字符串,且不区分大小写。注意:该命名规则同样适用于集成员名和属性名等的命名。Member_list是集成员列
18、表。如果集成员放在集定义中,那么对它们可采取显式罗列和隐式罗列两种方式。如果集成员不放在集定义中,那么可以在随后的数据部分定义它们。attribute_ list 可以指定一个或多个集成员的属性,属性之间必须用逗号隔开。定义原始集定义原始集16 当显式罗列成员时,必须为每个成员输入一个不同的名字,中间用空格或逗号搁开,允许混合使用。例定义一个名为students的原始集,它具有成员John、Jill、Rose和Mike,属性有sex和age:sets:students/John Jill,Rose Mike/:sex,age;endsets 当隐式罗列成员时,不必罗列出每个集成员。可采用如下语
19、法:setname/member1.memberN/:attribute_list;这里的member1是集的第一个成员名,memberN是集的最末一个成员名。LINGO将自动产生中间的所有成员名。定义原始集定义原始集17隐式成员列表格式隐式成员列表格式示例示例所产生集成员所产生集成员1.n1.51,2,3,4,5StringM.StringNCar2.car14Car2,Car3,Car4,Car14DayM.DayNMon.FriMon,Tue,Wed,Thu,FriMonthM.MonthNOct.JanOct,Nov,Dec,JanMonthYearM.MonthYearN Oct20
20、01.Jan2002Oct2001,Nov2001,Dec2001,Jan2002LINGO也接受一些特定的首成员名和末成员名,用于创建一些特殊的集。定义原始集定义原始集18 集成员不放在集定义中,而在随后的数据部分来定义。sets:students:sex,age;endsets data:students,sex,age=John 1 16 Jill 0 14 Rose 0 17 Mike 1 13;enddata 注意:在集部分只定义了一个集students,并未指定成员。在数据部分罗列了集成员John、Jill、Rose和Mike,并对属性sex和age分别给出了值。定义原始集定义原始
21、集19定义派生集定义派生集 语法定义一个派生集:setname(parent_set_list)/member_list/:attribute_list;setname是集的名字。parent_set_list是已定义的集的列表,多个时必须用逗号隔开。如果没有指定成员列表,那么LINGO会自动创建父集成员的所有组合作为派生集的成员。派生集的父集既可以是原始集,也可以是其它的派生集。sets:product/A B/;machine/M N/;week/1.2/;allowed(product,machine,week):x;endsets 20定义派生集定义派生集 成员列表被忽略时,派生集成员
22、由父集成员所有的组合构成,这样的派生集成为稠密集。如果限制派生集的成员,使它成为父集成员所有组合构成的集合的一个子集,这样的派生集成为稀疏集。同原始集一样,派生集成员的声明也可以放在数据部分。一个派生集的成员列表有两种方式生成:显式罗列;设置成员资格过滤器。当采用方式时,必须显式罗列出所有要包含在派生集中的成员,并且罗列的每个成员必须属于稠密集。使用前面的例子,显式罗列派生集的成员:allowed(product,machine,week)/A M 1,A N 2,B N 1/;如果需要生成一个大的、稀疏的集,可以把这些逻辑条件看作过滤器,把使逻辑条件为假的成员从稠密集中过滤掉。用竖线(|)来
23、标记一个成员资格过滤器的开始。21sets:students/John,Jill,Rose,Mike/:sex,age;linkmf(students,students)|sex(&1)#eq#1#and#sex(&2)#eq#0:friend;!男学生和女学生的友好程度大于0.5的集;linkmf2(linkmf)|friend(&1,&2)#ge#0.5:goodfriend;endsets data:sex,age=1 16 0 14 0 17 0 13;friend=0.3 0.5 0.6;enddata 定义派生集定义派生集 22LINGO中的集集合派生集合基本集合稀疏集合稠密集合元
24、素过滤法元素列表法直接列举法隐式列举法集合内容结束23模型的数据部分和初始部分模型的数据部分和初始部分 数据部分以关键字“data:”开始,以关键字“enddata”结束。在这里,可以指定集成员、集的属性。其语法如下:object_list=value_list;对象列(object_list)包含要指定值的属性名、要设置集成员的集名,用逗号或空格隔开。一个对象列中至多有一个集名,而属性名可以有任意多。如果对象列中有多个属性名,那么它们的类型必须一致。数值列(value_list)包含要分配给对象列中的对象的值,用逗号或空格隔开。注意属性值的个数必须等于集成员的个数。sets:set1/A,B
25、,C/:X,Y;endsets data:X=1,2,3;Y=4,5,6;enddata 等价地可以写成:sets:set1/A,B,C/:X,Y;endsets data:X,Y=1 4 2 5 3 6;enddata 24模型的数据部分和初始部分模型的数据部分和初始部分 参数参数 在数据部分也可以指定一些标量变量。当一个标量变量在数据部分确定时,称之为参数。data:X=.085;enddata 也可以同时指定多个参数。data:X,Y=.085.03;enddata 25模型的数据部分和初始部分模型的数据部分和初始部分 实时数据处理实时数据处理 在某些情况,模型中的某些数据并不是定值,我
26、们把这种情况称为实时数据处理。LINGO可以通过在本该放数的地方输入一个问号(?)。data:X,Y=.085?;enddata 每一次求解模型时,LINGO都会提示为参数Y输入一个值。在WINDOWS操作系统下,将会接收到一个对话框,直接输入一个值再点击OK按钮,LINGO就会把输入的值指定给Y,然后继续求解模型。除了参数之外,也可以实时输入集的属性值,但不允许实时输入集成员名。26模型的数据部分和初始部分模型的数据部分和初始部分 指定属性为一个值指定属性为一个值 可以在数据声明的右边输入一个值来把所有的成员的该属性指定为一个值。sets:days/MO,TU,WE,TH,FR,SA,SU/
27、:needs;endsets data:needs=20;enddata LINGO将用20指定days集的所有成员的needs属性。sets:days/MO,TU,WE,TH,FR,SA,SU/:needs,cost;endsets data:needs cost=20 100;enddata 27数据部分的未知数值数据部分的未知数值 有时只想为一个集的部分成员的某个属性指定值,而让其余成员的该属性保持未知,以便让LINGO去求出它们的最优值。在数据声明中输入两个相连的逗号表示该位置对应的集成员的属性值未知。两个逗号间可以有空格。sets:years/1.5/:capacity;endset
28、s data:capacity=,34,20,;enddata 属性capacity的第2个和第3个值分别为34和20,其余的未知。模型的数据部分和初始部分模型的数据部分和初始部分 28模型的初始部分模型的初始部分 在初始部分输入的值仅被LINGO求解器当作初始点来用,并且仅仅对非线性模型有用。一个初始部分以“init:”开始,以“endinit”结束。init:X,Y=0,.1;endinit Y=log(X);X2+Y2=1;模型的数据部分和初始部分模型的数据部分和初始部分 数据内容结束29LINGO函数 LINGO有9种类型的函数:1 基本运算符:包括算术运算符、逻辑运算符和关系运算符
29、2 数学函数:三角函数和常规的数学函数 3 金融函数:LINGO提供的两种金融函数 4 概率函数:LINGO提供了大量概率相关的函数 5 变量界定函数:这类函数用来定义变量的取值范围 6 集操作函数:这类函数为对集的操作提供帮助 7 集循环函数:遍历集的元素,执行一定的操作的函数 8 数据输入输出函数:这类函数允许模型和外部数据源相联系,进行数据的输入输出 9 辅助函数:各种杂类函数 30LINGO函数 算术运算符 乘方 乘 除 加 减 LINGO唯一的一元算术运算符是取反函数“”。关系运算符关系运算符 关系运算符主要是被用在模型中,来指定一个表达式的左边是否等于、小于等于、或者大于等于右边,
30、形成模型的一个约束条件。LINGO有三种关系运算符:“=”、“=”。LINGO中还能用“”表示大于等于关系。LINGO并不支持严格小于和严格大于关系运算符。严格小于为:A+=B31LINGO函数 逻辑运算符逻辑运算符 在LINGO中,逻辑运算符主要用于集循环函数的条件表达式中,来控制在函数中哪些集成员被包含,哪些被排斥。在创建稀疏集时用在成员资格过滤器中。#not#否定该操作数的逻辑值,not是一个一元运算符#eq#若两个运算数相等,则为true;否则为flase#ne#若两个运算符不相等,则为true;否则为flase#gt#若左边的运算符严格大于右边的运算符,则为true;否则为flase
31、#ge#若左边的运算符大于或等于右边的运算符,则为true;否则为flase#lt#若左边的运算符严格小于右边的运算符,则为true;否则为flase#le#若左边的运算符小于或等于右边的运算符,则为true;否则flase#and#仅当两个参数都为true时,结果为true;否则为flase#or#仅当两个参数都为false时,结果为false;否则为true 32下面给出以上三类操作符的优先级:高#not#(取反)#eq#ne#gt#ge#lt#le#and#or#低 =LINGO函数 33LINGO函数 数学函数数学函数 LINGO提供了大量的标准数学函数:abs(x)返回x的绝对值 s
32、in(x)返回x的正弦值,x采用弧度制 cos(x)返回x的余弦值 tan(x)返回x的正切值 exp(x)返回常数e的x次方 log(x)返回x的自然对数 lgm(x)返回x的gamma函数的自然对数 sign(x)如果x=0时,返回不超过x的最大整数;当x0时,返回不低于x的最大整数。smax(x1,x2,xn)返回x1,x2,xn中的最大值 smin(x1,x2,xn)返回x1,x2,xn中的最小值34LINGO函数 金融函数金融函数 1fpa(I,n)返回如下情形的净现值:单位时段利率为I,连续n个时段支付,每个时段支付单位费用。若每个时段支付x单位的费用,则净现值可用x乘以fpa(I
33、,n)算得。例 贷款买房问题 贷款金额50000元,贷款年利率5.31%,采取分期付款方式(每年年末还固定金额,直至还清)。问拟贷款10年,每年需偿还多少元?LINGO代码如下:50000=x*fpa(.0531,10);答案是x=6573.069元。2fpl(I,n)返回如下情形的净现值:单位时段利率为I,第n个时段支付单位费用。35概率函数概率函数 1pbn(p,n,x)二项分布的累积分布函数。当n和(或)x不是整数时,用线性插值法进行计算。2pcx(n,x)自由度为n的2分布的累积分布函数。3peb(a,x)当到达负荷为a,服务系统有x个服务器且允许无穷排队时的Erlang繁忙概率。4p
34、el(a,x)当到达负荷为a,服务系统有x个服务器且不允许排队时的Erlang繁忙概率。5pfd(n,d,x)自由度为n和d的F分布的累积分布函数。6pfs(a,x,c)当负荷上限为a,顾客数为c,平行服务器数量为x时,有限源的Poisson服务系统的等待或返修顾客数的期望值。a是顾客数乘以平均服务时间,再除以平均返修时间。当c和(或)x不是整数时,采用线性插值进行计算。7phg(pop,g,n,x)超几何(Hypergeometric)分布的累积分布函数。pop表示产品总数,g是正品数。从所有产品中任意取出n(npop)件。pop,g,n和x都可以是非整数,这时采用线性插值进行计算。LING
35、O函数 36概率函数概率函数8ppl(a,x)Poisson分布的线性损失函数,即返回max(0,z-x)的期望值,其中随机变量z服从均值为a的Poisson分布。9pps(a,x)均值为a的Poisson分布的累积分布函数。当x不是整数时,采用线性插值进行计算。10psl(x)单位正态线性损失函数,即返回max(0,z-x)的期望值,其中随机变量z服从标准正态分布。11psn(x)标准正态分布的累积分布函数。12ptd(n,x)自由度为n的t分布的累积分布函数。LINGO函数 3713qrand(seed)产生服从(0,1)区间的拟随机数。qrand只允许在模型的数据部分使用,它将用拟随机数
36、填满集属性。通常,声明一个mn的二维表,m表示运行实验的次数,n表示每次实验所需的随机数的个数。model:data:M=4;N=2;seed=1234567;enddata sets:rows/1.M/;cols/1.N/;table(rows,cols):x;endsets data:X=qrand(seed);enddata end LINGO函数 3814rand(seed)返回0和1间的伪随机数,依赖于指定的种子。典型用法是U(I+1)=rand(U(I)。注意如果seed不变,那么产生的随机数也不变。model:sets:series/1.15/:u;endsets u(1)=ra
37、nd(.1234);for(series(I)|I#GT#1:u(I)=rand(u(I-1);end LINGO函数 39LINGO函数 变量界定函数变量界定函数 变量界定函数实现对变量取值范围的附加限制,共4种:bin(x)限制x为0或1 bnd(L,x,U)限制LxU free(x)取消对变量x的默认下界为0的限制,即x可以取任意实数 gin(x)限制x为整数 在默认情况下,LINGO规定变量是非负的,也就是说下界为0,上界为+。free取消了默认的下界为0的限制,使变量也可以取负值。bnd用于设定一个变量的上下界,它也可以取消默认下界为0的约束。40LINGO函数 集操作函数集操作函数
38、 1in(set_name,primitive_index_1,primitive_index_2,)如果元素在指定集中,返回1;否则返回0。sets:I/x1.x4/;B(I)/x2/;C(I)|#not#in(B,&1):;endsets&1表示对应第一个父集合的元素的索引值2index(set_name,primitive_set_element)该函数返回在集set_name中原始集成员primitive_set_element的索引。3size(set_name)该函数返回集set_name的成员个数。在模型中明确给出集大小时最好使用该函数。它的使用使模型更加数据中立,集大小改变时也
39、更易维护。41集循环函数集循环函数 集循环函数遍历整个集进行操作,其语法为function(setname(set_index_list)|conditional_qualifier:expression_list);function相应于下面罗列的四个集循环函数之一;setname是要遍历的集set_ index_list是集索引列表;conditional_qualifier是用来限制集循环函数的范围。expression_list是被应用到每个集成员的表达式列表LINGO函数 42LINGO函数 1for 该函数用来产生对集成员的约束。基于建模语言的标量需要显式输入每个约束,不过for函
40、数允许只输入一个约束,然后LINGO自动产生每个集成员的约束。产生序列1,4,9,16,25 model:sets:number/1.5/:x;endsets for(number(I):x(I)=I2);end 43LINGO函数 2sum 该函数返回遍历指定的集成员的一个表达式的和。例 求向量5,1,3,4,6,10前5个数的和。model:data:N=6;enddata sets:number/1.N/:x;endsets data:x=5 1 3 4 6 10;enddata s=sum(number(I)|I#le#5:x);end 44LINGO函数 3.min和max 返回指定
41、的集成员的一个表达式的最小值或最大值。例 求向量5,1,3,4,6,10前5个数的最小值,后3个数的最大值。model:data:N=6;enddata sets:number/1.N/:x;endsets data:x=5 1 3 4 6 10;enddata minv=min(number(I)|I#le#5:x);maxv=max(number(I)|I#ge#N-2:x);end45LINGO函数 输入和输出函数输入和输出函数 1file函数 该函数用从外部文件中引入数据或文本,可以放在模型中任何地方。该函数的语法格式为file(filename)。这里filename是文件名(可以带
42、有路径,也可以没有表示当前目录),该文件中记录之间用分开2text函数 该函数被用在数据部分用来把解输出至文本文件中。它可以输出集成员和集属性值。其语法为 text(filename),文件名可以带有路径,没有指定路径时表示在当前目录下生成这个文件3ole函数 OLE是从EXCEL中引入或输出数据的接口函数,它是基于传输的OLE技术。OLE函数可在数据部分和初始部分引入数据。其语法为:Ole(Filename,Range-name-list)在EXCEL中定义Ranges名:按鼠标左键拖曳选择Range,释放鼠标按钮,选择“插入|名称|定义”,输入希望的名字,点击“确定”按钮。Ole(file
43、name,rangename),从文件中rangename所指示的单元中取出数据X,y,z=Ole(filename),没指明哪个单元格赋值,采取默认方式(与接收变量的名称相同)从文件中的x,y,z指定的单元格赋值给三个变量ole(filename,rangename)=m,将m输出赋给rangename指定单元格46MODEL: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
44、,5,4,7,6,11;e=20,20;text(out.txt)=supply料场的合适位置为x,y;enddatainit:x,y=5,1,2,7;endinitOBJ min=sum(link(i,j):c(i,j)*(x(j)-a(i)2+(y(j)-b(i)2)(1/2);For(demand(i):DEMAND_CON sum(supply(j):c(i,j)=d(i););for(supply(i):SUPPLY_CON sum(demand(j):c(j,i)=e(i););ENDLINGO函数 47model:sets:product;machine;week;allowed
45、(product,machine,week):x,y;endsetsdata:rate=0.01;product,machine,week,allowed,x,y=ole(import.xls);ole(import.xls)=rate;enddataLINGO函数 48LINGO函数 产品机器周AM1 BN2 3 允许的集合AM1 xyAN2 122BN1 210014rate0.01import.xls49model:sets:a/file(1_2.txt)/:capacity;b/file(1_2.txt)/:demand;links(a,b):c,x;endsets min=sum(links:c*x);!需求约束;for(b(J):sum(a(I):x(I,J)=demand(J);!产量约束;for(a(I):sum(b(J):x(I,J)=30;end 2warn(text,logical_condition)如果逻辑条件logical_condition为真,则产生一个内容为text的信息框。model:x=1;warn(x是正数,x#gt#0);end LINGO函数 函数内容结束5455
限制150内