☆ lingo 必知必会

!* lingo 命名 → 包括数字字母下划线,必须以字母开头
 * lingo 代码命令不区分大小写
 * 每条语句以分号 “;” 结束 
 * lingo 以 ! 开始,以 ; 结束是注释语句;

非集合语法求解问题

直接写出模型

  • 例:解方程

x^2 + x + y = 5
x + y^2 - y = 7

代码:

x^2 + x + y = 5;
x + y^2 - y = 7;

运行结果

@free(x)

lingo 程序结构

model:

sets:
... ! 产生矩阵;
endsets

data:
... ! 矩阵赋值;
enddata
... ! 求解模型;
end

实例:
请编程求解以下模型

程序:

model:

sets:
fac   /1..6/: a;   ! 产生 1 × 6 的矩阵;
plant /1..8/: d;
coo(fac, plant): c, x;  ! 产生 6 × 8 的矩阵;
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: c * x); 
@for(fac(i) : @sum(plant(j) : x(i, j)) <= a(i));
@for(plant(j) : @sum(fac(i) : x(i, j)) = d(j));
end

结果:

lingo 小知识点总结

关系运算符
  • 关系运算符往往用在约束条件中,用来指定约束条件左右两边必须满足的关系。
  • Lingo 只有三种关系运算符:“ = ”、“ >= ” 以及 “ <= ” 。

在最优化问题里,比如解为 x > 2 和 x >= 2 是一样的
若想精确地表达 x > 2 → x - e >= 2; e = 0.000001(取决于你想要的精度)

逻辑运算符

定义:

运算符含义
#eq#等于
#ne#不等于
#gt#大于
#ge#大于等于
#lt#小于
#le#小于等于
#and#
#not#
#or#

☆ 逻辑运算符一般出现的位置
for 循环和 sum 求和、if 判断

实例:

程序:

x = 560; ! 给 x 一个初值;
y = @if(x #le# 500, 4 * x, @if(x #gt# 1000, 1500 + 2 * x, 500 + 3 * x));

结果:

变量定界函数
名称含义
@bin(x)限制 x 只能取 0 / 1 (通常用在 0–1 规划中)
@gin(x)限制 x 只能取整数(通常用在整数规划中)
@bnd(a, x, b)限制 x 在 [a, b] 内
@free(x)使其定义域变为 R
数学函数
名称含义
@sin(x)返回正弦值
@cos(x)返回余弦值
@tan(x)返回正切值
@log(x)返回 x 的自然对数值
@exp(x)返回 e 的 x 次方的值
@abs(x)返回 x 的绝对值
@sigh(x)返回 x 的符号值,x >= 0 为 1,x < 0 为 -1
@floor(x)向下取整
@smax(x1, x2, x3, …, xn)返回其中的最大值
@smin(x1, x2, x3, …, xn)返回其中的最小值
集合操作函数

☆ 设 factory 生产 1 × 6 的矩阵。

名称含义
@for(factory : a )循环
@sum(factory : a)求和
@prod(factory : a)求积
@max(factory : a)求最大值
@min(factory : b)求最小值
in(factory, c)判断常数 c 是否在集合中
@size(factory)返回工厂可生产矩阵的长度