lingo中@size@for@sum函数的使用

@size:
LINGO中的@size()函数用于确定集合中元素的个数。比如你的集合是
注意:在使用size的时候直接在@size()括号里写上集合名就行,不需要写@size(s1(i))中的(i)

s1/a b c d f g /:x;

当调用m=@size(s1)时,它返回的一个数值6,因为s里面有6个元素。

@for:
该函数用来表示线性规划中的约束条件

sets:
r/1..8/:d;
c/1..8/:;     !就算没有集合属性也要写":";
link(r,c):x,y;        !派生集合;
endsets
@for(r(i):@for(c(j):x(i,j)<=y(i,j)));       !可用@for(link:x<=y)代替;
@for(r(i)|i#ge#2:d(i)>=3)            !":"前说的是对哪个集合进行约束,":"后面说的事具体是什么样的约束;
!"|"表示过滤,即筛选r(i)下标集中i>=2的下标,即/2,3..8/

@sum
该函数用来求和,格式:@sum(setname(i):x(i))

总的例子:

model:
title cutting-stock problem;       !给模型起个名字;
sets:
needs/1..4/:length,num;
cuts/1..3/:x;
patterns(needs,cuts):r;
endsets
data:
length = 4 5 6 8;
num = 50 10 20 15;
capacity = 19;      !后面用的比较多的常数;
enddata
min = @sum(cuts(i):x(i));
@for(cuts(j):@sum(needs(i):length(i)*r(i,j))<capacity);
@for(cuts(j):@sum(needs(i):length(i)*r(i,j))>capacity-@min(needs:length));
@for(needs(i):@sum(cuts(j):x(j)*r(i,j))>num(i));
@sum(cuts(i):x(i))>26;
@sum(cuts(i):x(i))<31;  
@for(cuts(i)|i#lt#@size(cuts):x(i)>x(i+1));    !x1>=x2>=x3;
@for(cuts:@gin(x));          !每一个x都要是整数;
@for(patterns:@gin(r));        !每一个r都要是整数;
end

如果不足欢迎指正

发布了11 篇原创文章 · 获赞 25 · 访问量 5978

猜你喜欢

转载自blog.csdn.net/qq_41196612/article/details/88789605