五段程序架构

LINGO程序一般以“Model:”开始,“End”结束。在程序中若没有Model和End也能执行但最好还是写完整。每条语句之后要有一个分号。

Model:
	Title "Example";
	......
	......
End

集合段

集合段:以“SETSL:”开始,“ENDSETS”结束。

SETS:
	Car /1..2/ : a, b;
	Box /1..6/ : c, d;
	Link(Car, Box) : x;
ENDSETS

代码中Car表示集合名称,也是集合存储的数的类别名,后面的1到2表示两个两个变量下表分别为1和2,后面的a,b表示变量名。到这里相当于分别定义了 a 1 , a 2 , b 1 , b 2 a_1, a_2, b_1, b_2 a1​,a2​,b1​,b2​

第三句Link(Car, Box)表示同时用两种集合来定义变量,相当于定义了 x 11 ⋯ x 16 , x 21 ⋯ x 26 x_{11} \cdots x_{16}, x_{21} \cdots x_{26} x11​⋯x16​,x21​⋯x26​下标的第一位对应Car集合类型,而第二位对应Box集合类型。

数据段

数据段,以"DATA:"开始,"ENDDATA"结束,数列中用逗号或空格隔开每个数。

DATA:
	a = 1, 2, 3, 4, 5, 6;
	b = 7 8 9 10 11;
	c = 12 13 14 15;
ENDDATA

其中a,b,c分别为集合段定义的变量,在DATA段把数据存储到变量里。

初始段

初始段,以“INIT:”开始,“ENDINIT”结束,对变量赋初值

INIT:
	x,y = 1, 2, 3, 4, 5, 6;
ENDINIT

相当于(x, y)分别为 ( 1 , 2 ) , ( 3 , 4 ) , ( 5 , 6 ) (1, 2), (3, 4), (5, 6) (1,2),(3,4),(5,6)

计算段

计算段,以“CALC:”开始,“ENDCALC”结束。对原始数据进行计算,相当于对数据的预处理。

CALC:
	Total Number = @sum(Car:a * b);
ENDCALC

在这一步中使用了sum函数,调用函数时要加‘@’符号。sum函数中第一个参数Car(i)表示迭代的集合名,指定为Car则后面的i会分别从1枚举到2,相当于计算 a 1 ∗ b 1 + a 2 ∗ b 2 a_1*b_1+a_2*b_2 a1​∗b1​+a2​∗b2​

目标与约束段

目标与约束段:目标函数、约束条件等没有段的开始和结束标记,因此实际上就是除了其它四个段(都明确的段标记)外的LINGO模型。他是LINGO程序最重要的部分。

Min = @sum(box, c+d);
@for(Car : a + b < 10);
@for(Link:@bin(x));
Min

一些实例

  1. 如何表示约束
    ∑ x = 1 100 x i ≤ 90 \sum_{x=1}^{100}x_i\leq 90 x=1∑100​xi​≤90
SETS:
	s/1..100/ : x;
ENDSETS
@sum(s : x < 90); 
  1. 如何定义 0 − 1 0-1 0−1变量集合
SETS:
	a/1..100/:;
	b/1..100/:;
	c(a, b): x;
ENDSETS
@for(c(i, j):@bin(x(i, j)));
  1. 如何表示多个约束
    ∑ i = 1 100 x i j ≥ 150 \sum_{i=1}^{100}x_{ij} \geq 150 i=1∑100​xij​≥150
SETS:
	a/1..100/:;
	b/1..100/:;
	c(a,b):x;
ENDSETS
@for(b(j):@sum(a(i):x(i,j)) > 150);
b(j)
SETS:
	a/1..20/:;
	b/1..30/:;
	c/1..40/:;
	d(a,b,c):x;
ENDSETS
@for(a(i):@for(b(j):@sum(c(k)|k #gt# 1 #and# k #ne# 10:x(i,j,k)=100)));

其中两个井号之间的是逻辑运算符,以下是LINGO的九种逻辑运算符

运算符说明
#not#逻辑非
#and#逻辑与
#or#逻辑或
#eq#判断是否相等
#ne#判断是否不相等
#gt#大于
#ge#大于等于
#lt#小于
#le#小于等于

过滤的时候在集合左边加‘|’然后跟上下标满足的条件即可。

  1. 上三角矩阵的建立
    ∑ i = 1 4 ∑ j = i 4 c i j x i j \sum_{i=1}^{4}\sum_{j=i}^{4}c_{ij}x_{ij} i=1∑4​j=i∑4​cij​xij​
SETS:
	month/1..4/:;
	link(month, month) | &2 #ge# &1:c, x;
ENDSETS
DATA:
	c = 70 72 74 76
	  	   71 73 75
	  	      80 82
	  	         76;
ENDDATA
&2&1