lingo中如无特殊规定,变量默认大于等于0
例题
model:
sets:
level/1..3/:p,z,goal;
variable/1,2/:x;
!x为决策变量向量;
hconnum/1/:b; !刚性约束,b表示刚性约束的资源向量;
sconnum/1..4/:g,dplus,dminus; !柔性约束,g表示柔性约束的资源向量,dplus,dminus是偏差变量;
hcons(hconnum,variable):A; ! 基于集合构造的集合,叫做派生集合;
scons(sconnum,variable):c;
obj(level,sconnum):wplus,wminus;
endsets
data:
p=? ? ?;
goal=? ? 0;
b=12;
g=1500 0 16 15;
a=2 2;
c=200 300 2 -1 4 0 0 5;
wplus=0 0 0 0
0 1 0 0
0 0 3 1;
wminus=1 0 0 0
0 1 0 0
0 0 3 0;
enddata
min=@sum(level:p*z);
@for(level(i):
z(i)=@sum(sconnum(j):wplus(i,j)*dplus(j))+@sum(sconnum(j):wminus(i,j)*dminus(j)));
@for(hconnum(i):
@sum(variable(j):a(i,j)*x(j))<=b(i));
@for(sconnum(i):
@sum(variable(j):c(i,j)*x(j))+dminus(i)-dplus(i)=g(i););
@for(level(i)|i#lt#@size(level):
@bnd(0,z(i),goal(i)););
End
例题
约束和逻辑关系式
集合 eg:
或
model:
sets:
col/1,2/:x,y,e;
row/1..6/:d,a,b;
link(row,col):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;
e=20,20;
x=5,2;
y=1,7;
enddata
min=@sum(col(j):@sum(row(i):c(i,j)*@sqrt((x(j)-a(i))^2+(y(j)-b(i))^2)));
@for(row(i):@sum(col(j):c(i,j))=d(i));
@for(col(j):@sum(row(i):c(i,j))<=e(j));
end
tips
1.lingo 不区分大小写
2.乘法符号不能省略,可以加空格
3.不能写成 x1,x2>=3;
要分两行写:
x1>=3;
x2>=3;
4.@gin(x1):要求x1是整数
5.由于lingo里默认x>=0,使用free(x)函数可以将x变成任意实数
eg:如果x是-5~5之间的实数,则需首先free(x),再令其处于-5 ~ 5
B站的lingo编程教学视频