数学建模社区-数学中国
标题: 怎么把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…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的序列号吗?我刚装了可是偏偏就是要序列号用不了!
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) |
Powered by Discuz! X2.5 |