1、LINGO的基本用法和运算函数LINGO的基本用法和运算函数我们遇到的许多优化问题可以归结为规划问题,例如线性规划、非线性规划、二次规划、整数规划、动态规划、多目标规划等等。当变量比较多时,想用手工计算来求解这类问题几乎是不可能的,编程计算虽然可行,但工作量大,程序长而繁,稍不小心就容易出错,可行的办法是用现成软件求解LINGO是专门用来求解各种规划问题的软件包,其功能十分强大,是解决最优化问题的最佳选择。 LINGO的基本用法和运算函数 LINGO 入门 LINGO的基本用法和运算函数一、概况LINGO是美国LINDO系统公司(Lindo SystemInc)开发的求解数学规划系列软件中的一
2、个(其它软件为LINDO,GINO,Whats Best等等),的主要功能是求解大型线性、非线性和整数规划,目前的版本是可以从Internet网址 :/下载该软件的安装文件,执行该文件即可在计算机内安装LINGO 软件系统,首次运行该软件时,要求用户输入密码,如果输入了正确的密码,则该软件就成了正式版,如果密码不对或不输入密码,则该软件就成为演示版LINGO的基本用法和运算函数LINGO的不同版本对模型的变量和约束条件的数量作出不同的限制,如下表所示: 版 本变量总数非线性变量整数变量约束条件数量Demo3003030150Solve Suite5005050250Super200020020
3、01000Hyper80008008004000Industrial320003200320016000LINGO的基本用法和运算函数LINGO 的主要功能特色为:1. 输入模型简便直观;2. 运行速度很快;3. 内置建模语言,提供几十个内部函数,从而能以较少语句,较直观的方式描述较大规模的优化模型;4. 把集合的概念引入编程语言,很容易将实际问题转换为LINGO模型;5. 能方便地与EXCEL、数据库等其它软件交换数据 LINGO的基本用法和运算函数二、LINGO的基本用法启动LINGO后,在主窗口上弹出标题为“LINGO Model-LINGO1”(模型)的窗口,用于输入模型,你可以在该窗
4、口内用基本类似于数学公式的形式输入小型规划模型通常,模型有以下三部分所组成:1.目标函数(求某个数学表达式的最大值或最小值);2. 决策变量,即目标函数值取决于哪些变量;3. 约束条件,即对变量附加一些条件限制(等式或不等式) LINGO的基本用法和运算函数例1:某工厂有两条生产线,分别用来生产M和P两种型号的产品,利润分别为200元/个和300元/个,生产线的最大生产能力分别为每日100和120,生产线每生产一个M产品需要1个劳动日进行调试、检测等工作,而每个P产品需要2个劳动日,该厂每天只有160个劳动日可用,假如原材料等其它条件不受限制,问应如何安排生产计划,使获得的利润最大?设两种产品
5、的生产量分别为x1和x2,则该问题的数学模型为:目标函数 :Max z=200 x1+300 x2LINGO的基本用法和运算函数约束条件:x1100,x2120,x1+2x2160,x1,x20。在Model窗口内输入 MAX=200*X1+300*X2; X1=100; X2=120; X1+2*X2=160; 注:LINGO默认所有决策变量都大于零,因而变量非负条件可以不必输入选菜单 As(或按F5)将输入的模型存盘,默认文件格式为扩展名 .lg4选(或按F7)可以在打印机上输出该模型 LINGO的基本用法和运算函数LINGO的语法规定:1. 求目标函数的最大值或最小值分别用MAX=或MI
6、N=来表示;2. 每个语句必须以分号“;”结束,语句可以跨行;3. 变量名称必须以字母(AZ)开头,由字母、数字(09)和下划线所组成,长度不超过32个字符,不区分大小写;4. 可以给语句加上标号,例如OBJ MAX=200*X1+300*X2;5.以!开头的语句是注释语句LINGO的基本用法和运算函数6. 默认变量非负,用free(x)可以解除非负限制。7. LINGO模型以语句“MODEL:” 开头,以语句“END”结束,对于比较简单的模型,这两个语句可以省略。LINGO的基本用法和运算函数选菜单Lingo|Solve(或按Ctrl+S),或鼠标点击“求解”按钮,如果模型有语法错误,则弹出
7、一个标题为“LINGO Error Message”(错误信息)的窗口,指出错误的编号,改正错误以后再求解,如果语法通过,LINGO用内部所带的求解程序解出所给模型的解,然后弹出一个标题为“LINGO Solver Status”(求解状态)的窗口,其内容为变量个数、约束条件个数、优化状态、非零变量个数、耗费内存、所花时间等等信息,点击Close关闭该窗口,屏幕上出现标题为“Solution Report”(解的报告)的信息窗口,显示优化计算的步数、优化后的目标函数值、列出各变量的计算结果,具体内容如下: LINGO的基本用法和运算函数Global optimal solution found
8、 at step: 2 Variable Value Reduced Cost Row Slack or Surplus Dual Price 4 0.0000000 150.0000 LINGO的基本用法和运算函数该报告说明, 2步找到全局最优解,目标函数值为29000,变量值分别为X1100,X230,“Row”指的是输入模型中的行号,“Slack or Surplus”的意思为松弛或剩余,“Dual Price”的意思是影子价格,如报告中Row 2的剩余为0,意思是说第二行的约束条件,即第一条生产线最大生产能力没有剩余,影子价格为50,含义是:如果该生产线最大生产能力增加1,能使目标函数
9、值,即利润增加50,由29000增加到29050报告中Row 4的剩余为0,意思是说第四行的约束条件,即劳动日资源已经全部用完,影子价格为150,含义是:如果增加1个劳动日资源,能使目标函数值,即利润增加150,达到29150元以上结果可以保存到文件中(扩展名为.lgr),也可以通过打印机打印出来 LINGO的基本用法和运算函数例2:求函数的最小值 解:显然,当x=-2,y=2时,z取得最小值0为了允许变量x取负数,用free函数,程序如下:MIN=(x+2)2+(y-2)2;free(x);求解得结果为:Local optimal solution found at iteration: 4
10、5 计算误差使得目标函数值非零LINGO的基本用法和运算函数例3 基金的优化使用 (参见2001年竞赛C题)(1) 问题的提出 假设某校基金会得到了一笔数额为M万元的基金,打算将其存入银行,校基金会计划在n年内每年用部分本息奖励优秀师生,要求每年的奖金额相同,且在n年末仍保留原基金数额银行存款税后年利率见下表:校基金会希望获得最佳的基金使用计划,以提高每年的奖金额,请在M=5000万元、n=5年的情况下设计具体存款方案存期1年2年3年5年税后利率(%)1.82.162.5922.88LINGO的基本用法和运算函数(2) 问题的分析:假定首次发放奖金的时间是在基金到位后一年,以后每隔一年发放一次
11、,每年发放的时间大致相同,校基金会希望获得最佳的基金使用计划,以提高每年的奖金额,且在n年末仍保留原基金数额M,实际上n年中发放的奖金总额全部来自于利息如果全部基金都存为一年定期,每年都用到期利息发放奖金,则是没有优化的存款方案,每年的奖金数为50000.018=90万元显然,准备在两年后使用的款项应当存成两年定期,比存两次一年定期的收益高,依此类推目标是合理分配基金的存款方案,使得n年的利息总额最多 LINGO的基本用法和运算函数定义 收益比a(本金+利息)/本金。于是存2年的收益比为a2=1+2.16%经分析得到两点结论:1.一次性存成最长期,优于两个(或两个以上)较短期的组合(中途转存)
12、。 2.当存款年限需要组合时,收益比与组合的先后次序无关。存款年限及相应的最优收益比存款年限1年2年3年4年(3+1)5年收益比ai1.0181.04321.077761.097159681.144LINGO的基本用法和运算函数(3) 建立模型把总基金M分成5+1份,分别用x1,x5,x6表示,其中x1,x5分别表示计划用于第i年发放奖金的一部分初始基金(单位:万元),x6表示用来使5年末本息合计等于原基金总数的那部分初始基金用S表示每年用于奖励优秀师生的奖金额,用ai表示第i年的最优收益比 目标函数为 max S 约束条件有3个:各年度的奖金数额相等;初始基金总数为M;n年末保留原基金总额M
13、于是得到模型如下:LINGO的基本用法和运算函数目标函数: MAX S约束条件:这是线性规划模型,可以用LINGO软件求解令M=5000、n=5,程序为MAX=S; 1.018*x1=S; 1.0432*x2=S;1.07776*x3=S; 1.07776*1.018*x4=S;1.144*x5=S; 1.144*x6=M; M=5000;x1+x2+x3+x4+x5+x6 =M; LINGO的基本用法和运算函数(4) 优化结果最优存款方案:x1,x5,x6 分别为(单位:万元 )每年度的奖金数额为万元。LINGO的基本用法和运算函数1.2 用LINGO编程语言建立模型前面介绍的基本方法,优点
14、是输入模型较直观,通常的数学表达式(目标函数表达式、约束条件)无须作大的变换即可直接输入对于规模较小的规划模型,用直接输入的方式是有利的,如果模型的变量和约束条件个数都比较多,若仍然用直接输入方式,虽然也能求解,但是这种做法有明显的不足之处:模型的篇幅很长,不便于分析修改和扩展。LINGO的基本用法和运算函数例如,目标函数中有求和表达式CijXij(i从1到10,j从1到20),若用直接输入的方式,将有200个系数与200个变量相乘再相加,需要输入长长一大串,既不便于输入,又不便于修改,别人看不懂,可读性较差 LINGO提供了建模语言,能够用较少语句描述目标函数和约束条件,为建立大规模数学规划
15、模型提供了方便我们以一个运输规划模型为例说明其用法。LINGO的基本用法和运算函数一、LINGO模型的基本组成LINGO将集合(SET)的概念引入建模语言为建立大规模数学规划模型提供了方便。用LINGO语言编写程序来表达一个实际问题,称之为LINGO模型,下面以一个运输规划模型为例说明LINGO模型的基本组成。LINGO的基本用法和运算函数例:某公司有6个供货栈(仓库),库存货物总数分别为60,55,51,43,41,52,现有8个客户各要一批货,数量分别为35,37,22,32,41,32,43,38各供货栈到8个客户处的单位货物运输价如表1所示(元/每单位)。试确定各货栈到各客户处的货物调
16、运数量,使总的运输费用最小 LINGO的基本用法和运算函数表1. 单位货物运输价 (元)V1V2V3V4V5V6V7V8W162674259W249538582W352197435W476739271W523957265W655228143LINGO的基本用法和运算函数先建立本问题的数学模型,引入决策变量xij,代表从第i个货栈到第j个客户的货物运量用符号cij表示从第i个货栈到第j个客户的单位货物运价,ai表示第i个货栈的最大供货量,dj表示第j个客户的订货量,则本问题的数学模型为:目标函数 MIN 约束条件非负条件 xij 0,i=1,2,6,j=1,2, ,8LINGO的基本用法和运算函
17、数1. 集合定义部分LINGO将集合(SET)的概念引入建模语言,集合是一组对象构成的组合,代表模型中的实际事物,并与数学变量及常量联系起来,是实际问题到数学的抽象。例题中6个货栈可以看成是一个集合,8个客户是另一个集合。定义集合时要明确三个方面内容,集合的名称,集合内的成员(组成集合的个体,也称成员),集合的属性(与该集合有关的变量及常量,相当于数组)此处先定义一个集合: WH/W1.W6/:AI;LINGO的基本用法和运算函数其中WH是集合名称,W1.W6表示集合内的成员共有6个,表示6个供货栈,“.”是特定的省略号(如果不用该省略号,也可以把集合成员一一罗列出来,成员之间用逗号或空格分开
18、) ,AI是集合的属性,属性可以看成是一个一维数组,它有6个分量,分别表示各货栈现有货物的总数集合、成员、属性的命名规则与变量相同,可按自己的意愿,用有一定意义的字母数字串来表示,式中“/”和“/:”是规定的语法规则,成员之间的逗号可用空格来代替 LINGO的基本用法和运算函数再定义集合:VD/V1.V8/:DJ;该集合表示客户,它有8个成员所组成,其属性DJ(有8个分量)表示各客户的需求量以上两个集合称为初始集合,其属性都是一维数组 LINGO的基本用法和运算函数为了表示数学模型中的cij和xij,再定义一个表示运输关系(路线)的集合: LINKS(WH,VD):C,X;该集合以初始集合WH
19、和VD为基础,称为衍生集合,类似于矩阵(二维数组),它的行数与集合WH的成员个数相等,它的列数与集合VD的成员个数相等,因而该集合共有48个成员,式中定义了两个属性:C和X,相应地,C和X都相当于二维数组,各有48个分量,C表示货栈i到客户j的单位货物运价,X表示货栈i到客户j的货物运量 LINGO的基本用法和运算函数衍生集合的定义语句有如下要素组成:(1) 集合的名称;(2) 对应的初始集合;(3) 集合的成员(可以省略不写明);(4) 集合的属性(可以没有)定义衍生集合时可以用罗列的方式将衍生集合的成员一一列出来,如果省略不写,则默认衍生集合的成员取它所对应初始集合的所有可能的组合,上述衍
20、生集合LINKS的定义中没有指明成员,而它对应的初始集合WH有6个成员,VD有8个成员,因此LINKS成员取WH和VD的所有可能组合,即集合LINKS有48个成员 LINGO的基本用法和运算函数完整的集合定义为:SETS: WH/W1.W6/:AI; VD/V1.V8/:DJ; LINKS(WH,VD):C,X;ENDSETS注:集合定义部分以语句SETS:开始,以语句ENDSETS结束,这两个语句必须单独成一行 ENDSETS的后面不加标点符号。 LINGO的基本用法和运算函数2数据初始化(数据段)以上集合中属性X(有48个分量)是决策变量,属性AI、DJ、C(分别有6、8、48个分量)都是
21、已知数,需对它们赋以初始值,LINGO通过数据初始化部分来实现,语句格式为:LINGO的基本用法和运算函数DATA: AI=60,55,51,43,41,52; DJ=35,37,22,32,41,32,43,38; C=6,2,6,7,4,2,5,9 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,5 5,5,2,2,8,1,4,3;ENDDATA 注:数据初始化部分以语句DATA:开始,以语句ENDDATA结束,这两个语句必须单独成一行数据之间的逗号和空格可以互相替换 LINGO的基本用法和运算函数3目标函数和约束
22、条件 目标函数中的表达式用LINGO语句表示为:MIN=SUM(LINKS(I,J):C(I,J)*X(I,J);式中SUM是LINGO提供的内部函数,其作用是对某个集合的所有成员,求某个表达式的和,该函数需要两个参数,第一个参数为集合名称,指定对该集合的所有成员求和,如果此集合是一个初始集合,它有m个成员,则求和运算对这m个成员进行,第二个参数是一个表达式,表示求和运算对该表达式进行LINGO的基本用法和运算函数此处SUM的第一个参数是LINKS(I,J),表示求和运算对衍生集合LINKS进行,该集合的维数是二,共有48个成员,运算规则是:先对48个成员分别求表达式C(I,J)*X(I,J)
23、的值,然后求和,表达式中的C和X是集合LINKS的两个属性,它们各有48个分量如果表达式中参与运算的属性属于同一个集合,则SUM语句中的索引(相当于矩阵或数组的下标)可以省略(隐藏),假如表达式中参与运算的属性属于不同的集合,则不能省略属性的索引 目标函数可以简写为 MIN=SUM(LINKS:C*X)LINGO的基本用法和运算函数约束条件xijai实际上包含了6个不等式,LINGO语句为:FOR(WH(I):SUM(VD(J):X(I,J)=AI(I);语句中的FOR 是LINGO提供的内部函数,它的作用是对某个集合的所有成员各生成一个约束表达式,它有两个参数,第一个参数是集合名,表示对该集
24、合的所有成员来生成约束表达式,此参数现为WH,它表示货栈,共有6个成员,故应生成6个约束表达式,第二个参数是约束表达式的具体内容,这里再调用SUM函数,表示约束表达式的左边是求和,是对集合VD的8个成员求和,是对表达式X(I,J)中的第二维J求和,即LINGO的基本用法和运算函数约束表达式的右边是集合WH的属性AI。它有6个分量,与6个约束表达式一一对应。类似地,约束条件用LINGO语句表示为:FOR(VD(J):SUM(WH(I):X(I,J)=DJ(J);LINGO的基本用法和运算函数4完整的模型综上所述,完整的LINGO模型如下:MODEL: SETS: WH/W1.W6/:AI; VD
25、/V1.V8/:DJ; LNKS(WH,VD):C,X;ENDSETSLINGO的基本用法和运算函数 DATA: AI=60,55,51,43,41,52; DJ=35,37,22,32,41,32,43,38; C=6,2,6,7,4,2,5,9 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,5 5,5,2,2,8,1,4,3; ENDDATA MIN=SUM(LINKS:C*X); FOR(WH(I):SUM(VD(J):X(I,J)=AI(I); FOR(VD(J):SUM(WH(I):X(I,J)=DJ(J)
26、;ENDLINGO的基本用法和运算函数注:LINGO模型以语句MODEL:开始,以语句END结束,这两个语句单独成一行,模型分为集合定义部分、数据初始化部分、目标函数、约束条件,这几个部分的先后次序无关紧要,!开头的语句是注释语句,在模型中可有可无选菜单Lingo|Solve(或按Ctrl+S),或鼠标点击“求解”按钮,在“Solution Report”信息窗口中,看到具体求解结果。Global optimal solution found at step: 17(17步找到全局最优解)(目标函数值) LINGO的基本用法和运算函数 Variable Value Reduced Cost(以
27、下是调运方案) (以上省略了X( W1, V3)至X( W6, V5)的具体数值)LINGO的基本用法和运算函数表2. 最优运输方案 V1V2V3V4V5V6V7V8合计W1019004100060W210032000033W3011000040051W400000503843W534700000041W6002200273052合计3537223241324338LINGO的基本用法和运算函数二、LINGO建模语言的优点 1. 对大规模数学规划,LINGO语言所建模型较简洁,语句不多; 2. 模型易于扩展,因为FOR、SUM等语句并没有指定循环或求和的上下限,如果在集合定义部分增加集合成员的
28、个数,则循环或求和自然扩展,不需要改动目标函数和约束条件; 3. 数据初始化部分与其它部分语句分开,对同一模型用不同数据来计算时,只需改动数据部分即可,其它语句不变; LINGO的基本用法和运算函数4. “集合”是LINGO有特色的概念,它把实际问题中的事物与数学变量及常量联系起来,是实际问题到数学量的抽象,它比C语言中的数组用途更为广泛。 5. 使用了集合以及FOR、SUM等集合操作函数以后可以用简洁的语句表达出常见的规划模型中的目标函数和约束条件,即使模型有大量决策变量和大量数据,组成模型的语句并不随之增加 LINGO的基本用法和运算函数1.3 LINGO的菜单 LINGO的基本用法和运算
29、函数一、文件菜单() 1 新建(New)选用“新建”命令、单击“新建”按钮或直接按F2键可以创建一个新的“Model”窗口。在这个新的“Model”窗口中能够输入所要求解的模型。2 打开(Open)选用“打开”命令、单击“打开”按钮或直接按F3键可以打开一个已经存在的文本文件。这个文件可以是一个Model文件。3 保存(Save)选用“保存”命令、单击“保存”按钮或直接按F4键用来保存当前活动窗口(最前台的窗口)中的模型结果、命令序列等保存为文件。 LINGO的基本用法和运算函数4 另存为(Save As) 选用“另存为”命令或按F5键可以将当前活动窗口中的内容保存为文本文件,其文件名为你在“
30、另存为”对话框中输入的文件名。利用这种方法你可以将任何窗口的内容如模型、求解结果或命令保存为文件。5 关闭(Close) 选用“关闭”(Close)命令或按F6键将关闭当前活动窗口。如果这个窗口是新建窗口或已经改变了当前文件的内容,LINGO系统将会提示是否想要保存改变后的内容。6 打印(Print)选用“打印” (Print)命令、单击“打印”按钮或直接按F7键可以将当前活动窗口中的内容发送到打印机。 LINGO的基本用法和运算函数7 打印设置(Print Setup) 在文件菜单中选用“打印设置”命令或直接按F8键可以将文件输出到指定的打印机。8 打印预览(Print Preview) 在
31、文件菜单中选用“打印预览”命令或直接按Shift+F8键可以进行打印预览。9 输出到日志文件(Log Output) 从文件菜单中选用“Log Output”命令或按F9键打开一个对话框,将原来输出到报告窗口的内容输出到文本文件中。LINGO的基本用法和运算函数10提交LINGO命令脚本文件(Take Commands) 从文件菜单中选用“Take Commands”命令或直接按F11键就可以将LINGO命令脚本(command script)和模型文件打包成批处理文件,以便自动执行。11引入LINDO文件(Import LINDO File)从文件菜单中选用“Import LINDO Fil
32、e”命令或直接按F12键可以打开一个LINDO格式模型的文件,然后LINGO系统会尽可能把模型转化为LINGO语法允许的程序。LINGO的基本用法和运算函数12. 输出特殊格式文件(Export File)输出MPS或者MPI格式文件,这是IBM开发的工业标准格式。 13. 软件注册(License)如果安装时没有注册码,后来得到了注册码,可以在这里输入,以便使LINGO软件从学习版升级成正式版。14. 用户基本信息(Database User Info)显示用户的基本信息(姓名和密码)15退出(Exit)用“Exit”命令或直接按F10键可以退出LINGO系统。LINGO的基本用法和运算函数
33、二、编辑菜单(Edit Menu) 1恢复(Undo)从编辑菜单中选用“恢复”(Undo)命令或按Ctrl+Z组合键,将撤销上次操作、恢复至其前的状态。2. 重新执行(Redo)重新执行上次撤销上次操作。快捷键Ctrl+Y。3剪切(Cut)从编辑菜单中选用“剪切”(Cut)命令或按Ctrl+X组合键可以将当前选中的内容剪切至剪贴板中。4复制(Copy)从编辑菜单中选用“复制”(Copy)命令、单击“复制”按钮或按Ctrl+C组合键可以将当前选中的内容复制到剪贴板中。 LINGO的基本用法和运算函数5粘贴(Paste)选用“粘贴”(Paste)命令、单击“粘贴”按钮或按Ctrl+V组合键可以将粘
34、贴板中的当前内容复制到当前插入点的位置。6粘贴特定.(Paste Special。)与上面的命令不同,它可以实现非文本内容的传送,例如把EXCEL中的数据复制到LINGO窗口。7全选(Select All)从编辑菜单中选用“Select All”命令或按Ctrl+A组合键可选定当前窗口中的所有内容。8. 查找(Find)查找词或短语。快捷键Ctrl+F。LINGO的基本用法和运算函数9. 查找下一个(Find Next)往下查找刚才查找的词或短语。10. 替换(Replace)用别的词或短语替换查找到的词或短语。11. 光标移到某一行(Go To Line)将光标移到某一行,在弹出窗口中输入数
35、字,例如输入8,则到第8行。12匹配括号(Match Parenthesis)选用“Match Parenthesis”命令、单击“Match Parenthesis”按钮或按Ctrl+P组合键可以为当前选中的括号查找与它匹配的另一半括号。LINGO的基本用法和运算函数13. 粘贴函数(Paste Function)将LINGO的内部函数粘贴到当前插入点。14. 选择字体(Select Font)为当前窗口选择合适的字体来显示窗口内容。15. 插入新对象(Insert New Object) 弹出一个对话框,列出各种对象,选择需要的一种,插入到模型中的当前位置。16. 连接(Links)修改模
36、型内插入对象的连接性质。17. 对象的性质(Object Properties)查看插入对象的性质。18. 打开或编辑对象(Chart)LINGO的基本用法和运算函数三、LINGO菜单1求解模型(Slove)用“求解”命令、单击“Slove”按钮或按Ctrl+S组合键可以求解当前模型。 2 求解结果(Solution)用“Solution”命令、单击“Solution”按钮或直接按Ctrl+O组合键可以打开求解结果的对话框。允许选择文本方式或图表方式查看求解的结果。LINGO的基本用法和运算函数3灵敏性分析(Range,Ctrl+R)用该命令产生当前模型的灵敏性分析报告:研究当目标函数的费用系
37、数和约束右端项在什么范围(此时假定其它系数不变)时,最优解保持不变。灵敏性分析是在求解模型时作出的,因此在求解模型时灵敏性分析是激活状态,但是默认是不激活的。为了激活灵敏性分析,运行LINGO|Options,选择General Solver Tab, 在Dual Computations列表框中,选择Prices and Ranges选项。灵敏性分析耗费相当多的求解时间,因此当速度很关键时,就没有必要激活它。LINGO的基本用法和运算函数4选项(Options,Ctrl+I)设置一些影响LINGO模型求解时的参数。该命令将打开一个含有7个选项卡的窗口,你可以通过它修改LINGO系统的各种参数
38、和选项。修改完以后,你如果单击“Apply(应用)”按钮,则新的设置马上生效;如果单击“OK(确定)”按钮,则新的设置马上生效,并且同时关闭该窗口。如果单击“Save(保存)”按钮,则将当前设置变为默认设置,下次启动LINGO时这些设置仍然有效。单击“Default(缺省值)”按钮,则恢复LINGO系统定义的原始默认设置(缺省设置)。详见教材P23,1.4 LINGO的参数设置LINGO的基本用法和运算函数5模型通常形式(Generate, Ctrl+G) 创建当前模型的代数形式、LINGO模型或MPS格式文本。6. 生成图形(Picture) 由模型生成图形。7. 调试(Debug)8. 模
39、型统计资料(Model Statistics)9. 查看(Look)查看模型文本内容。LINGO的基本用法和运算函数四、窗口(Window)菜单1命令行窗口(Command Window或Ctrl+1)打开LINGO的命令行窗口。在命令行窗口中可以获得命令行界面,在“:”提示符后可以输入LINGO的命令行命令。2 状态窗口(Status Window或Ctrl+2)打开LINGO的求解状态窗口。如果在编译期间没有表达错误,那么LINGO将调用适当的求解器来求解模型。当求解器开始运行时,它就会显示如下的求解器状态窗口(LINGO Solver Status)。 LINGO的基本用法和运算函数求解
40、器状态窗口对于监视求解器的进展和模型大小是有用的。求解器状态窗口提供了一个中断求解器按钮(Interrupt Solver),点击它会导致LINGO在下一次迭代时停止求解。在绝大多数情况,LINGO能够交还和报告到目前为止的最好解。一个例外是线性规划模型,返回的解是无意义的,应该被忽略。但这并不是一个问题,因为线性规划通常求解速度很快,很少需要中断。注意:在中断求解器后,必须小心解释当前解,因为这些解可能根本就不最优解、可能也不是可行解或者对线性规划模型来说就是无价值的。 LINGO的基本用法和运算函数在中断求解器按钮的右边的是关闭按钮(Close)。点击它可以关闭求解器状态窗口,不过可在任何
41、时间通过选择Windows|Status Window再重新打开。在中断求解器按钮的右边的是标记为更新时间间隔(Update Interval)的域。LINGO将根据该域指示的时间(以秒为单位)为周期更新求解器状态窗口。可以随意设置该域,不过若设置为0将导致更长的求解时间LINGO花费在更新的时间会超过求解模型的时间。求解器状态窗口还有以下一些信息。LINGO的基本用法和运算函数变量框(Variables)Total显示当前模型的全部变量数,Nonlinear显示其中的非线性变量数,Integers显示其中的整数变量数。非线性变量是指它至少处于某一个约束中的非线性关系中。例如,对约束 X+Y=
42、100;X和Y都是线性变量。对约束X*Y=100;X和Y的关系是二次的,所以X和Y都是非线性变量。对约束X*X+Y=100;X是二次方是非线性的,Y虽与X构成二次关系,但与X*X这个整体是一次的,因此Y是线性变量。被计数变量不包括LINGO确定为定值的变量。例如:X=1; X+Y=3;这里X是1,由此可得Y是2,所以X和Y都是定值,模型中的X和Y都用1和2代换掉。LINGO的基本用法和运算函数约束(Constraints)框Total显示当前模型扩展后的全部约束数,Nonlinear显示其中的非线性约束数。非线性约束是该约束中至少有一个非线性变量。如果一个约束中的所有变量都是定值,那么该约束就
43、被剔除出模型(该约束为真),不计入约束总数中。非零(Nonzeroes)框Total显示当前模型中全部非零系数的数目,Nonlinear显示其中的非线性变量系数的数目。内存使用(Generator Memory Used)框显示当前模型在内存中使用的内存量。可以通过使用LINGO|Options命令修改模型的最大内存使用量。LINGO的基本用法和运算函数已运行时间(Elapsed Runtime)框显示求解模型到目前所用的时间,它可能受到系统中别的应用程序的影响。显示格式是“时:分:秒” 。求解器状态(Solver Status)框显示当前模型求解器的运行状态。各栏目的含义如下。LINGO的基
44、本用法和运算函数Model Class 当前模型的类型 可能显示:LP(线性规划),QP(二次规划),ILP(整数线性规划),IQP(整数二次规划),PILP(纯整数线性规划),PIQP(纯整数二次规划),NLP(非线性规划),MIP(混合整数规划),INLP(整数非线性规划),PINLP(纯整数非线性规划)注 以I开头表示IP(整数规划),以PI开头表示PIP(纯整数规划)LINGO的基本用法和运算函数State 当前解的状态可能显示:Global Optimum(全局最优解),Local Optimum(局部最优解),Feasible(可行解),Infeasible(不可行解),Unbou
45、nded(无界),Interrupted(中断),Undetermined(未确定)如果模型没有非线性约束,那么局部最优解也就是全局最优解,反之,如果模型有一个或多个非线性约束,那么局部最优解不一定就是全局最优解,也许存在一个比目前找到的最优解更优的解,只是算法找不到它 LINGO的基本用法和运算函数Objective 当前解的目标函数值显示当前解的目标函数值,如果模型中没有目标函数,则显示N/A 。Infeasibility 显示模型中被违反的约束条件的数量(违反变量限制的约束不计在内)显示实数(即使该值=0,当前解也可能不可行,因为这个量中没有考虑用上下界命令形式给出的约束) LINGO的
46、基本用法和运算函数Iterations 到目前为止的迭代次数一次迭代包括以下动作:先找到一个当前值为零的变量,假如让它非零时结果变优,则不断增大它的值,直到一个约束将变为不可行或另一个变量的值被“赶”向零之后,迭代重新开始一般说来,模型的规模越大,求解所需的迭代次数越多,每次迭代的时间也会越长 LINGO的基本用法和运算函数扩展求解器状态(Extended Solver Status)框显示LINGO中几个特殊求解程序(算法)的运行状态包括分枝定界求解器(Branch and Bound Solver)、全局优化求解器(Global Solver)和多个初始点求解器(Multistart So
47、lver)该框中的栏目仅当这些求解器运行时才会更新栏目的含义如下LINGO的基本用法和运算函数Solver Type 使用的特殊求解程序有以下几种可能:B-and-B (分支定界法);Global (全局优化算法);Multistart(多个初始点算法)分支定界法用来求解整数规划全局优化算法和多初始点算法专门用于求解非线性规划,许多非线性模型是非凸或者(并且)是非光滑的,那些依赖于局部搜索过程的非线性算法往往收敛于一个局部的最优解,它可能不是全局最优解,甚至有可能与全局最优解相差甚远全局优化算法和多初始点算法是针对这类情况而采用的特殊算法 LINGO的基本用法和运算函数Best Obj 目前为
48、止找到的可行解的最佳目标函数值 Obj Bound 目标函数值的界 该界限给出了改善目标函数的程度,所得最佳目标函数值不会超过该界限,假如运行过程中当前目标函数值已经十分接近该界限,而算法还在无休止地运行,用户可以选择中断算法以节省时间Steps 特殊求解程序当前运行步数:分枝数(对B-and-B程序);子问题数(对Global程序);初始点数(对Multistart程序)LINGO的基本用法和运算函数Active 有效步数 显示当前的有效步数Window菜单的其余几个命令都是对窗口的排列,这里不作介绍,试一试便知. LINGO的基本用法和运算函数五、帮助(Help)菜单1帮助主题(Help
49、Topics)打开LINGO的帮助文件。其中有目录和索引两种找到所需帮助的方式。2. 软件注册(Register)3. 自动更新(Auto Update)注意:只有正版软件才能自动更新,盗版软件不要打开自动更新。 4关于LINGO(About Lingo)关于当前LINGO的版本信息等。 LINGO的基本用法和运算函数1.4 LINGO的运算符和函数LINGO的基本用法和运算函数一、LINGO的常用运算符1算术运算符 次方,* 乘,/ 除,+ 加,- 减都是双目运算符,需要两个运算对象(操作数),但“-”号也可以作为单目运算符,表示取运算对象的负值算术运算符的优先级别为:单目“-”最高,其余依
50、次为 ,*和 / ,+ 和- ,同级别自左至右运算,加括号可改变运算次序 LINGO的基本用法和运算函数2逻辑运算符 逻辑运算符共有9个,除了#NOT#是单目运算符之外,其余都是双目运算符,需要两个运算对象,中间用逻辑运算符连接起来,构成逻辑表达式,逻辑表达式的值只有两种:真或假,假等同于数值0,而所有非零值都是真逻辑运算符有以下几种:LINGO的基本用法和运算函数LINGO的逻辑运算符LINGO的基本用法和运算函数逻辑运算符的优先级别,最高为#NOT#,最低为#AND#以及#OR#,其余都在中间且平级例 逻辑运算符示例2 #gt# 3 #and# 4 #gt# 2,其结果为假(0)。 LIN
51、GO的基本用法和运算函数 3关系运算符关系运算符常用在约束条件表达式中,有以下三种: 表达式左右两边相等; 表达式左边小于或等于右边; 表达式左边大于或等于右边LINGO没有单独的和运算符,如果出现单个或,LINGO认为是省略了号,即“”等同于“”,“”等同于“”LINGO的基本用法和运算函数如果需要严格小于和严格大于关系,比如让A严格小于B,那么可以把它变成如下的小于等于表达式:A+=B,这里是一个小的正数,它的值依赖于模型中A小于B多少才算不等。 当不同种类的运算符混合运算时,优先级别为:单目优于双目,算术优于逻辑,逻辑优于关系,平级从左到右,括号改变次序 LINGO的基本用法和运算函数二
52、、LINGO的内部函数使用内部函数能大大减少用户的编程工作量,LINGO提供了五十几个内部函数,这些函数都以字符开头,可分成以下几类:1数学函数(角度的单位为弧度)ABS(X) 返回X的绝对值;SIN(X) 返回X的正弦值;COS(X) 返回X的余弦值;TAN(X) 返回X的正切值;LOG(X) 返回X的自然对数值;EXP(X) 返回eX的值; LINGO的基本用法和运算函数SIGN(X) 返回X的符号值(X=0时返回1);SMAX(X1,X2,XN) 返回这一系列数中的最大值;SMIN(X1,X2,XN) 返回这一系列数中的最小值;FLOOR(X) 返回X的整数部分; LGM(X) 返回x的
53、gamma函数的自然对数。 LINGO的基本用法和运算函数以下四个函数是版本的新增加函数,版本不支持MOD(X,Y) 返回X除以Y的余数(X和Y都是整数);POW(X,Y) 返回指数XY的值;SQR(X) 返回X的平方值;SQRT(X) 返回X的正的平方根 LINGO的基本用法和运算函数2概率函数PSN(X) 返回标准正态分布的分布函数值;PPS(A,X) 返回参数为A的泊松分布的分布函数值;PBN(P,N,X) 返回参数为P,N的二项分布的分布函数值,当X不是整数时,采用线性插值进行计算;PHG(POP,G,N,X) 返回参数为POP,G,N的超几何分布的分布函数,当X不是整数时,采用线性插
54、值进行计算;PFD(N,D,X) 返回参数自由度为N和D的F分布的分布函数值; LINGO的基本用法和运算函数PCX(N,X) 返回自由度为N的分布的分布函数值;PTD(N,X) 返回自由度为N的t分布的分布函数值;RAND(SEED) 返回01之间的伪随机数,SEED为种子;PEB(A,X) 当到达负荷为A,服务系统有X个服务器且允许无穷排队时的Erlang繁忙概率;PEL(A,X) 当到达负荷为A,服务系统有X个服务器且不允许排队时的Erlang繁忙概率;LINGO的基本用法和运算函数PPL(A,X) Poisson分布的线性损失函数,即返回max(0,z-x)的期望值,其中随机变量z服从
55、均值为a的Poisson分布。 PFS(A,X,C) 当负荷上限为A,顾客数为C,平行服务器数量为Xx时,有限源的Poisson服务系统的等待或返修顾客数的期望值。A是顾客数乘以平均服务时间,再除以平均返修时间。当C和(或)X不是整数时,采用线性插值进行计算。PSL(X) 单位正态线性损失函数,即返回max(0,z-x)的期望值,其中随机变量z服从标准正态分布 LINGO的基本用法和运算函数3集合操作函数 以下几个集合操作函数的参数分为两部分,形式为: 函数名(集合名|条件:表达式)参数之间用“:”号隔开,前一个参数为集合名,表示对哪一个集合进行操作,其中条件部分可有可无,根据需要而定,如果对
56、集合的每个成员都进行操作,则不需要条件。后一个参数是表达式,表示对指定的集合进行什么样的运算或操作。FOR( s:e) 该函数常用在约束条件中,表示对集合s中的每个成员都生成一个约束条件表达式,表达式的具体形式由参 数e描述 ; LINGO的基本用法和运算函数SUB(s:e) 对集合s中的每个成员,分别得到表达式e的值,然后返回所有这些值的和 ; MAX(s:e) 对集合s中的每个成员,分别得到表达式e的值,然后返回所有这些值中的最大值 ; MIN(s:e) 对集合s中的每个成员,分别得到表达式e的值,然后返回所有这些值中的最小值;SIZE(s) 返回集合s中的成员个数 。PROD(s:e)
57、对集合s中的每个成员,分别得到表达式e的值,然后返回所有这些值的乘积版本支持) LINGO的基本用法和运算函数以上函数在调用时,如果想有条件地进行操作,例如,集合s有8个分量(成员),但对应的约束条件不足8个,即对集合s中的某些分量,不需要生成约束条件,则可以在参数s之后,“:”号之前加入条件限制,形式为FOR(s|condition:e);参数condition是条件,即逻辑表达式,例如:FOR(VD(J)|J#NE#5:表达式e); 上式中的条件“J#NE#5”表示对集合VD,当成员序号J不等于5时,生成约束表达式e,即第5个分量不生成约束表达式 。LINGO的基本用法和运算函数以下三个函
58、数也是集合操作函数:IN(s:e1) 如果成员e1在集合s中,则返回1,否则返回0SIZE(s) 返回集合s中的成员个数INDEX(s:ek) 返回成员ek在集合s中的顺序号(索引值),该值在1和集合s的成员个数之间,如果集合s中没有该成员,则给出出错信息LINGO的基本用法和运算函数4变量定界函数这些函数对变量的取值加以限制BIN(X) 限制X为0或1,这对于0-1规划特别有用,例如制定招聘计划,对某个应聘者只需要决定是录用还是不录用,这是0-1型变量。BND(L,X,U) 限制变量X的范围LXULINGO的基本用法和运算函数GIN(X) 限制X为整数,这对整数规划特别有用,有些变量只取整数
59、,可用GIN来对它限制FREE(X) 取消对变量X的限制(即X可取任意实数值)。 LINGO的基本用法和运算函数例 背包问题某人打算外出旅游并登山,路程比较远,途中要坐火车和飞机,考虑要带许多必要的旅游和生活用品,例如照相机、摄像机、食品、衣服、雨具、书籍等等,共n件物品,重量分别为ai,而受航空行李重量限制,以及个人体力所限,能带的行李总重量为b,n件物品的总重量超过了b,需要裁减,该旅行者为了决策带哪些物品,对这些物品的重要性进行了量化,用ci表示,试建立该问题的数学模型这个问题称为背包问题(Knapsack Problem)LINGO的基本用法和运算函数解:若引入0-1型决策变量xi,x
60、i=1表示物品i放入背包中,否则不放,则背包问题等价于如下0-1线性规划:假设现有8件物品,它们的重量分别为1,3,4,3,3,1,5,10(kg),价值分别为2,9,3,8,10,6,4,10(元),假如总重量限制不超过15kg,试决策带哪些物品,使所带物品的总价值最大 LINGO的基本用法和运算函数编写LINGO程序如下:MODEL: SETS: WP/W1.W8/:A,C,X; ENDSETS DATA:A=1 3 4 3 3 1 5 10;C=2 9 3 8 10 6 4 10; ENDDATA MAX=SUM(WP:C*X); !目标函数; FOR(WP:BIN(X); !限制X为0