楼主: no7line
6440 5

[统计软件] 新人第一次用lingo求最短路径,求大大们帮忙 [推广有奖]

  • 0关注
  • 1粉丝

学科带头人

16%

还不是VIP/贵宾

-

威望
0
论坛币
5 个
通用积分
99.0000
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
79952 点
帖子
903
精华
0
在线时间
386 小时
注册时间
2017-4-3
最后登录
2020-6-14

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
自己照样子写了个程序,也能运行,但是能请大大们帮忙讲解下程序代码是什么意思吗
@for(cities(i)|i#ne#1#and#i#ne#n:@sum(roads(i,j):x(i,j))=@sum(roads(j,i):x(j,i)));
@sum(roads(i,j)|i#eq#1:x(i,j))=1;
@sum(roads(i,j)|j#eq#n:x(i,j))=1;
@for(roads:@bin(x));

这几条代码的含义看了lingo教程讲解,但是还是理不清楚
求大大们帮忙,谢谢了







全部代码:
model:
sets:
cities/V1,V21,V22,V31,V32,V41,V42,V51,V52,V6/;
roads(cities,cities)/V1 V21,V1 V22,V1 V31,V1 V32,
                     V21 V31,V21 V32,V22 V31,V22 V32,
                     V21 V51,V21 V52,V22 V51,V22 V52,
                     V31 V41,V31 V42,V32 V41,V32 V42,
                     V41 V51,V41 V52,V41 V51,V42 V52
                     V51 V6,V52 V6
/:x,w;
endsets
data:
w=2127.428 4290 3578.281 7440.3
  2374.139 7191.6 2749.139 6816.6
  6960.803 20314.5 7335.803 19939.5
  1390.795 4350.3 1765.795 3975.3
  3928.825 12376.5 4303.825 12001.5
  0 0
;
enddata
n=@size(cities);
min=@sum(roads:w*x);
@for(cities(i)|i#ne#1#and#i#ne#n:@sum(roads(i,j):x(i,j))=@sum(roads(j,i):x(j,i)));
@sum(roads(i,j)|i#eq#1:x(i,j))=1;
@sum(roads(i,j)|j#eq#n:x(i,j))=1;
@for(roads:@bin(x));
end
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:lingo Lin ING NGO lingo教程

沙发
cheng334 发表于 2017-4-22 18:40:15 |只看作者 |坛友微信交流群
解釋如下:
model:                       !模型建構開始;
sets:                        !集合段(定義集合變量及其元素);
cities/V1,V21,V22,V31,V32,V41,V42,V51,V52,V6/;      !為cities變量斜線後為其元素;
roads(cities,cities)/V1 V21,V1 V22,V1 V31,V1 V32,   !roads代表cities元素間是否相連的變量,變量有x及w;
                     V21 V31,V21 V32,V22 V31,V22 V32,
                     V21 V51,V21 V52,V22 V51,V22 V52,
                     V31 V41,V31 V42,V32 V41,V32 V42,
                     V41 V51,V41 V52,V41 V51,V42 V52,
                     V51 V6,V52 V6
/:x,w;                                             !依最短路徑問題來講,x為是否通過,只有通過:1,及不通過:0,而w為權重,可能代表通過的成本;
endsets
data:                         !數據段;
w=2127.428 4290 3578.281 7440.3
  2374.139 7191.6 2749.139 6816.6
  6960.803 20314.5 7335.803 19939.5
  1390.795 4350.3 1765.795 3975.3
  3928.825 12376.5 4303.825 12001.5
  0 0
;
enddata
n=@size(cities);               !為cities的大小,即城市總數,計算它是因為後續的限制式用到它;
min=@sum(roads:w*x);           !目標式,目標是最小化(sum是集合求和函數,而for 為集合循環函數);
@for(cities(i)|i#ne#1#and#i#ne#n:@sum(roads(i,j):x(i,j))=@sum(roads(j,i):x(j,i)));   !"|"後到":"之間為邏輯限制,在此表i不等於1且i也不等於n時;
                                                                              !即i不是起點也不是終點時,必為一進一出,故xij=xji(不是同為1,就是同為0);
@sum(roads(i,j)|i#eq#1:x(i,j))=1;          !i為起點,起點一定是1,否則無解(只有出);
@sum(roads(i,j)|j#eq#n:x(i,j))=1;          !i為終點,終點一定也為1,否則無解(只有進)(其實這條限制是多餘的,無它也能得到相同的答案);
@for(roads:@bin(x));                       !要求x的值只有{0,1};
end
已有 3 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
admin_kefu + 30 热心帮助其他会员
wujianjack2 + 5 精彩帖子
no7line + 1 + 1 + 1 精彩帖子

总评分: 论坛币 + 35  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

使用道具

藤椅
no7line 发表于 2017-4-23 02:29:49 |只看作者 |坛友微信交流群
cheng334 发表于 2017-4-22 18:40
解釋如下:
model:                       !模型建構開始;
sets:                        !集合段(定義集合 ...
太感谢大大您了,就是
@for(cities(i)|i#ne#1#and#i#ne#n:@sum(roads(i,j):x(i,j))=@sum(roads(j,i):x(j,i)));
表示必為一進一出,是不是和下面的两条联合起来
@sum(roads(i,j)|i#eq#1:x(i,j))=1;
@sum(roads(i,j)|j#eq#n:x(i,j))=1;
就是表示路线一定是从起到整点,且是连贯的路线是吗

使用道具

板凳
cheng334 发表于 2017-4-23 16:21:00 |只看作者 |坛友微信交流群
是的。
注意前方的cities,表這個限制式是針對cities屬性的,其中i#ne#1,表i不等於1,即它不是cities(1)(起點V1);另外,i#ne#n,表它不是cities(n)(終點V6),符合這個限制的cities(i),才是這個限制式要針對的。
這個限制可以理解為是針對cities的,它要求不是起點V1及終點V6的其他cities(如v21,v22,...,v52),才是這條限制式的對象。我所謂的"一進一出",表除了v1及v6外的點,必為進入點,也同時為指出點,舉例來看,如v21為經過點,它可能是v1->v21是個進入點,而且它也必有從v21->某點(如v21->v31或v21-v32),是個指出點,因為這樣才能保證這條路徑可以走到終點。所以由i->j的總和=由j->i的總和,必為一進一出。
下兩條式子是針對roads屬性的,要求i#eq#1表它是roads(1,j),可能為v1->v21,v1->v22,..v1->v32等,v1只有一條路出去,即x(1,j)只有一個值為1,其他是0,所以加總為1。同理,最後一條限制式是針對roads(i,n)的,同樣要求只有一條路到達v6。

使用道具

报纸
no7line 发表于 2017-4-23 18:45:13 |只看作者 |坛友微信交流群
cheng334 发表于 2017-4-23 16:21
是的。
注意前方的cities,表這個限制式是針對cities屬性的,其中i#ne#1,表i不等於1,即它不是cities(1)(起點 ...
知道了,“一進一出”就是说除了起点终点之外,当从别的地方到达一个点时,也一定会从这个点离开去别的地方,这样子就连贯了。
谢谢大神,你讲的又清楚又形象,谢谢了

使用道具

地板
cheng334 发表于 2017-4-23 22:55:41 |只看作者 |坛友微信交流群
不謝,祝您學習lingo順利

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加JingGuanBbs
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-27 08:30