最短路程问题(lingo)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
P( 9, 10) 1.000000
例3.5(最短路问题)在纵横交错的公路网中,货车司机希望找到一条从一个城市到另一城市的最短路。假设图3-1表示的是该公路网,节点表示货车可以停靠的城市,弧上的权表示两个城市之间的距离(百公里)。那么,货车从城市S出发到达城市T,如何选择行驶路线,使所经过的路程最短?
4,7 4,8
5,7 5,8 5,9
6,8 6,9
7,10
8,10
9,10
/: D, P;
endsets
data:
D=
6 5
3 6 9
7 5 11
9 1
8 7 5
4 10
5
7
9;
enddata
F(n)=0;
@for(cities(i) | i #lt# n:
F(i)=@min(roads(i,j): D(i,j)+F(j));
【分析】此例的本质是求从城市A到城市D的一条最短路。
最短路问题的数学表达式
假设图有n个顶点,现需要求从顶点1到顶点n的最短路,设决策变量为xij,当xij=1说明弧(i,j)位于顶点1至顶点n的路上;否则xij=0。其数学规划表达式为
;
S.t.
下面介绍的方法是按照规划问题设计的LINGO程序,程序名exam0708.lg4.
Variable Value
N 10.00000
F( 1) 17.00000
F( 2) 11.00000
F( 3) 15.00000
F( 4) 8.000000
F( 5) 13.00000
F( 6) 11.00000
F( 7) 5.000000
F( 8) 7.000000
F( 9) 9.000000
P( 4, 7) 0.000000
P( 4, 8) 1.000000
P( 5, 7) 1.000000
P( 5, 8) 0.000000
P( 5, 9) 0.000000
P( 6, 8) 1.000000
P( 6, 9) 0.000000
P( 7, 10) 1.000000
P( 8, 10) 1.000000
L(S)=0
对本例的具体问题,可以直接计算如下:
所以,从S到T的最优行驶路线的路长为20。进一步分析以上求解过程,可以得到从S到T的最优行驶路线为S→A3→B2→C1→T
上面这种计算方法在数学上称为动态规划(dynamic programming),是最优化的一个分支。
作为一个例子,我们用LINGO来解这个最短路问题。我们可以编写如下的LINGO程序。集合段定义的“CITIES”(城市)是一个基本集合(元素通过枚举给出),L是其对应的属性变量(我们要求的最短路长);“ROADS”(道路)是由CITIES导出的一个派生集合(请特别注意其用法),由于只有一部分城市之间有道理相连,所以不应该把它定义成稠密集合,我们进一步将其元素通过枚举给出,这就是一个稀疏集合。D是稀疏集合ROADS对应的属性变量(给定的距离)
F( 10) 0.000000
P( 1, 2) 1.000000
P( 1, 3) 0.000000
P( 2, 4) 1.000000
P( 2, 5) 0.000000
P( 2, 6) 0.000000
P( 3, 4) 1.000000
P( 3, 5) 0.000000
P( 3, 6) 0.000000
MODEL:
1] ! We have a network of 7 cities. We want to find
2] the length of the shortest route from city 1 to city 7;
最短路程问题
最短路程问题(shortest path problems)是图论另一类与优化有关的问题,对于这个问题,图论中已有解决的方法,如最短路问题的求解方法有Dijkstra算法。这里主要讨论的是如何用LINGO软件来解决最短路问题。
例7在图1中,用点表示城市,现有A,B1,B2,C1,C2,C3,D共七个城市。点与点之间的连线表示城市间有道理相连。连线旁的数字表示道路的长度。现计划从城市A到城市D铺设一条天然气管道,请设计出最小价格管道铺设方案。
例7.4 最短路问题给定N个点 组成集合 ,由集合中任一点 到另一点 的距离用 表示,如果 到 没有弧联结,则规定 ,又规定 ,指定一个终点 ,要求从 点出发到 的最短路线。这里我们用动态规划方法来做。用所在的点 表示状态,决策集合就是除 以外的点,选定一个点 以后,得到效益 并转入新状态 ,当状态是 时,过程停止。显然这是一个不定期多阶段决策过程。
);
!显然,如果P(i,j)=1,则点i到点n的最短路径的第一步是i-->j,否则就不是。
由此,我们就可方便的确定出最短路径;
@for(roads(i,j):
P(i,j)=@if(F(i) #eq# D(i,j)+F(j),1,0)
);
end
计算的部分结果为:
Feasible solution found at iteration: 0
图3-1最短路问题的例子
假设从S到T的最优行驶路线P经过城市C1,则P中从S到C1的子路也一定是从S到C1的最优行驶路线;假设P经过城市C2,则P中从S到C2的子路也一定是从S到C2的最优行驶路线。因此,为了得到从S到T的最优行驶路线,我们只需要先求出从S到Ck(k=1,2)的最优行驶路线,只需要先求出从S到Bj(j=1,2)的最优行驶路线;只需要先求出从S到Ai(i=1,2)的最优行驶路线。而从S到Ai(i(i=1,2)只有唯一的道路)。
定义 是由 点出发至终点 的最短路程,由最优化原理可得
这是一个函数方程,用LINGO可以方便的解决。
!最短路问题;
model:
data:
n=10;
enddata
sets:
cities/1..n/: F;!10个城市;
roads(cities,cities)/
1,2 1,3
2,4 2,5 2,6
3,4 3,5 3,6
也就是说,此例中我们可以把从S到T的行驶过程分成4个阶段,即S→Ai(i=1,2,3)Ai→Bj(j=1,2),Bj→Ck(k=1,2),Ck→T。记d(Y,X)为城市Y与城市X之间的直接距离(若这两个城市之间没有道路直接相连,则可以认为直接距离为无穷大),用L(X)表示城市S到城市X的最优行驶路线的路长,则有
例3.5(最短路问题)在纵横交错的公路网中,货车司机希望找到一条从一个城市到另一城市的最短路。假设图3-1表示的是该公路网,节点表示货车可以停靠的城市,弧上的权表示两个城市之间的距离(百公里)。那么,货车从城市S出发到达城市T,如何选择行驶路线,使所经过的路程最短?
4,7 4,8
5,7 5,8 5,9
6,8 6,9
7,10
8,10
9,10
/: D, P;
endsets
data:
D=
6 5
3 6 9
7 5 11
9 1
8 7 5
4 10
5
7
9;
enddata
F(n)=0;
@for(cities(i) | i #lt# n:
F(i)=@min(roads(i,j): D(i,j)+F(j));
【分析】此例的本质是求从城市A到城市D的一条最短路。
最短路问题的数学表达式
假设图有n个顶点,现需要求从顶点1到顶点n的最短路,设决策变量为xij,当xij=1说明弧(i,j)位于顶点1至顶点n的路上;否则xij=0。其数学规划表达式为
;
S.t.
下面介绍的方法是按照规划问题设计的LINGO程序,程序名exam0708.lg4.
Variable Value
N 10.00000
F( 1) 17.00000
F( 2) 11.00000
F( 3) 15.00000
F( 4) 8.000000
F( 5) 13.00000
F( 6) 11.00000
F( 7) 5.000000
F( 8) 7.000000
F( 9) 9.000000
P( 4, 7) 0.000000
P( 4, 8) 1.000000
P( 5, 7) 1.000000
P( 5, 8) 0.000000
P( 5, 9) 0.000000
P( 6, 8) 1.000000
P( 6, 9) 0.000000
P( 7, 10) 1.000000
P( 8, 10) 1.000000
L(S)=0
对本例的具体问题,可以直接计算如下:
所以,从S到T的最优行驶路线的路长为20。进一步分析以上求解过程,可以得到从S到T的最优行驶路线为S→A3→B2→C1→T
上面这种计算方法在数学上称为动态规划(dynamic programming),是最优化的一个分支。
作为一个例子,我们用LINGO来解这个最短路问题。我们可以编写如下的LINGO程序。集合段定义的“CITIES”(城市)是一个基本集合(元素通过枚举给出),L是其对应的属性变量(我们要求的最短路长);“ROADS”(道路)是由CITIES导出的一个派生集合(请特别注意其用法),由于只有一部分城市之间有道理相连,所以不应该把它定义成稠密集合,我们进一步将其元素通过枚举给出,这就是一个稀疏集合。D是稀疏集合ROADS对应的属性变量(给定的距离)
F( 10) 0.000000
P( 1, 2) 1.000000
P( 1, 3) 0.000000
P( 2, 4) 1.000000
P( 2, 5) 0.000000
P( 2, 6) 0.000000
P( 3, 4) 1.000000
P( 3, 5) 0.000000
P( 3, 6) 0.000000
MODEL:
1] ! We have a network of 7 cities. We want to find
2] the length of the shortest route from city 1 to city 7;
最短路程问题
最短路程问题(shortest path problems)是图论另一类与优化有关的问题,对于这个问题,图论中已有解决的方法,如最短路问题的求解方法有Dijkstra算法。这里主要讨论的是如何用LINGO软件来解决最短路问题。
例7在图1中,用点表示城市,现有A,B1,B2,C1,C2,C3,D共七个城市。点与点之间的连线表示城市间有道理相连。连线旁的数字表示道路的长度。现计划从城市A到城市D铺设一条天然气管道,请设计出最小价格管道铺设方案。
例7.4 最短路问题给定N个点 组成集合 ,由集合中任一点 到另一点 的距离用 表示,如果 到 没有弧联结,则规定 ,又规定 ,指定一个终点 ,要求从 点出发到 的最短路线。这里我们用动态规划方法来做。用所在的点 表示状态,决策集合就是除 以外的点,选定一个点 以后,得到效益 并转入新状态 ,当状态是 时,过程停止。显然这是一个不定期多阶段决策过程。
);
!显然,如果P(i,j)=1,则点i到点n的最短路径的第一步是i-->j,否则就不是。
由此,我们就可方便的确定出最短路径;
@for(roads(i,j):
P(i,j)=@if(F(i) #eq# D(i,j)+F(j),1,0)
);
end
计算的部分结果为:
Feasible solution found at iteration: 0
图3-1最短路问题的例子
假设从S到T的最优行驶路线P经过城市C1,则P中从S到C1的子路也一定是从S到C1的最优行驶路线;假设P经过城市C2,则P中从S到C2的子路也一定是从S到C2的最优行驶路线。因此,为了得到从S到T的最优行驶路线,我们只需要先求出从S到Ck(k=1,2)的最优行驶路线,只需要先求出从S到Bj(j=1,2)的最优行驶路线;只需要先求出从S到Ai(i=1,2)的最优行驶路线。而从S到Ai(i(i=1,2)只有唯一的道路)。
定义 是由 点出发至终点 的最短路程,由最优化原理可得
这是一个函数方程,用LINGO可以方便的解决。
!最短路问题;
model:
data:
n=10;
enddata
sets:
cities/1..n/: F;!10个城市;
roads(cities,cities)/
1,2 1,3
2,4 2,5 2,6
3,4 3,5 3,6
也就是说,此例中我们可以把从S到T的行驶过程分成4个阶段,即S→Ai(i=1,2,3)Ai→Bj(j=1,2),Bj→Ck(k=1,2),Ck→T。记d(Y,X)为城市Y与城市X之间的直接距离(若这两个城市之间没有道路直接相连,则可以认为直接距离为无穷大),用L(X)表示城市S到城市X的最优行驶路线的路长,则有