怎么把lingo中集合所需要的点剔除出来?谢谢。
flashupload/swf/100327074103jho1gg5agttn.jpgi点是目标点,j点是攻击设施所在点,ai是i点的伤亡数(为已知数据),D是射程范围(已知)xij=1表示i攻击j,否则为0,怎么把目标函数表示出来?谢谢。
sets:
attack/1..5/;
target/1..10/:a;
link(attack, target): D,x;
endsets
Max=@sum(link:a(i)*x(i,j)),目标函数里的j点不知道怎么表示,请教。是要用到if函数吗?书上没有看到过类似的。 过虑条件写在集的后面,用“|”隔开,比如
@sum(link(i,j)|i #le#5 #and# j #gt# 3:x(i,j))
不过我不太清楚你那个约束是什么意思 回复 2# olh2008
可能我没有表达清楚,这里重新解释下题目的意思,还请斑竹和各位赐教:先把目标公式简化下:flashupload/swf/100327102525jgxogytfnbt1.jpgi点是目标点,i=1…10, j点是导弹发射场所,j=1…5。ai是i点被1枚导弹击中造成的伤亡数(为已知数据),D是导弹的射程范围(已知为常数),目标函数是要在5个发射场所中选出3个导弹发射场所,放置导弹各1枚,即总共可以放置3枚,使得3枚导弹对于10个目标点中的3个目标点造成最大的伤害数,1枚导弹只能打击1个目标点,不能重复打击相同的目标点。xij=1表示j点放置的导弹攻击目标点i,否则为0,怎么把目标函数表示出来?谢谢。
sets:
attack/1..5/;!j表示;
target/1..10/:a;!i表示;
link(attack, target): x;!j,i表示;
endsets怎么把目标函数里在攻击半径D内的j点过滤出来,谢谢。 回复 3# hitman
我觉得不应该把它放到过虑条件里去,应该把它加入到条件中。因为过虑条件一般都只能对下标进行过虑,而你的式子中包含了非下标的关系表达式,这一个好像在Lingo中是无法实现的。
还有一个要注意的是:Lingo中的大小写不敏感,比如D与d会被认为是同一个变量。
根据我对题目的理解,我试着写了Lingo的代码,应该能解决你上面所陈述的问题。
model:
sets:
attack/1..5/:; !导弹发射场所,j;
target/1..10/:a; !目标打击点,j;
link(attack,target):d,x;
endsets
data:
k= ; !导弹的射程;
a= ;!被导弹击中后各目标点的伤害;
d= ; !第i个导弹发射场与第j个目标之间的距离;
enddata
max=@sum(link(j,i):x(j,i)*a(i)); !使造成的打击伤害最大;
@sum(link:x)=3; !3枚导弹;
@for(link(j,i):x(j,i)*d(j,i)<=k); !导弹射程的限定;
@for(link:@bin(x)); !x为0-1变量;
end
谢谢版主,将实际数据输进去后,并且运行后确实得到了答案。
现在明白了,下标的过滤问题不一定要在目标函数中就表示出来。 请问有Lingo11的序列号吗?我刚装了可是偏偏就是要序列号用不了!
页:
[1]