数学建模之Lingo基础知识与应用 |
您所在的位置:网站首页 › lingo求解最短路的结果分析报告 › 数学建模之Lingo基础知识与应用 |
1. Lingo入门
安装:推荐微信公众号软件安装管家 (1) 界面分析: LP模型一个典型的输入方式: 一般来说,LINGO中建立的优化模型可以由五个部分组成,或称为五“段”(SECTION): (1)集合段(SETS):以“ SETS:” 开始, “ENDSETS”结束,定义必要的集合变量(SET)及其元素(MEMBER,含义类似于数组的下标)和属性(ATTRIBUTE,含义类似于数组)。 (2)目标与约束段:目标函数、约束条件等,没有段的开始和结束标记,因此实际上就是除其它四个段(都有明确的段标记)外的LINGO模型。 这里一般要用到LINGO的内部函数,尤其是与集合相关的求和函数@SUM和循环函数@FOR等。 (3)数据段(DATA):以 “DATA:” 开始, “ENDDATA”结束,对集合的属性(数组)输入必要的常数数据。 格式为:“attribute(属性) = value_list(常数列表);” 常数列表(value_list)中数据之间可以用逗号“,”分开,也可以用空格分开(回车等价于一个空格),如上面对DEM的赋值也可以写成“DEM=40 60 75 25;”。 (4)初始段(INIT):以“INIT: ”开始, “ENDINIT”结束,对集合的属性(数组)定义初值(因为求解算法一般是迭代算法,所以用户如果能给出一个比较好的迭代初值,对提高算法的计算效果是有益的)。 如果有一个接近最优解的初值,对LINGO求解模型是有帮助的。定义初值的格式为: “attribute(属性) = value_list(常数列表);” (5)计算段(CALC):以“CALC: ”开始, “ENDCALC”结束,对一些原始数据进行计算处理。 在实际问题中,输入的数据通常是原始数据,不一定能在模型中直接使用,可以在这个段对这些原始数据进行一定的“预处理”,得到模型中真正需要的数据。 例如上例,如果希望得到全年的总需求和季度平均需求,可以增加这个段: CALC: T_DEM = @SUM(quarters: DEM); !总需求; A_DEM = T_DEM / @size(quarters); !平均需求; ENDCALC 2.2 基本集合与派生集合集合上的元素(下标)进行循环操作的函数, 一般用法如下: @function(setname[(set_index_list)[|condition]]:expression_list);其中: function 集合函数名,FOR、MAX、MIN、PROD、SUM之一; Setname 集合名; set_index_list 集合索引列表(不需使用索引时可以省略); Condition 用逻辑表达式描述的过滤条件(通常含有索引,无条件时可以省略); expression_list 一个表达式(对@FOR函数,可以是一组表达式。 五个集合函数名的含义: @FOR(集合元素的循环函数): 对集合setname的每个元素独立地生成表达式,表达式由expression_list描述(通常是优化问题的约束)。 @MAX(集合属性的最大值函数):返回集合setname上的表达式的最大值。 @MIN(集合属性的最小值函数):返回集合setname上的表达式的最小值。 @PROD(集合属性的乘积函数): 返回集合setname上的表达式的积。 @SUM(集合属性的求和函数):返回集合setname上的表达式的和。 3.4 集合操作函数 @INDEX( [set_name,] primitive_set_element) 给出元素primitive_set_element在集合set_name中的索引值(即按定义集合时元素出现顺序的位置编号)。省略set_name,LINGO按模型中定义的集合顺序找到第一个含有该元素的集合,并返回索引值。如果没有找到该元素,则出错。 注: Set_name的索引值是正整数且只能位于1和元素个数之间。例:定义一个女孩姓名集合(GIRLS)和男孩姓名集合(BOYS) : SETS: GIRLS /DEBBIE, SUE, ALICE/; BOYS /BOB, JOE, SUE, FRED/; ENDSETS都有SUE,GIRLS在BOYS前定义,调用@INDEX(SUE)将返2,相当于@INDEX(GIRLS,SUE)。要找男孩中名为SUE的小孩的索引,应该使用@INDEX(BOYS, SUE),返3。 2. @IN( set_name, primitive_index_1 ,[primitive_index_2 ...]) 判断一个集合中是否含有某个索引值。如果集合set_name中包含由索引primitive_index_1, [ primitive_index_2 …]所对应元素,则返回1(逻辑值“真”),否则返回0(逻辑值“假”)。索引用“&1”、“&2”或@INDEX函数等形式给出,这里“&1”表示对应于第1个父集合的元素的索引值,“&2”表示对应于第2个父集合的元素的索引值。 例:定义一个集合STUDENTS(基本集合),派生出集合PASSED和FAILED,定义: SETS: STUDENTS / ZHAO, QIAN, SUN, LI/:; PASSED( STUDENTS) /QIAN,SUN/:; FAILED( STUDENTS) | #NOT# @IN( PASSED, &1):; ENDSETS如果集合C是由集合A,B派生的,例如: SETS: A / 1..3/:; B / X Y Z/:; C( A, B) / 1,X 1,Z 2,Y 3,X/:; ENDSETS判断C中是否包含元素(2,Y),则可以利用以下语句: X = @IN( C, @INDEX( A, 2), @INDEX( B, Y));对本例,结果是X=1(真)。 3. @WRAP(I,N) 此函数对N |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |