LINGO使用说明(比较简单)

  • 格式:pdf
  • 大小:334.85 KB
  • 文档页数:14

下载文档原格式

  / 14
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

其中x 是要改变类型的变量。 更多请见lingo的help文件。
二.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 ) ));
3.MAX语句: Max语句的功能是从一组取值与下标有关的表达式中返回它们的
最大值,格式如下: @MAX( SETS_NAME ( 索引变量 ) ) :表达式 )
例: 为表达 max ( bi *ci ) >= 33 , i=1..8
其中的一组取值是b1*c1,b2*c2,b3*c3 …….,再从中挑选出最大值作为 MAX语句的值。
当你在windows下开始运行LINGO系统时,会得到类似下面的一个窗 口:
外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将 被包含在主窗口之下。在主窗口内的标题为LINGO Model – LINGO1的 窗口是LINGO的默认模型窗口,建立的模型都都要在该窗口内编码实 现。 示例:求解线性规划问题:
冒号再写上变量名,代码如下: SETS : Xb1 /1..8/:x,c,b ; Xb2 /1..6/ ; Xb3 (xb1,xb2):a; ENDSETS
2.DATA的使用(常量定义): 在lingo中把常量理解为已经被给定某常数的变量,在DATA 中对一
些变量赋值,使之成为常量。 代码如下:
SETS: xb1 /1..8/:x; xb2 /1..6/ :b,c; xb3 (xb2,xb1):a;
为了定义xi,aij,那么首先要确定下标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必须以字母或下划线(_)开始。
);
注:然后点击工具条上的按钮 即可。本模型的最优解为2.636364
注意:(1)在lingo中输入的各种符号一定要是英文状态下输入,不能 是中文输入状态下的符号。例如正确输入 xb3 (xb2,xb1):a; 错误输入 xb3 (xb2,xb1):a;
(2)Lingo中不区分字母大小写
一.变量、常量定义
28567254 35695445 47258876 55444517 6 8 8 7 5 6 2 8; b= 15 38 27 44 15 26; c= 4 9 8 4 6 9; ENDDATA MAX=@sum( xb1(i) :x(i) ); @for( xb2(i): @sum( xb1(j) : a(i,j)*x(j) ) +c(i)<= b(i);
LINGO程序设计简要说明
在数学建模中会遇到如规划类的题型,在这种模型中总存在着一个 目标,并希望这个目标的取值尽可能的大或小,同时与这个目标有关的 一系列变量之间存在一些约束。在构造出目标函数和约束条件的表达式 后,我们需要对求出这个最值和各变量的取值。一般我们用LINGO来对 模型进行求解,本文将通过举一个简单的例子,围绕这个例子逐步学习 LINGO的使用。LINGO只是一个求解工具,我们主要的任务还是模型 的建立!
2.SUM语句: 在约束条件表达式中经常用到∑,lingo提供的SUM语句能方便地
表达,但必须要以SETS为基础。 SUM语句格式和FOR语句类似: @SUM( SETS_NAME ( 索引变量 ) ) :被累加部分表达式 ) 其中累加部分表达式只能是一条语句。 SUM语句不可以像FOR语句那样作为单独的一句话出现,一般将 它和另一个常量或表达式比较大小,例: @SUM(SETS_NAME ( 索引变量 ) ) :被累加部分表达式 )<=常 量(表达式); 有时为了程序看上去更简洁,可以这样写: VName=@SUM(SETS_NAME ( 索引变量 ) ) :被累加部分表 达式 ); VName<=常量(表达式); 这样VName 将代表整个∑表达式,这样将有可能会影响程序运行 速度,一般这样的影响忽略不计。 同样sum语句也可以用于多维变量。
7. 7 集循环函数:遍历集的元素,执行一定的操作的函数 8. 8 数据输入输出函数:这类函数允许模型和外部数据源相联 系,进行数据的输入输出 9. 9 辅助函数:各种杂类来自百度文库数
4.1 基本运算符 这些运算符是非常基本的,甚至可以不认为它们是一类函数。事实 上,在LINGO中它们是非常重要的。 4.1.1 算术运算符 算术运算符是针对数值进行操作的。LINGO提供了5种二元运算符: ^乘方 ﹡乘 /除 ﹢加 ﹣减
a,b,c= @OLE (‘ E:\DATA ’ , ‘ DA ’ , ‘ DB ’ , ‘ DC ’ ); ENDDATA MAX=@sum( xb1(i) : x(i) ); @for( xb2(i):
@sum( xb1(j) : a(i,j)*x(j)) +c(i) <= b(i);
); 同时我们在E盘新建了一个名为DATA.XLS的EXCLE文件;关于 EXCLE的使用,这里不更多说明。需要指出的是‘ DA ’ , ‘ DB ’ , ‘ DC ’是EXCLE中对一系列单元格的命名,即先选中某个一维或多维单元格 区域,然后再在显示单元格行列坐标的文本框中写入对这个区域的命 名,再回车确认。这样就可以通过这个命名来控制访问EXCLE的数据 了。至于另一种操作方法请查找相关的help文件。 以上只是介绍了LINGO基本的知识,上面的程序未经调试,可能存 在一些问题!还有希望大家能尽可能使用help文件,在其中有着详细的 解答!
在lingo中变量在使用前是无需定义也可以使用的。在描述类似xi, aij带有下标的变量时,我们可以在使用时一一例举,即,x1,x2,x3….x8, 但这样显然很麻烦(刚接触LINGO的时候大部分是这样使用的)。 Lingo中可以使用sets 来预先定义这些变量,然后就可以在loop语句方便 地访问这一组变量,也可以用小x(2), a(2,3)的形式访问个别变量,这和C 语言中的数组是类似的。 1.SETS的使用:
二维下标是在两个一维下标定义的基础上给定的,定义 a(i,j)下标的代码如下: SETS :
Xb1 /1..8/; Xb2 /1..6/ ; Xb3 (xb1,xb2); ENDSETS (关于下标的定义还有其他的方法,请参考LINGO的help文件,自 行学习) 现在下标已经定义完成了,定义数组变量时则需在下标后加上
#not# 否定该操作数的逻辑值,#not#是一个一元运算符 #eq# 若两个运算数相等,则为true;否则为flase #ne# 若两个运算符不相等,则为true;否则为flase #gt# 若左边的运算符严格大于右边的运算符,则为true;否则为 flase #ge# 若左边的运算符大于或等于右边的运算符,则为true;否则 为flase #lt# 若左边的运算符严格小于右边的运算符,则为true;否则为 flase #le# 若左边的运算符小于或等于右边的运算符,则为true;否则为 flase #and# 仅当两个参数都为true时,结果为true;否则为flase
就可以替代上面的输入工作。其中xb1 在上述代码中已经定义过,变 量i是索引变量。
FOR语句格式: @FOR( SETS_NAME ( 索引变量 ) ) :循环部分表达式 )
@for( xb1( i ) : @GIN( x( i ) ));
下面我们用C语言来帮助理解,以便我们更好地理解。 For( i=1;i<=8;i++) { @gin( x(i) ); }
LINGO唯一的一元算术运算符是取反函数“﹣”。 这些运算符的优先级由高到底为: 高 ﹣(取反) ^ ﹡/ 低 ﹢﹣
运算符的运算次序为从左到右按优先级高低来执行。运算的次序可以用圆括号“()”来改 变。
例4.1 算术运算符示例。 2﹣5/3,(2﹢4)/5等等。 4.1.2 逻辑运算符 在LINGO中,逻辑运算符主要用于集循环函数的条件表达式中,来 控制在函数中哪些集成员被包含,哪些被排斥。在创建稀疏集时用在成 员资格过滤器中。 LINGO具有9种逻辑运算符:
ENDSETS DATA: a= 1 7 4 5 5 6 9 3
28567254 35695445 47258876 55444517 6 8 8 7 5 6 2 8; b= 15 38 27 44 15 26; c= 4 9 8 4 6 9; ENDDATA 请尝试着在lingo中输入以上代码后点击solve按钮,查看执行结果。 这些变量的值在规划求解中始终不变,也即为常量。 3.变量类型: Lingo中变量被默认为大于等于0的浮点型变量,在解决某些问题对 变量有特殊的要求,需要重新定义其变量类型。下面介绍几个常用 的: ①变量不受大于等于的限制,即也可以取到负值: 用 @Free( x ); 语句。 ②变量为整型 : 用 @Gin( x ); 语句。 ③变量为二进制数,即取值非0即1: 用 @Bin( x ); 语句。
求解这个模型的相应LINGO程序代码如下: 程序一: max= x1+x2+x3+x4+x5+x6+x7+x8; ; ; ; ; ; ;
注:然后点击工具条上的按钮 即可。本模型的最优解为2.636364 程序二: SETS:
xb1 /1..8/:x; xb2 /1..6/ :b,c; xb3 (xb2,xb1):a; ENDSETS DATA: a= 1 7 4 5 5 6 9 3
因,LINGO提供了一些命令方便你将数据直接从电子表格中导入到 模型中。在这里我将只介绍一个与EXCLE链接的命令—— @OLE。
1. 导入数据: 我们先看一个例程:
SETS : xb1 /1..8/ : x ; xb2 /1..6/ :c , b; xb3 (xb2,xb1): a; ENDSETS DATA :
@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)); }
相应Lingo代码如下: @max( xb1( i ) : b( i )*c( i ) ) <=33 ;
同样MAX语句也可以用于多维变量。 4.MIN语句:
MIN语句的功能是从一组取值与下标有关的表达式中返回它们 的最小值。用法与MAX的相同。
三.EXCEL电子表格接口
在你解决一个模型的时候,或许会有大量的数据要整合到你的 代码中去,而这些数据大部分时候会被保存在电子表格中。而且 EXCEL也是用来处理你所得到的数据较好的一个选择。出于上述原
四.LINGO函数
LINGO有9种类型的函数: 1. 1 基本运算符:包括算术运算符、逻辑运算符和关系运算符 2. 2 数学函数:三角函数和常规的数学函数 3. 3 金融函数:LINGO提供的两种金融函数 4. 4 概率函数:LINGO提供了大量概率相关的函数 5. 5 变量界定函数:这类函数用来定义变量的取值范围 6. 6 集操作函数:这类函数为对集的操作提供帮助
#or# 仅当两个参数都为false时,结果为false;否则为true