Lingo 编程方法
- 不使用集合语言--------解决小规模问题(笨办法编程)
- 使用集合语言-----------解决大规模问题
Lingo 编程步骤
- 确保模型正确(清楚每个式子的意思,变量,下标均严格区分,确定已知数据,模型类型)
- 确定指标集,定义集合
- 确定变量(程序变量(已知数据的量),决策变量)及其依赖的指标集
- 写出每个式子
例题:
目标函数: max z = 4x1 + 3x2,
约束条件:
{
2x1 + x2 <= 10,
x1 + x2 <= 8,
x2 <= 7,
x1,x2 >=0.
}
注:如果要求x1,x2为整数,则变成整数规划
answer:
max = 4 * x1 + 3 * x2; %和前面问题相比,不需要z,每句后面都要加分号
2 * x1 + x2 <= 10; % 2*x1 2x1中间加 *
x1 + x2 <= 8;
x2 <= 7;
@gin(x1); %表示 整数约束
@gin(x2);
注意:
max,min 用于定义目标函数
@bin(x) 表示x为0 或 1
@gin(x) 表示x为整数
@free(x) 表示x为任意实数
@bnd(l, x, u) 表示x为[l, u]之间的实数
默认变量是非负实数
思考:
如果x为-5到5的整数,则
@free(x); % 定义x是任意实数
@bnd(-5, x, 5); % 定义 x为[-5, 5] 之间的实数
@gin(x); % 表示 x 是 -5到5 的整数
sets :
S/1..6/: a, b, d;
T/1..2/: e, x, y;
U(S,T): c;
endsets
data:
a = 1.25 8.75 0.5 5.75 3 7.25;
b = 1.25 0.75 4.75 5 6.5 7.75;
d = 3 5 4 7 6 11;
x = 5 2;
y = 1 7;
e = 20 20;
enddata
min = @sum(T(j): @sum(S(i): c(i, j) * @sqrt((x(j) - a(i))^2) + (y(j) - b(i))^2));
@for (S(i) : @sum(T(j): c(i, j)) = d(i));
@for (T(j) : @sum(S(i): c(i, j)) <= e(j));