hitman 发表于 2010-3-27 15:54

怎么把lingo中集合所需要的点剔除出来?谢谢。

flashupload/swf/100327074103jho1gg5agttn.jpg
i点是目标点,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函数吗?书上没有看到过类似的。

olh2008 发表于 2010-3-27 17:14

过虑条件写在集的后面,用“|”隔开,比如
@sum(link(i,j)|i #le#5 #and# j #gt# 3:x(i,j))
不过我不太清楚你那个约束是什么意思

hitman 发表于 2010-3-27 18:26

回复 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点过滤出来,谢谢。

olh2008 发表于 2010-3-27 21:13

回复 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

hitman 发表于 2010-3-28 19:58

谢谢版主,将实际数据输进去后,并且运行后确实得到了答案。
现在明白了,下标的过滤问题不一定要在目标函数中就表示出来。

Maosen 发表于 2010-4-10 02:39

请问有Lingo11的序列号吗?我刚装了可是偏偏就是要序列号用不了!
页: [1]
查看完整版本: 怎么把lingo中集合所需要的点剔除出来?谢谢。