如何理解Lingo语法-以用Lingo求解运输问题为例
- 原创
- |
- 浏览:3522
- |
- 更新:
Lingo操作步骤
Lingo版本为:Lingo 17 X64 商业版,代码如下图所示
Lingo代码如下:
sets:
supplys/1..3/: S;
demands/1..4/: D;
links(supplys, demands): c, x;
endsets
data:
S = 7,4,9;
D = 3,6,5,6;
c = 3 11 3 10
1 9 2 8
7 4 10 5;
enddata
min = @sum(links(i,j): c(i,j) * x(i,j));
@for(supplys(i): @sum(demands(j): x(i,j)) = S(i));
@for(demands(j): @sum(supplys(i): x(i,j)) = D(j));
运行结果(部分)如下图所示,结果解释:最优运费是85,运输方案是:S1往D3、D4分别运送5和2;S2往D1、D4分别运送3和1;S3往D2、D4分别运送6和3.
END
Lingo语法说明
1. Lingo代码段
Lingo代码分为若干片段,比如上面代码包含了:
集合段:sets: ...... endsets ——用来声明和定义数组变量;
数据段:data: ...... enddata ——用数据对变量赋值;
目标与约束段: 即具体模型表述部分(不需起止标志)。
注:另外还可以有初始段和计算段。
例 1 中涉及到两个一维数据:供应 [公式] 、需求 [公式] ; 以及一个二维数据 [公式] . 所以要存储和使用它们,必须要用到集合段和数据段,当然还必须有模型段。
2. 集合段部分
(1) 集合段第一句:supplys /1 .. 3/: S;
声明一个长度为 3 的一维数组 supplys, 并用它定义一个这样的一维数组变量 S.
先是数组名(随便起),再是用两个 / 夹在中间的是数组的下标范围,中间 .. 是省略表示法,接着用 : 定义数组变量 S。
(2) 同理,第二句 demands/1..4/: D; 声明一个长度为 4 的一维数组 demands,并定义一个这样的一维数组变量 D。
(3) 第三句 links(supplys, demands): c, x; 声明一个 [公式] 的二维数组 links,并用它定义两个这样的二维数组变量 c, x.
把两个一维数组放一起,起个名字叫 links,得到二维数组 links,第1个一维数组的维数就是二维数组的行数维度,第2个一维数组的维数就是二维数组的列数维度。
注意:这里 links 不是Lingo关键字,可以随便起名。
3. 数据段部分
前面定义好的数组变量 [公式] ,就是为了存放已知数据的,把已知数据赋值给它们,以便目标与约束段使用。
数据中间用 逗号/空格 隔开都可以,二维数据写成一行也行,这样写比较易读而已。
4. 目标与约束段部分
为什么不叫模型段呢,是因为Lingo一般是把全部代码放在 model: ....... end 中间(就解决一个问题,省略也行),整个叫做模型段。该部分就是把模型公式“原样”表述出来,咱们对照着来看:
END
注意事项
- 如果对于不同版本的Lingo,其求解操作过程可能有细微的不同,请您自行加以调整。
- 师者,所以传道受业解惑也。人非生而知之者,孰能无惑?惑而不从师,其为惑也,终不解矣。如对您有帮助,请不吝点击投票转发,如您有任何疑问或建议,请留言评论。















