没有合适的资源?快使用搜索试试~ 我知道了~
好用的软件LinGO帮手,word版本。免费下载
资源详情
资源评论
资源推荐
LINGO 教程
相应于下面罗列的四个集循环函数之一; 是要遍历的集; 是集索引
列表; 是用来限制集循环函数的范围,当集循环函数遍历集的每个成员时, ! 都
要对 进行评价,若结果为真,则对该成员执行 操作,否则跳过,继续执行
下一次循环。 是被应用到每个集成员的表达式列表,当用的是 函数时,
可以包含多个表达式,其间用逗号隔开。这些表达式将被作为约束加到模型中。当使用其余的三个集循环函数
时, 只能有一个表达式。如果省略 ,那么在 中引用的所有属
性的类型都是 集。
1.@for
该函数用来产生对集成员的约束。基于建模语言的标量需要显式输入每个约束,不过 函数允许只输入
一个约束,然后 ! 自动产生每个集成员的约束。
例 4.10产生序列"#$%$&$#'$()*
+,#--),
+./(
2.@sum
该函数返回遍历指定的集成员的一个表达式的和。
例 4.11求向量),#,0,%,',#1前 ) 个数的和。
.'
+,#--,
.)#0%'#1
.+22)
0. 和
返回指定的集成员的一个表达式的最小值或最大值。
例 4.12求向量),#,0,%,',#1前 ) 个数的最小值,后 0 个数的最大值。
.'
+,#--,
.)#0%'#1
3.+22)
3.+2425(
下面看一个稍微复杂一点儿的例子。
例 4.13 职员时序安排模型 一项工作一周 6 天都需要有人(比如护士工作),每天(周一至周日)所需
的最少职员数为 (1、#'、#0、#'、#&、#% 和 #(,并要求每个职员一周连续工作 ) 天,试求每周所需最少职
员数,并给出安排。注意这里我们考虑稳定后的情况。
7,--,$
- 1 -
LINGO 教程
8每天所需的最少职员数
.(1#'#0#'#&#%#(
8最小化每周所需职员数
.7
79
722)
:9;;($6<.9
计算的部分结果为
+1
!+=33((-11111
>
?+?@A
@BCD@BEF!(1-111111-111111
@BCD@BEGDB#'-111111-111111
@BCD@BEHBE#0-111111-111111
@BCD@BEGID#'-111111-111111
@BCD@BEJ@#&-111111-111111
@BCD@BEKLG#%-111111-111111
@BCD@BEKD#(-111111-111111
KGL@GF!M-1111111-111111
KGL@GGDB(-1111111-111111
KGL@GHBE1-1111111-0000000
KGL@GGID'-1111111-111111
KGL@GJ@0-1111111-111111
KGL@GKLG0-1111111-111111
KGL@GKD1-1111111-111111
从而解决方案是:每周最少需要 (( 个职员,周一安排 M 人,周二安排 ( 人,周三无需安排人,周四安排 ' 人,
周五和周六都安排 0 人,周日无需安排人。
>
4.8 输入和输出函数
输入和输出函数可以把模型和外部数据比如文本文件、数据库和电子表格等连接起来。
1.@le 函数
该函数用从外部文件中输入数据,可以放在模型中任何地方。该函数的语法格式为NN。这里
是文件名,可以采用相对路径和绝对路径两种表示方式。 函数对同一文件的两种表示方式的处
理和对两个不同的文件处理是一样的,这一点必须注意。
例 4.14以例 #-( 来讲解 函数的用法。
注意到在例 #-( 的编码中有两处涉及到数据。第一个地方是集部分的 ' 个 :O 集成员和 M 个
3 集成员;第二个地方是数据部分的 7, 和 数据。
为了使数据和我们的模型完全分开,我们把它们移到外部的文本文件中。修改模型代码以便于用 函
数把数据从文本文件中拖到模型中来。修改后(修改处代码黑体加粗)的模型代码如下:
8' 发点 M 收点运输问题
:O,@le('1_2.txt'),7
3,@le('1_2.txt') ,
P:O$3$3
8目标函数
.PQ3
8需求约束
39
:O3$9.9
!产量约束;
@for(warehouses(I):
393$9R.7
>
- 2 -
LINGO 教程
!这里是数据;
7.@le('1_2.txt')
.@le('1_2.txt')
.@le('1_2.txt')
模型的所有数据来自于 #(- 文件。其内容如下:
8:O 成员
HI#HI(HI0HI%HI)HI'S
>
83 成员
?#?(?0?%?)?'?6?MS
>
8产量
'1)))#%0%#)(S
>
8销量
0)06((0(%#0(%00MS
>
8单位运输费用矩阵
'('6%()&
%&)0M)M(
)(#&6%00
6'60&(6#
(0&)6(')
))((M#%0
把记录结束标记(S)之间的数据文件部分称为记录。如果数据文件中没有记录结束标记,那么整个文件
被看作单个记录。注意到除了记录结束标记外,模型的文本和数据同它们直接放在模型里是一样的。
我们来看一下在数据文件中的记录结束标记连同模型中 函数调用是如何工作的。当在模型中第一次
调用 函数时, ! 打开数据文件,然后读取第一个记录;第二次调用 函数时, ! 读取第二
个记录等等。文件的最后一条记录可以没有记录结束标记,当遇到文件结束标记时, ! 会读取最后一条记
录,然后关闭文件。如果最后一条记录也有记录结束标记,那么直到 ! 求解完当前模型后才关闭该文件。
如果多个文件保持打开状态,可能就会导致一些问题,因为这会使同时打开的文件总数超过允许同时打开文件
的上限 #'。
当使用 函数时,可把记录的内容(除了一些记录结束标记外)看作是替代模型中NN
位置的文本。这也就是说,一条记录可以是声明的一部分,整个声明,或一系列声明。在数据文件中注释被忽
略。注意在 ! 中不允许嵌套调用 函数。
2.@text 函数
该函数被用在数据部分用来把解输出至文本文件中。它可以输出集成员和集属性值。其语法为
NN
这里 是文件名,可以采用相对路径和绝对路径两种表示方式。如果忽略 ,那么数据就被输
出到标准输出设备(大多数情形都是屏幕)。 函数仅能出现在模型数据部分的一条语句的左边,右边是
集名(用来输出该集的所有成员名)或集属性名(用来输出该集属性的值)。
我们把用接口函数产生输出的数据声明称为输出操作。输出操作仅当求解器求解完模型后才执行,执行次序
取决于其在模型中出现的先后。
例 4.15借用例 %-#(,说明 的用法。
7,--,$
8每天所需的最少职员数
.(1#'#0#'#&#%#(
@text('d:\out.txt')=days '至少需要的职员数为' start;
8最小化每周所需职员数
- 3 -
LINGO 教程
.7
79
722)
:9;;($6<.9
3.@ole 函数
!B 是从 BTAB 中引入或输出数据的接口函数,它是基于传输的 !B 技术。!B 传输直接在内存中传
输数据,并不借助于中间文件。当使用!B 时, ! 先装载 BTAB,再通知 BTAB 装载指定的电子数据
表,最后从电子数据表中获得 @4。为了使用 !B 函数,必须有 BTAB) 及其以上版本。!B 函数可在
数据部分和初始部分引入数据。
!B 可以同时读集成员和集属性,集成员最好用文本格式,集属性最好用数值格式。原始集每个集成员
需要一个单元,而对于 元的派生集每个集成员需要 个单元,这里第一行的 个单元对应派生集的第
一个集成员,第二行的 个单元对应派生集的第二个集成员,依此类推。
!B 只能读一维或二维的 @4(在单个的 BTAB 工作表O中),但不能读间断的或三维的
@4。@4 是自左而右、自上而下来读。
例 4.16
sets:
PRODUCT; !产品;
MACHINE; !机器;
WEEK; !周;
ALLOWED(PRODUCT,MACHINE,WEEK):x,y; !允许组合及属性;
.1-1#
U@!EDAG$FLAIB$HBBV$L!HBE$$7.!BWEXFU!@G-TKW
!BWEXFU!@G-TKW.
enddata
代替在代码文本的数据部分显式输入形式,我们把相关数据全部放在如下电子数据表中来输入。下面是
EXFU!@G-TK 的图表。
除了输入数据之外,我们也必须定义 @4 名:U@!EDAG,FLAIB,HBBV,L!HBE,,7-
明确的,我们需要定义如下的 @4 名:
Name Range
U@!EDAGY0Y%
FLAIBA0A%
HBBVE0E)
L!HBEYME#1
TJMJ#1
Z M #1
A#0
为了在 BTAB 中定义 @4 名:
[按鼠标左键拖曳选择 @4,
\释放鼠标按钮,
]选择“插入名称定义”,
^输入希望的名字,
_点击“确定”按钮。
- 4 -
LINGO 教程
我们在模型的数据部分用如下代码从 BTBA 中引入数据:
U@!EDAG$FLAIB$HBBV$L!HBE$$7.!BWEXFU!@G-TKW
!BWEXFU!@G-TKW.
等价的描述为
U@!EDAG$FLAIB$HBBV$L!HBE$$7
.!BWEXFU!@G-TKW$U@!EDAG$FLAIB$HBBV$L!HBE$$7
!BWEXFU!@G-TKW$.
这一等价描述使得变量名和 @4 不同亦可。
4.@ranged(variable_or_row_name)
为了保持最优基不变,变量的费用系数或约束行的右端项允许减少的量。
5.@rangeu(variable_or_row_name)
为了保持最优基不变,变量的费用系数或约束行的右端项允许增加的量。
6.@status()
返回 ! 求解模型结束后的状态:
1 +!(全局最优)
#+(不可行)
(D+(无界)
0D(不确定)
%J+(可行)
)+D+(通常需要关闭“预处理”选项后重新求解模型,以确定模型究竟是不可行还
是无界)
'!(局部最优)
67+(局部不可行,尽管可行解可能存在,但是 ! 并没有找到一个)
MA`(目标函数的截断值被达到)
&B(求解器因在某约束中遇到无定义的算术运算而停止)
通常,如果返回值不是 1、% 或 ' 时,那么解将不可信,几乎不能用。该函数仅被用在模型的数据部分来输
出数据。
例 4.17
.
.
部分计算结果为:
00
!+=335#-111111
>
6
>
?+?@A
T%-6#(0MM1-111111
结果中的 ' 就是返回的结果,表明最终解是局部最优的。
7.@dual
3+:返回变量的判别数(检验数)或约束行的对偶(影子)价格(
)。
4.9 辅助函数
1.@if(logical_condition,true_result,false_result)
函 数 将 评 价 一 个 逻 辑 表 达 式 4 , 如 果 为 真 , 返 回 , 否 则 返 回
。
例 4.18求解最优化问题
- 5 -
剩余38页未读,继续阅读
jwen_001
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0