☆ 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) | 返回工厂可生产矩阵的长度 |