数学建模社区-数学中国

标题: 怎么把lingo中集合所需要的点剔除出来?谢谢。 [打印本页]

作者: hitman    时间: 2010-3-27 15:54
标题: 怎么把lingo中集合所需要的点剔除出来?谢谢。
http://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


   

可能我没有表达清楚,这里重新解释下题目的意思,还请斑竹和各位赐教:

先把目标公式简化下:

http://flashupload/swf/100327102525jgxogytfnbt1.jpg

i点是目标点,i=1…10, j点是导弹发射场所,j=1…5aii点被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;ji表示;
endsets

怎么把目标函数里在攻击半径D内的j点过滤出来,谢谢。


作者: olh2008    时间: 2010-3-27 21:13
回复 3# hitman


    我觉得不应该把它放到过虑条件里去,应该把它加入到条件中。因为过虑条件一般都只能对下标进行过虑,而你的式子中包含了非下标的关系表达式,这一个好像在Lingo中是无法实现的。
   还有一个要注意的是:Lingo中的大小写不敏感,比如D与d会被认为是同一个变量。
   根据我对题目的理解,我试着写了Lingo的代码,应该能解决你上面所陈述的问题。

  1. model:
  2. sets:
  3. attack/1..5/:;   !导弹发射场所,j;
  4. target/1..10/:a; !目标打击点,j;
  5. link(attack,target):d,x;
  6. endsets

  7. data:
  8. k=  ; !导弹的射程;
  9. a=  ;!被导弹击中后各目标点的伤害;
  10. d=  ; !第i个导弹发射场与第j个目标之间的距离;
  11. enddata

  12. max=@sum(link(j,i):x(j,i)*a(i));  !使造成的打击伤害最大;

  13. @sum(link:x)=3;                            !3枚导弹;
  14. @for(link(j,i):x(j,i)*d(j,i)<=k);          !导弹射程的限定;
  15. @for(link:@bin(x));                        !x为0-1变量;
  16. end
复制代码

作者: hitman    时间: 2010-3-28 19:58
谢谢版主,将实际数据输进去后,并且运行后确实得到了答案。
现在明白了,下标的过滤问题不一定要在目标函数中就表示出来。
作者: Maosen    时间: 2010-4-10 02:39
请问有Lingo11的序列号吗?我刚装了可是偏偏就是要序列号用不了!




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5