1.简介:LINGO的系统定位与技术特征

1.1开发背景以及行业定位

LINGO由美国LINDO系统公司开发,是工业级数学规划求解器的代表产品。其核心算法融合了分支定界法(Branch and Bound)、广义既约梯度法(Generalized Reduced Gradient)及启发式搜索技术,在供应链优化、金融风险分析等领域具有广泛学术应用(参考文献:Hillier & Lieberman, 2015)。

1.2版本架构与功能边界

各版本技术参数对比如下:

版本最大决策变量数整型变量上限非线性项支持
Demo30030仅线性
Solve Suite5,000500二阶锥规划
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
学生A9542
学生B12796
学生C31810
学生D4637
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

4.lingo在非线性规划和多目标规划中的应用

此作者没有提供个人介绍。
最后更新于 2026-01-28