几个命令:
@bin(x)表示x为0或1
@gin(x)表示x为整数
@free(x)表示x为任意实数
@bnd(1, x, u)表示x为[1,u]之间的实数
默认变量是非负实数
思考:1、如果x为-5到5之间的整数,如何表示?
答:@free(x);
@bnd(-5, x, 5);
@gin(x);
2、如果x∈{-1, 1},如何表示?
*** 运输+选址问题
某公司有6个建筑工地,位置坐标为(ai, bi)(单位:公里),水泥日用量di(单位:吨)
i 1 2 3 4 5 6
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
例题:
(1) 现有2料场,位于A[5, 1], B[2, 7], 记(xj, yj), j = 1, 2,日储量ej各有20吨
假设料场和工地之间有直线道路,指定每天的供应计划,即从A, B两料场分别向各工地运送多少吨水泥,使总的吨公里数最小
取决策变量c_ij表示i工地从j料场运来的水泥量。模型(线性模型)为:
代码正文:
model:
sets: ! 集合段。定义集合以sets开头,endsets结束;
S/1..6/: a, b, d; ! 初始集合一维数组(/ /之间表示下标的取值范 围,1..6表示1到6这6个数字);
T/1..2/: e, x, y; ! S与T称为数组的类型名,:后代表变量名;
U(S,T): c; ! 衍生集合二维数组,类型Link, ()内为(行,列)
endsets
data: !数据段。数据开头以data开头,enddata结束
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)));
! @sum是lingo的函数,作用是*某个集合的所有成员求指定表达式的和*,第一个参数为*集合名称*
(可以为初始集合或衍生集合),第二个参数是*表达式*,表示对这个表达式进行求和运算。@sum有索引(i,j)类似于下标
@for(S(i):@sum(T(j):c(i,j)) = d(i));
@for(T(j):@sum(S(i):c(i,j)) <= e(j));
! @for是lingo的函数,作用是对某个集合的所有成员生成一个约束表达式
!第一个参数表示对哪个集合生成约束表达式,例如:Σ(j从1到2)cij,i = 1, 2...6。那么这时第一个参数就是
i对应的初始集合,生成了6个约束表达式
!第二个参数是约束表达式的具体内容,此题具体内容就是求和
end