1.简介:LINGO的系统定位与技术特征
1.1开发背景以及行业定位
LINGO由美国LINDO系统公司开发,是工业级数学规划求解器的代表产品。其核心算法融合了分支定界法(Branch and Bound)、广义既约梯度法(Generalized Reduced Gradient)及启发式搜索技术,在供应链优化、金融风险分析等领域具有广泛学术应用(参考文献:Hillier & Lieberman, 2015)。
1.2版本架构与功能边界
各版本技术参数对比如下:
| 版本 | 最大决策变量数 | 整型变量上限 | 非线性项支持 |
|---|---|---|---|
| Demo | 300 | 30 | 仅线性 |
| Solve Suite | 5,000 | 500 | 二阶锥规划 |
| Extended | 无限制 | 无限制 | 全局优化 |
2.入门级用法
2.1lingo的运算符和函数
算术运算符:
| ^ , + , - , * , / | 次方,加,减,乘,除 |
逻辑运算符:
| 运算符 | 理解 |
| #eq# | (equal)两个运算对象相等时为真,否则为假 |
| #ne# | (not equal)两个运算对象不相等时为真,否则为假 |
| #gt# | (greater than)左边大于右边时为真,否则为假 |
| #ge# | (greater equal)左边大于或等于右边时为真,否则为假 |
| #lt# | (less than)左边小于右边时为真,否则为假 |
| #le# | (less equal)左边小于或等于右边时为真,否则为假 |
| #not# | (非门)单目运算符,表示对运算对象取反,即真变成假,假变成真辑 |
| #and# | (与门)两个运算对象都真时为真,否则为假 |
| #or# | (或门)两个运算对象都假时为假,否则为真 |
关系运算符:
| =,>=,<= | lingo中不存在<,>关系,如果出现,则默认省略= |
常用函数:
| 变量定界函数 | |
| @FREE(x) | 取消对变量X的限制(即X可取任意实数值 |
| @BIN(x) | 限制X为0或1. 该函数在0-1 规划中特别有用 |
| @GIN(x) | 限制X为整数.该函数在整数规划中特别有用 |
| @BND(a,x,b) | 限制a<=X<=b,可用作约束条件 |
| 集合操作函数 | |
| @FOR(s:e) | 该函数常用在约束条件中,表示对集合s中的每个成员都生成一个约束条件表达式,表达式的具体形式由参数e描述 |
| @SUM(s:e) | 对集合s中的每个成员,分别得到表达式e的值,然后返回所有这些值的和 |
| @MAX(s:e) | 对集合s中的每个成员,分别得到表达式e的值,然后返回所有这些值中的最大值 |
| @MIN(s:e) | 对集合s中的每个成员,分别得到表达式e的值,然后返回所有这些值中的最小值 |
| 数学函数 | |
| 待学ing | |
| 概率函数 | |
| 待学ing |
2.2lingo模型的基本组成(以指派问题为例)
案例背景:某教授需要将4项课程作业(作业1-4)分配给4位学生(A-D),每位学生在不同作业上耗时如下(小时):
| 学生\作业 | 作业1 | 作业2 | 作业3 | 作业4 |
|---|---|---|---|---|
| 学生A | 9 | 5 | 4 | 2 |
| 学生B | 12 | 7 | 9 | 6 |
| 学生C | 3 | 1 | 8 | 10 |
| 学生D | 4 | 6 | 3 | 7 |
| model: | |
| sets: | 集合的定义 |
| students /1..4/:; works /1..4/:; | 集合的名称/集合内的成员/:集合的属性;(可以看做集合相关的变量,可以不写) |
| assign(students,works):time; | 以students和works为基础的衍生集合(students*works的行列式) |
| endsets | |
| data: | 数据初始化 |
| time = 9 5 4 2 12 7 9 6 3 1 8 10 4 6 3 7; | 对于time中的已知属性赋予初始值 |
| enddata | |
| MIN = @SUM(assign(i,j): time(i,j)*X(i,j)); | 目标函数 |
| @FOR(students(i): @SUM(works(j): X(i,j)) = 1 ); | 约束条件 |
| @FOR(works(j): @SUM(students(i): X(i,j)) = 1 ); | |
| @FOR(assign(i,j): @BIN(X(i,j))); | |
| end |
2.3lingo的菜单
2.4lingo的典型应用
普通线性规划:

model:
sets:
row/1..6/:a;
col/1..8/:d;
coo(row,col):c,x;
endsets
data:
a=60,55,51,43,41,52;
d=35,37,22,32,41,32,43,38;
c=6,2,6,7,4,2,5,8
4,9,5,3,8,5,8,2
5,2,1,9,7,4,3,3
7,6,7,3,9,2,7,1
2,3,9,5,7,2,6,5
5,5,2,2,8,1,4,3;
enddata
min=@sum(coo(i,j):c(i,j)*x(i,j));
@for(row(i):@sum(col(j):x(i,j))<=a(i));
@for(col(j):@sum(row(i):x(i,j))=d(j));
end
0-1规划:

!0-1规划,用@bin(x)限制x为0或者1 ;
model:
sets:
row/1..8/:a,b,x;
endsets
data:
a=2,9,3,8,10,6,4,10;
b=1,3,4,3,3,1,5,10;
enddata
max=@sum(row:a*x);
@sum(row:b*x)<=15;
@for(row:@bin(x));
end
整数规划:

!整数规划,用@gin(x)限制x为整数;
model:
sets:
row/1..6/:a,x;
col/1..5/:b;
coo(row,col):c;
endsets
data:
a=2.1,1.0,1.8,1.2,2.0,1.2;
b=6,125,12500,345,5;
c=0.45,20,415,22,0.3
0.45,28,4065,5,0.35
0.65,40,850,43,0.6
0.4,25,75,27,0.2
0.5,26,76,48,0.4
0.5,75,235,8,0.6;
enddata
max=@sum(row(i):a(i)*x(i));
@for(col(j):@sum(row(i):c(i,j)*x(i))<=b(j));
@sum(row(i):x(i))=14;
x(2)<=3;
x(4)<=2;
@for(row(i)|i#ne#2 #and# i#ne#4:x(i)>=1);
@for(row(i)|i#ne#2 #and# i#ne#4:x(i)<=4);
@for(row(i):@gin(x(i)));
end
3.lingo在图论与网络模型中的应用
最短路问题:

MODEL:
SETS:
CITIES /A,B,C,D,E,F,G/: FL; !定义7个城市;
ROADS(CITIES,CITIES) /A,B A,C B,D B,E B,F C,D C,E C,F D,G E,G F,G/: W,P;
!定义哪些城市之间有路相联,W为里程,P用来存放最短路的路径;
ENDSETS
DATA:
W = 2 4 3 3 1 2 3 1 1 3 4;
ENDDATA
N = @SIZE(CITIES);
FL(@SIZE(CITIES)) = 0; !终点的F值为0;
@FOR(CITIES(i) | i #LT# N:
FL(i) = @MIN(ROADS(i,j): W(i,j) + FL(j))
); !递推计算各城市F值;
!显然,如果P(i,j)=1,则点i到点n的最短路径的第一步是i-->j,否则就不是。由此,我们就可方便地确定出最短路径;
@FOR(ROADS(i,j):
P(i,j) = @IF(FL(i) #EQ# W(i,j) + FL(j), 1, 0)
);
END
最大流问题:

MODEL:
SETS:
CHSH/1..6/;
LINKS(CHSH,CHSH)/1,2 1,3 2,4 2,5 3,4 3,5 4,6 5,6 6,1/:C,F;
!该集合列出有弧相连的顶点对,与每一条弧一一对应,6,1是虚拟弧;
ENDSETS
DATA:
C = 16 20 10 10 6 6 10 16 1000; !虚拟弧上的流量不受限制(很大的数);
ENDDATA
MAX = F(6,1); !目标函数;
!流量限制;
@FOR(LINKS(I,J):
F(I,J) <= C(I,J)
);
!每个顶点的流进等于流出;
@FOR(CHSH(I):
@SUM(LINKS(J,I): F(J,I)) = @SUM(LINKS(I,J): F(I,J))
);
END
Comments NOTHING