LINGO软件介绍.doc_第1页
LINGO软件介绍.doc_第2页
LINGO软件介绍.doc_第3页
LINGO软件介绍.doc_第4页
LINGO软件介绍.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

LINGO程序设计介绍在运筹学中中会遇到如规划类的题型,在这种模型中总存在着一个目标,并希望这个目标的取值尽可能的大或小,同时与这个目标有关的一系列变量之间存在一些约束。在构造出目标函数和约束条件的表达式后,我们需要对求出这个最值和各变量的取值。一般我们用LINGO来对模型进行求解,本文将通过举一个简单的例子,围绕这个例子逐步学习LINGO的使用。LINGO只是一个求解工具,我们主要的任务还是模型的建立!当你在windows下开始运行LINGO系统时,会得到类似下面的一个窗口:外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。在主窗口内的标题为LINGO Model LINGO1的窗口是LINGO的默认模型窗口,建立的模型都都要在该窗口内编码实现。一变量、常量定义在lingo中变量在使用前是无需定义也可以使用的。在描述类似带有下标的变量时,我们可以在使用时一一例举,即,x1,x2,x3.x8, 但这样显然很麻烦(刚接触LINGO的时候大部分是这样使用的)。Lingo中可以使用sets 来预先定义这些变量,然后就可以在loop语句方便地访问这一组变量,也可以用小x(2), a(2,3)的形式访问个别变量,这和C语言中的数组是类似的。1SETS的使用:为了定义那么首先要确定下标i和j的取值范围。在lingo中用sets来表示。代码:SETS :Xb1 /1.8/ ;Xb2 /1.6/ ;ENDSETS其中 xb1、xb2分别为下标1.8 ,1.6的名字(sets_name),这些名字在loop语句中要使用。对于sets_name一般将它命名为有意义的名称,这个sets_name必须以字母或下划线(_)开始。二维下标是在两个一维下标定义的基础上给定的,定义a(i,j)下标的代码如下:SETS :Xb1 /1.8/;Xb2 /1.6/ ;Xb3 (xb1,xb2);ENDSETS现在下标已经定义完成了,定义数组变量时则需在下标后加上冒号再写上变量名,代码如下:SETS :Xb1 /1.8/:x,c,b ;Xb2 /1.6/ ;Xb3 (xb1,xb2):a;ENDSETS2DATA的使用(常量定义):在lingo中把常量理解为已经被给定某常数的变量,在DATA 中对一些变量赋值,使之成为常量。代码如下:SETS:xb1 /1.8/:x;xb2 /1.6/ :b,c;xb3 (xb2,xb1):a;ENDSETSDATA: a= 1 7 4 5 5 6 9 3 2 8 5 6 7 2 5 4 3 5 6 9 5 4 4 5 4 7 2 5 8 8 7 6 5 5 4 4 4 5 1 7 6 8 8 7 5 6 2 8;b= 15 38 27 44 15 26;c= 4 9 8 4 6 9;ENDDATA这些变量的值在规划求解中始终不变,也即为常量。3变量类型:Lingo中变量被默认为大于等于0的浮点型变量,在解决某些问题对变量有特殊的要求,需要重新定义其变量类型。下面介绍几个常用的:变量不受大于等于的限制,即也可以取到负值: 用 Free( x ); 语句。变量为整型 :用 Gin( x ); 语句。变量为二进制数,即取值非0即1:用 Bin( x ); 语句。其中x 是要改变类型的变量。二Loop语句Lingo提供的FOR、SUM、MAX 、MIN语句会使我们更轻松地表达多种约束表达式,同时也避免了大量的输入工作。1.for语句:a) 假定我们要定义xi为整型变量,一般我们需要写下如下代码:GIN(X(1) ;GIN(X(2) ;GIN(X(3) ;GIN(X(4) ;GIN(X(5) ;GIN(X(6) ;GIN(X(7) ;GIN(X(8) ;显然这太麻烦了。使用for语句 for( xb1( i ) : GIN( x( i ) ); 就可以替代上面的输入工作。其中xb1 在上述代码中已经定义过,变量i是索引变量。FOR语句格式:FOR( SETS_NAME ( 索引变量 ) ) :循环部分表达式 )for( xb1( i ) : GIN( x( i ) ); 下面我们用C语言来帮助理解,以便我们更好地理解。For( i=1;i=8;i+) gin( x(i) ); for 语句中冒号前面的部分 xb1( i ) 说明索引变量 i 将从1 递增到到8 ;冒号后面是循环的内容,可以是一个语句,也可以是多个语句用分号隔开。b) 上面介绍的是一维的循环,二维循环也与之类似,例如:for( xb3(i , j) : gin( a(i,j);用C语言解释为:For(i=;i=8;i+)For(j=1;j=6;j+) gin( a(i,j); 2.SUM语句:在约束条件表达式中经常用到,lingo提供的SUM语句能方便地表达,但必须要以SETS为基础。SUM语句格式和FOR语句类似:SUM( SETS_NAME ( 索引变量 ) ) :被累加部分表达式 )其中累加部分表达式只能是一条语句。SUM语句不可以像FOR语句那样作为单独的一句话出现,一般将它和另一个常量或表达式比较大小,例:SUM(SETS_NAME ( 索引变量 ) ) :被累加部分表达式 )=常量(表达式);如:v=sum(xb2(i):b(i)*c(i);有时为了程序看上去更简洁,可以这样写:VName=SUM(SETS_NAME ( 索引变量 ) ) :被累加部分表达式 );VName= 33 , i=1.8其中的一组取值是b1*c1,b2*c2,b3*c3 .,再从中挑选出最大值作为MAX语句的值。相应Lingo代码如下:max( xb1( i ) : b( i )*c( i ) ) =33 ;同样MAX语句也可以用于多维变量。4.MIN语句:MIN语句的功能是从一组取值与下标有关的表达式中返回它们的最小值。用法与MAX的相同。三LINGO函数LINGO有9种类型的函数:1 基本运算符:包括算术运算符、逻辑运算符和关系运算符2 数学函数:三角函数和常规的数学函数3 金融函数:LINGO提供的两种金融函数4 概率函数:LINGO提供了大量概率相关的函数5 变量界定函数:这类函数用来定义变量的取值范围6 集操作函数:这类函数为对集的操作提供帮助7 集循环函数:遍历集的元素,执行一定的操作的函数8 数据输入输出函数:这类函数允许模型和外部数据源相联系,进行数据 的输入输出9 辅助函数:各种杂类函数3.1 数学函数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时,返回不超过x的最大整数;当x0时,返回不低于x的最大整数max(x1,x2,xn) 返回x1,x2,xn中的最大值min(x1,x2,xn) 返回x1,x2,xn中的最小值3.2 变量界定函数变量界定函数实现对变量取值范围的附加限制,共4种:bin(x) 限制x为0或1bnd(L,x,U) 限制LxUfree(x) 取消对变量x的默认下界为0的限制,即x可以取任意实数gin(x) 限制x为整数在默认情况下,LINGO规定变量是非负的,也就是说下界为0,上界为+。free取消了默认的下界为0的限制,使变量也可以取负值。bnd用于设定一个变量的上下界,它也可以取消默认下界为0的约束。3.3 集循环函数集循环函数遍历整个集进行操作。其语法为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集。1for该函数用来产生对集成员的约束。基于建模语言的标量需要显式输入每个约束,不过for函数允许只输入一个约束,然后LINGO自动产生每个集成员的约束。2sum该函数返回遍历指定的集成员的一个表达式的和。3min和max返回指定的集成员的一个表达式的最小值或最大值。3.4 辅助函数1if(logical_condition,true_result,false_result)if函数将评价一个逻辑表达式logical_condition,如果为真,返回true_ result,否则返回false_result。 四、示例例1 如何在LINGO中求解如下的LP问题:在模型窗口中输入如下代码:程序一:max=2*x1+3*x2;2*x1+2*x2=12;4*x1=16;5*x2=15;然后点击工具条上的按钮 即可。计算结果为:Global optimal solution found. Objective value: 15.00000 Infeasibilities: 0.000000 Total solver iterations: 1 Variable Value Reduced Cost X1 3.000000 0.000000 X2 3.000000 0.000000 Row Slack or Surplus Dual Price 1 15.00000 1.000000 2 0.000000 1.000000 3 4.000000 0.000000 4 0.000000 0.2000000程序二:SETS:xb1 /1.2/:x,c;xb2 /1.3/ :b;xb3 (xb2,xb1):a;ENDSETS !定义i,j的范围DATA: !数据的输入 a= 2 2 4 0 0 5;b= 12 16 15; c=2 3;ENDDATA!目标函数MAX=sum( xb1(i) :c(i)*x(i) );!约束条件for( xb2(i): sum( xb1(j) : a(i,j)*x(j) ) = b(i););结果为:Global optimal solution found. Objective value: 15.00000 Infeasibilities: 0.000000 Total solver iterations: 1 Variable Value Reduced Cost X( 1) 3.000000 0.000000 X( 2) 3.000000 0.000000 C( 1) 2.000000 0.000000 C( 2) 3.000000 0.000000 B( 1) 12.00000 0.000000 B( 2) 16.00000 0.000000 B( 3) 15.00000 0.000000 A( 1, 1) 2.000000 0.000000 A( 1, 2) 2.000000 0.000000 A( 2, 1) 4.000000 0.000000 A( 2, 2) 0.000000 0.000000 A( 3, 1) 0.000000 0.000000 A( 3, 2) 5.000000 0.000000 Row Slack or Surplus Dual Price 1 15.00000 1.000000 2 0.000000 1.000000 3 4.000000 0.000000 4 0.000000 0.2000000例2一奶制品加工厂用牛奶生产A1,A2两种奶制品,1桶牛奶可以在甲车间用12小时加工成3公斤A1,或者在乙车间用8小时加工成4公斤A2。根据市场需求,生产的A1,A2全部能售出,且每公斤A1获利24元,每公斤A2获利16元。现在加工厂每天能得到50桶牛奶的供应,每天正式工人总的劳动时间480小时,并且甲车间每天至多能加工100公斤A1,乙车间的加工能力没有限制。试为该厂制订一个生产计划,使每天获利最大,并进一步讨论以下3个附加问题: 1) 若用35元可以买到1桶牛奶,应否作这项投资?若投资,每天最多购买多少桶牛奶? 2) 若可以聘用临时工人以增加劳动时间,付给临时工人的工资最多是每小时几元? 3) 由于市场需求变化,每公斤A1的获利增加到30元,应否改变生产计划?解:设拿 桶牛奶生产,桶牛奶生产,模型如下: 模型代码如下:max=72*x1+64*x2;x1+x2=50;12*x1+8*x2=480;3*x1=100;求解这个模型并做灵敏性分析,结果如下。 Global optimal solution found at iteration: 0 Objective value: 3360.000 Variable Value Reduced Cost X1 20.00000 0.000000 X2 30.00000 0.000000 Row Slack or Surplus Dual Price 1 3360.000 1.000000 2 0.000000 48.00000 3 0.000000 2.000000 4 40.00000 0.000000其中灵敏度分析需要激活,过程如下:运行LINGO-Options,选择General Solver Tab,在Dual computations列表框中选择Prices and Ranges选项。OK后点Range或者按快捷键Ctrl+R即可得Ranges in which the basis is unchanged: Objective Coefficient Ranges Current Allowable AllowableVariable Coefficient Increase Decrease X1 72.00000 24.00000 8.000000 X2 64.00000 8.000000 16.00000 Righthand Side Ranges Row Current Allowable Allowable RHS Increase Decrease 2 50.00000 10.00000 6.666667 3 480.0000 53.33333 80.00000 4 100.0000 INFINITY 40.00000结果告诉我们:这个线性规划的最优解为x1=20,x2=30,最优值为z=3360,即用20桶牛奶生产A1, 30桶牛奶生产A2,可获最大利润3360元。输出中除了告诉我们问题的最优解和最优值以外,还有许多对分析结果有用的信息,下面结合题目中提出的3个附加问题给予说明。 3个约束条件的右端不妨看作3种“资源”:原料、劳动时间、车间甲的加工能力。输出中Slack or Surplus给出这3种资源在最优解下是否有剩余:原料、劳动时间的剩余均为零,车间甲尚余40(公斤)加工能力。 目标函数可以看作“效益”,成为紧约束的“资源”一旦增加,“效益”必然跟着增长。输出中DUAL PRICES 给出这3种资源在最优解下“资源”增加1个单位时“效益”的增量:原料增加1个单位(1桶牛奶)时利润增长48(元),劳动时间增加1个单位(1小时)时利润增长2(元),而增加非紧约束车间甲的能力显然不会使利润增长。这里,“效益”的增量可以看作“资源”的潜在价值,经济学上称为影子价格,即1桶牛奶的影子价格为48元,1小时劳动的影子价格为2元,车间甲的影子价格为零。读者可以用直接求解的办法验证上面的结论,即将输入文件中原料约束milk)右端的50改为51,看看得到的最优值(利润)是否恰好增长48(元)。用影子价格的概念很容易回答附加问题1):用35元可以买到1桶牛奶,低于1桶牛奶的影子价格48,当然应该作这项投资。虽然应该批准用35元买1桶牛奶的投资,但每天最多购买10桶牛奶。回答附加问题2):聘用临时工人以增加劳动时间,付给的工资低于劳动时间的影子价格才可以增加利润,所以工资最多是每小时2元。 目标函数的系数发生变化时(假定约束条件不变),最优解和最优值会改变吗?这个问题不能简单地回答。上面输出给出了最优基不变条件下目标函数系数的允许变化范围:x1的系数为(72-8,72+24)=(64,96);x2的系数为(64-16,64+8)=(48,72)。注意:x1系数的允许范围需要x2系数64不变,反之亦然。由于目标函数的费用系数变化并不影响约束条件,因此此时最优基不变可以保证最优解也不变,但最优值变化。用这个结果很容易回答附加问题3):若每公斤A1的获利增加到30元,则x1系数变为303=90,在允许范围内,所以不应改变生产计划,但最优值变为9020+6430=3720。 例3 糖果的产销与运输,具体情况如下表:单位 销地运价产地B1B2B3B4产量A13113107A219284A3741059销量3656问如何调运糖果,在满足各个门市销售的需要情况下,运费支出最少。(建立模型)解:设第i个产地运到第j个销地(i=1,2,3;j=1,2,3,4)模型: 使用LINGO软件,编制程序如下:model:!3产地4销地运输问题;sets: warehouses/wh1.wh3/: w; vendors/v1.v4/: v; links(warehouses,vendors): c, x;endsets!目标函数; min=sum(links: c*x);!需求约束; for(vendors(J): sum(warehouses(I): x(I,J)=v(J);!产量约束; for(warehouses(I): sum(vendors(J): x(I,J)=w(I);!这里是数据;data: w=7 4 9; v=3 6 5 6; c=3 11 3 10 1 9 2 8 7 4 10 5;enddataend然后点击工具条上的按钮 即可。Global optimal solution found. Objective value: 85.00000 Infeasibilities: 0.000000 Total solver iterations: 7 Variable Value Reduced Cost W( WH1) 7.000000 0.000000 W( WH2) 4.000000 0.000000 W( WH3) 9.000000 0.000000 V( V1) 3.000000 0.000000 V( V2) 6.000000 0.000000 V( V3) 5.000000 0.000000 V( V4) 6.000000 0.000000 C( WH1, V1) 3.000000 0.000000 C( WH1, V2) 11.00000 0.000000 C( WH1, V3) 3.000000 0.000000 C( WH1, V4) 10.00000 0.000000 C( WH2, V1) 1.000000 0.000000 C( WH2, V2) 9.000000 0.000000 C( WH2, V3) 2.000000 0.000000 C( WH2, V4) 8.000000 0.000000 C( WH3, V1) 7.000000 0.000000 C( WH3, V2) 4.000000 0.000000 C( WH3, V3) 10.00000 0.000000 C( WH3, V4) 5.000000 0.000000 X( WH1, V1) 0.000000 0.000000 X( WH1, V2) 0.000000 2.000000 X( WH1, V3) 5.000000 0.000000 X( WH1, V4) 2.000000 0.000000 X( WH2, V1) 3.000000 0.000000 X( WH2, V2) 0.000000 2.000000 X( WH2, V3) 0.000000 1.000000 X( WH2, V4) 1.000000 0.000000 X( WH3, V1) 0.000000 9.000000 X( WH3, V2) 6.000000 0.000000 X( WH3, V3) 0.000000 12.00000 X( WH3, V4) 3.000000 0.000000例 4 分配问题(指派问题,Assignment Problem) 给出效率矩阵为,求最优分配方案是效率最高。解:记效率矩阵元素为 模型: 代码如下:model: !4个工人,4个工作的分配问题;sets: workers/w1.w4/; jobs/j1.j4/; links(workers,jobs): c,x;endsets !目标函数; min=sum(links: c*x); !每个工人只能有一份工作; for(workers(I): sum(jobs(J): x(I,J)=1; ); !每份工作只能有一个工人; for(jobs(J): sum(workers(I): x(I,J)=1; );data: c= 2 10 9 7 15 4 14 8 13 14 16 11 4 15 13 9;enddataendGlobal optimal solution found. Objective value: 28.00000 Infeasibilities: 0.000000 Total solver iterations: 6 Variable Value Reduced Cost C( W1, J1) 2.000000

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论