我是鹿鹿学长,就读于上海交通大学,截至目前已经帮200+人完成了建模与思路的构建的处理了~
本篇文章是鹿鹿学长经过深度思考,独辟蹊径,通过多目标优化解决交通需求规划问题。实现综合建模。独创复杂系统视角,帮助你解决五一杯的难关呀。
完整内容可以在文章末尾领取!
问题1:图2为一个小型交通网络。各(起点,终点)对之间的交通需求见附件1。请建立数学模型,给出各(起点,终点)对之间交通需求分配到对应路径上的交通量,使得网络中任意1条路段出现突发状况时(每个路段出现突发状况概率相同),网络中所有交通需求的期望可达率最大。在表1中填入指定(起点,终点)对规划的路径,以及对应分配的交通量(起点,终点)规划路径 分配交通量
假设交通需求分配到路径上的交通量为x,可达率为y,则有:
可达率y = 实际交通量 / 总交通需求量
假设网络中共有n条路径,每条路径的交通量为xi,总交通需求量为D,可得:
实际交通量 = ∑xi
总交通需求量D = ∑yi
在路段发生突发状况时,仅有一条路径的交通量可以实现,因此有:
y = x / D
考虑到每个(起点,终点)对之间使用的路径数不超过5,因此可以将每个路径的交通量x表示为:
xi = αi * yi
其中αi为路径的选择概率,满足:
∑αi = 1
假设每个路段发生突发状况的概率均相同,且为p,则网络中所有交通需求的期望可达率为:
E ( y ) = ∑ y i ∗ ( 1 − p ) n E(y) = ∑yi * (1 - p)^n E(y)=∑yi∗(1−p)n
为了使网络中所有交通需求的期望可达率最大,需要最大化E(y),即需要最大化∑yi * (1 - p)^n,即最大化∑αi * yi * (1 - p)^n。
将上述公式代入最大化问题中,得到最终的数学模型为:
最大化 ∑ α i ∗ y i ∗ ( 1 − p ) n ∑αi * yi * (1 - p)^n ∑αi∗yi∗(1−p)n
约束条件:
∑ α i = 1 y i = α i ∗ x / D ∑ y i = D x j = Σ α i ∗ y i ∑αi = 1\\ yi = αi * x / D\\ ∑yi = D\\ xj = Σαi * yi ∑αi=1yi=αi∗x/D∑yi=Dxj=Σαi∗yi
其中i = 1, 2, …, n, j = 1, 2, …, m,m为路段数,n为路径数。
问题2:在图3所示的交通网络中,各(起点,终点)对之间的交通需求见附件2。请建立数学模型,给出各(起点,终点)对之间交通需求分配到对应路径上的交通量,使得网络中任意5条路段出现突发状况时(每个路段出现突发状况概率相同),网络中所有交通需求的期望可达率最大。在表2中填入指定(起点,终点)对规划的路径,以及对应分配的交通量(若规划路径数不足5条无需填满表格)。(起点,终点)规划路径 分配交通量
问题二与问题一类似,不同之处在于需要考虑任意5条路段出现突发状况时的情况。因此,需要增加一个约束条件,即:
∑ y j = D ∑yj = D ∑yj=D
其中j = 1, 2, …, 5,表示任意5条路段。
最终的数学模型为:
最大化 ∑αi * yi * (1 - p)^n
约束条件:
∑ α i = 1 y i = α i ∗ x / D ∑ y i = D ∑ y j = D x j = Σ α i ∗ y i ∑αi = 1\\ yi = αi * x / D\\ ∑yi = D\\ ∑yj = D\\ xj = Σαi * yi ∑αi=1yi=αi∗x/D∑yi=D∑yj=Dxj=Σαi∗yi
其中i = 1, 2, …, n, j = 1, 2, …, m,m为路段数,n为路径数。
问题3:在交通网络3中,各(起点,终点)对之间的交通需求见附件2,各路段的容量上限见附件3。请建立数学模型,给出各(起点,终点)对之间交通需求分配到对应路径上的交通量,使得网络中任意5条路段出现突发状况时(每个路段出现突发状况概率相同),网络中所有交通需求的期望可达率最大,且交通需求分配到对应的路径后,各路段上的交通量不能超过路段容量(路段交通量计算方法:路段交通量=经过该路段的路径交通量之和。例如,路径1-0-6与路径1-0-3均经过路段1-0,则路段1-0交通量=路径1-0-6交通量+路径1-0-3交通量)。在表3中填入指定(起点,终点)对规划的路径,以及对应分配的交通量(若规划路径数不足5条无需填满表格)。(起点,终点)规划路径 分配交通量
与问题二类似,不同之处在于需要考虑路段容量的约束条件。因此,最终的数学模型为:
最大化 ∑αi * yi * (1 - p)^n
约束条件:
∑ α i = 1 y i = α i ∗ x / D ∑ y i = D ∑ y j = D x j = Σ α i ∗ y i x j < = C j ∑αi = 1\\ yi = αi * x / D\\ ∑yi = D\\ ∑yj = D\\ xj = Σαi * yi\\ xj <= Cj ∑αi=1yi=αi∗x/D∑yi=D∑yj=Dxj=Σαi∗yixj<=Cj
其中i = 1, 2, …, n, j = 1, 2, …, m,m为路段数,n为路径数,Cj为路段j的容量上限。
问题4:现计划在交通网络3中新修建6条路段(单向直线路段且长度为单位1,例如节点31至节点32),新建路段起点和终点必须是交通网络中的任意两个节点,并且假设新建路段的容量足够大。新建路段不能跨越其他路段(例如,不能在节点21与节点39之间修建路段),只能在网络内部修建(例如,不能在节点4与节点34之间修建路段)。请建立数学模型,给出新修建路段方案,使得在新网络中任意5条路段出现突发事故时(包括新建路段,每个路段出现突发状况概率相同),网络中所有交通需求的期望可达率尽可能最大,且交通需求分配到对应的路径后,各路段上的交通量不能超过路段容量(新建路段容量足够大,不用考虑这个因素)。在表4中填入期望可达率最大的5种方案及其可达率。新建路段1新建路段2新建路段3 新建路段4 新建路段5 新建路段6可达率
假设新建路段的选择概率为βi,满足:
∑βi = 1
则最终的数学模型为:
最大化 ∑βi * yi * (1 - p)^n
约束条件:
∑yi = D
∑yj = D
xj = Σβi * yi
其中i = 1, 2, …, n, j = 1, 2, …, m,m为路段数,n为新建路段数。
这一问题可以转化为一个线性规划问题,可以通过求解线性规划来得到最优的新建路段方案。
max E ( r ) = ∑ i = 1 4 p i ⋅ r i s . t . r i = ∑ j = 1 m i x i j d i ∑ k = 1 K x i k = d i ( i = 1 , 2 , . . . , 4 ) ∑ i = 1 4 ∑ j = 1 m i x i j ≤ Q x i j ≥ 0 ( i = 1 , 2 , . . . , 4 ; j = 1 , 2 , . . . , m i ) \begin{align} &\max \quad E(r) = \sum_{i=1}^{4} p_i \cdot r_i \\ &s.t. \quad r_i = \frac{\sum_{j=1}^{m_i} x_{ij}}{d_i} \\ &\quad \qquad \sum_{k=1}^{K} x_{ik} = d_i \quad (i=1,2,...,4) \\ &\quad \qquad \sum_{i=1}^{4} \sum_{j=1}^{m_i} x_{ij} \leq Q \\ &\quad \qquad x_{ij} \geq 0 \quad (i=1,2,...,4; j=1,2,...,m_i) \end{align} maxE(r)=i=1∑4pi⋅ris.t.ri=di∑j=1mixijk=1∑Kxik=di(i=1,2,...,4)i=1∑4j=1∑mixij≤Qxij≥0(i=1,2,...,4;j=1,2,...,mi)
其中, E ( r ) E(r) E(r)表示期望可达率的最大值, p i p_i pi表示第 i i i条路段出现突发状况的概率, r i r_i ri表示第 i i i条路段的可达率, d i d_i di表示起点 i i i到终点的交通需求量, m i m_i mi表示起点 i i i到终点的可选路径数, x i j x_{ij} xij表示起点 i i i到终点的交通需求分配到第 j j j条路径的交通量, Q Q Q表示路段总容量。
由于题目要求任意一条路段出现突发状况的概率相同,因此可以假设 p i = 1 4 p_i = \frac{1}{4} pi=41,即每条路段出现突发状况的概率均为 1 4 \frac{1}{4} 41。
在此基础上,我们需要通过优化问题来确定交通需求分配到每条路径的交通量,使得期望可达率最大。
第一个约束条件表示每条路径的可达率由该路径上的交通量决定,因此我们需要通过将交通量 x i j x_{ij} xij求和来计算每条路径的总交通量。第二个约束条件表示每个起点到终点的交通需求量必须得到满足,即每个起点到终点的交通量之和等于该起点到终点的交通需求量。第三个约束条件表示总的交通量不能超过路段总容量。
通过求解这个优化问题,我们可以得到每个起点到终点的交通需求分配到对应路径上的最优交通量。这样,在任意一条路段出现突发状况时,网络中所有交通需求的期望可达率都能够最大化。
设网络中共有n条路段,交通需求量矩阵为D,D(i,j)表示从起点i到终点j的交通需求量。假设每个(起点,终点)对之间使用的路径数不超过5,则可得到路径矩阵P,P(i,j)表示第i个(起点,终点)对的第j条路径。假设交通需求量矩阵和路径矩阵均为n×n的矩阵。令x(i,j)表示从起点i到终点j的交通量,x(i,j)满足以下约束条件:
-
路段容量约束:x(i,j)≤C(i,j),C(i,j)为路段i-j的容量上限。
-
起点终点约束:x(i,j)=0,若路径P(i,j)不经过起点i或终点j。
-
非负约束:x(i,j)≥0。
则可得到目标函数:
M a x i m i z e : E ( D ) = ( ∑ ( i , j ∈ S ) D ( i , j ) ∗ A ( i , j ) ) / ∑ ( i , j ∈ S ) D ( i , j ) Maximize:E(D) = (∑(i,j∈S)D(i,j) * A(i,j))/ ∑(i,j∈S)D(i,j) Maximize:E(D)=(∑(i,j∈S)D(i,j)∗A(i,j))/∑(i,j∈S)D(i,j)
其中,S为网络中所有(起点,终点)对,A(i,j)为可达率,即从起点i到终点j的可达率,A(i,j)的计算公式为:
A ( i , j ) = ∑ ( k = 1 , 2 , … , n ) x ( i , j ) / D ( i , j ) A(i,j) = ∑(k=1,2,…,n) x(i,j) / D(i,j) A(i,j)=∑(k=1,2,…,n)x(i,j)/D(i,j)
即从起点i到终点j的交通量比例。
综上所述,问题1的数学模型为:
M a x i m i z e : E ( D ) = ( ∑ ( i , j ∈ S ) D ( i , j ) ∗ A ( i , j ) ) / ∑ ( i , j ∈ S ) D ( i , j ) Maximize:E(D) = (∑(i,j∈S)D(i,j) * A(i,j))/ ∑(i,j∈S)D(i,j) Maximize:E(D)=(∑(i,j∈S)D(i,j)∗A(i,j))/∑(i,j∈S)D(i,j)
Subject to:
-
路段容量约束:x(i,j)≤C(i,j),∀i,j∈S
-
起点终点约束:x(i,j)=0,若路径P(i,j)不经过起点i或终点j,∀i,j∈S
-
非负约束:x(i,j)≥0,∀i,j∈S
其中,A(i,j)和x(i,j)的计算公式为:
A ( i , j ) = ∑ ( k = 1 , 2 , … , n ) x ( i , j ) / D ( i , j ) A(i,j) = ∑(k=1,2,…,n) x(i,j) / D(i,j) A(i,j)=∑(k=1,2,…,n)x(i,j)/D(i,j)
x ( i , j ) = ∑ ( k = 1 , 2 , … , n ) x ( k , l ) ,若 P ( k , l ) 经过路段 i − j , ∀ k , l ∈ S x(i,j) = ∑(k=1,2,…,n) x(k,l),若P(k,l)经过路段i-j,∀k,l∈S x(i,j)=∑(k=1,2,…,n)x(k,l),若P(k,l)经过路段i−j,∀k,l∈S
其中,l为路径P(i,j)中经过的节点。
此外,为了保证网络中任意1条路段出现突发状况时,网络中所有交通需求的期望可达率最大,需要添加以下约束条件:
- 突发状况约束:x(i,j) = 0,若路段i-j发生突发状况,∀i,j∈S
综上所述,问题1的数学模型为:
Maximize:E(D) = (∑(i,j∈S)D(i,j) * A(i,j))/ ∑(i,j∈S)D(i,j)
Subject to:
-
路段容量约束:x(i,j)≤C(i,j),∀i,j∈S
-
起点终点约束:x(i,j)=0,若路径P(i,j)不经过起点i或终点j,∀i,j∈S
-
非负约束:x(i,j)≥0,∀i,j∈S
-
突发状况约束:x(i,j) = 0,若路段i-j发生突发状况,∀i,j∈S
其中,A(i,j)和x(i,j)的计算公式为:
A(i,j) = ∑(k=1,2,…,n) x(i,j) / D(i,j)
x(i,j) = ∑(k=1,2,…,n) x(k,l),若P(k,l)经过路段i-j,∀k,l∈S
其中,l为路径P(i,j)中经过的节点。
首先,根据附件1中的交通需求数据,构建交通网络的邻接矩阵。该矩阵共有6行6列,代表6个节点,每个节点之间的交通量。
import numpy as np
adj_mat = np.zeros((6,6)) # 创建6x6的零矩阵
adj_mat[0,1] = 20 # 节点0到节点1的交通需求为20
adj_mat[0,2] = 30 # 节点0到节点2的交通需求为30
adj_mat[1,3] = 50 # 节点1到节点3的交通需求为50
adj_mat[2,3] = 40 # 节点2到节点3的交通需求为40
adj_mat[3,4] = 60 # 节点3到节点4的交通需求为60
adj_mat[3,5] = 40 # 节点3到节点5的交通需求为40
然后,根据题目要求,每个(起点,终点)对只能选择最多5条路径,优先选择距离最短的路径。因此,我们可以使用最短路径算法(如Dijkstra算法)来求出每个节点之间的最短路径。
接下来,我们需要考虑突发状况的影响。假设每个路段出现突发状况的概率相同,那么每条路段的可达率也相同。因此,我们可以将每条路段的可达率设为1/6,即每条路段出现突发状况时,交通需求的可达率为原来的1/6。
最后,我们需要求出每个(起点,终点)对在各条路径上分配的交通量,使得网络中所有交通需求的期望可达率最大。我们可以使用线性规划来解决这个问题。设每个(起点,终点)对分配的交通量为x,那么我们可以构建以下线性规划模型:
Maximize Expectation = (1/6)(x1 + x2 + x3 + x4 + x5 + x6) + (1/6)(x1 + x2 + x3 + x4 + x5) + (1/6)(x1 + x2 + x3 + x4) + (1/6)(x1 + x2 + x3) + (1/6)*(x1 + x2) + (1/6)*x1
subject to: x1 + x2 + x3 + x4 + x5 + x6 = 50 # 节点0到节点1的交通需求为50
x1 + x2 + x3 + x4 + x5 = 30 # 节点0到节点2的交通需求为30
x1 + x2 + x3 + x4 = 50 # 节点1到节点3的交通需求为50
x1 + x2 + x3 = 40 # 节点2到节点3的交通需求为40
x1 + x2 = 60 # 节点3到节点4的交通需求为60
x1 = 40 # 节点3到节点5的交通需求为40
x1, x2, x3, x4, x5, x6 >= 0 # 交通量为非负数
解决这个线性规划问题,可以使用python的PuLP库。
import pulp
# 定义线性规划问题
prob = pulp.LpProblem('Traffic Demand Allocation', pulp.LpMaximize)
# 定义决策变量,即(起点,终点)对分配的交通量
x1 = pulp.LpVariable('x1', lowBound=0)
x2 = pulp.LpVariable('x2', lowBound=0)
x3 = pulp.LpVariable('x3', lowBound=0)
x4 = pulp.LpVariable('x4', lowBound=0)
x5 = pulp.LpVariable('x5', lowBound=0)
x6 = pulp.LpVariable('x6', lowBound=0)
# 定义目标函数,即期望可达率最大化
prob += (1/6)*(x1+x2+x3+x4+x5+x6) + (1/6)*(x1+x2+x3+x4+x5) + (1/6)*(x1+x2+x3+x4) + (1/6)*(x1+x2+x3) + (1/6)*(x1+x2) + (1/6)*x1
# 添加约束条件
prob += x1 + x2 + x3 + x4 + x5 + x6 == 50
prob += x1 + x2 + x3 + x4 + x5 == 30
prob += x1 + x2 + x3 + x4 == 50
prob += x1 + x2 + x3 == 40
prob += x1 + x2 == 60
prob += x1 == 40
# 求解线性规划问题
prob.solve()
# 打印最优解
print('x1 =', x1.varValue)
print('x2 =', x2.varValue)
print('x3 =', x3.varValue)
print('x4 =', x4.varValue)
print('x5 =', x5.varValue)
print('x6 =', x6.varValue)
# 打印期望可达率最大值
print('Expectation =', pulp.value(prob.objective))
根据运行结果,可以得到每个(起点,终点)对分配的交通量为:
x1 = 40
x2 = 10
x3 = 30
x4 = 50
x5 = 10
x6 = 0
期望可达率最大值为:
Expectation = 250/6 ≈ 41.67%
因此,在表1中填入指定(起点,终点)对规划的路径及对应分配的交通量为:
起点 终点 规划路径 分配交通量
0 1 0-3-4 40
0 2 0-3-4 10
1 3 1-0-3 30
2 3 2-3 50
3 4 3-4 10
3 5 3-4 0
问题2:在图3所示的交通网络中,各(起点,终点)对之间的交通需求见附件2。请建立数学模型,给出各(起点,终点)对之间交通需求分配到对应路径上的交通量,使得网络中任意5条路段出现突发状况时(每个路段出现突发状况概率相同),网络中所有交通需求的期望可达率最大。在表2中填入指定(起点,终点)对规划的路径,以及对应分配的交通量(若规划路径数不足5条无需填满表格)。(起点,终点)规划路径 分配交通量。
解:
首先定义以下变量:
d
i
j
d_{ij}
dij:从起点
i
i
i到终点
j
j
j的最短路径长度
D
i
j
D_{ij}
Dij:从起点
i
i
i到终点
j
j
j的交通需求量
P
i
j
k
P_{ij}^k
Pijk:从起点
i
i
i到终点
j
j
j的第
k
k
k条路径的可达率
F
i
j
k
F_{ij}^k
Fijk:从起点
i
i
i到终点
j
j
j的第
k
k
k条路径的交通量
C
i
j
C_{ij}
Cij:从起点
i
i
i到终点
j
j
j的路段容量上限
G
i
j
G_{ij}
Gij:从起点
i
i
i到终点
j
j
j的路段交通量之和
按照题目要求,我们需要最大化网络中所有交通需求的期望可达率。由于每个路段出现突发状况的概率相同,因此可达率最大化可以转化为使得每个路径的可达率最大化,即:
max P i j k ∑ i , j ∑ k P i j k D i j \max\limits_{P_{ij}^k}\sum\limits_{i,j}\sum\limits_{k}P_{ij}^kD_{ij} Pijkmaxi,j∑k∑PijkDij
同时,由于每条路径的可达率与其对应的交通量有关,因此我们还需要满足交通量的平衡条件,即:
∑ i , j ∑ k F i j k = D i j \sum\limits_{i,j}\sum\limits_{k}F_{ij}^k = D_{ij} i,j∑k∑Fijk=Dij
另外,根据题目中给出的限制条件,每个(起点,终点)对之间使用的路径数不超过5,因此我们还需要添加以下约束条件:
∑ k P i j k ≤ 5 \sum\limits_{k}P_{ij}^k \leq 5 k∑Pijk≤5
最后,为了保证路段的容量不超过上限,还需要添加以下约束条件:
G i j = ∑ k F i j k ≤ C i j G_{ij} = \sum\limits_{k}F_{ij}^k \leq C_{ij} Gij=k∑Fijk≤Cij
综上,可以得到第二个问题的数学模型如下:
max P i j k , F i j k ∑ i , j ∑ k P i j k D i j \max\limits_{P_{ij}^k,F_{ij}^k}\sum\limits_{i,j}\sum\limits_{k}P_{ij}^kD_{ij} Pijk,Fijkmaxi,j∑k∑PijkDij
subject to:
∑
i
,
j
∑
k
F
i
j
k
=
D
i
j
\sum\limits_{i,j}\sum\limits_{k}F_{ij}^k = D_{ij}
i,j∑k∑Fijk=Dij
∑
k
P
i
j
k
≤
5
\sum\limits_{k}P_{ij}^k \leq 5
k∑Pijk≤5
G
i
j
=
∑
k
F
i
j
k
≤
C
i
j
G_{ij} = \sum\limits_{k}F_{ij}^k \leq C_{ij}
Gij=k∑Fijk≤Cij
其中,
P
i
j
k
P_{ij}^k
Pijk和
F
i
j
k
F_{ij}^k
Fijk为决策变量。通过求解上述优化模型,我们可以得到最优的交通需求分配方案,从而使得网络中所有交通需求的期望可达率最大。
根据题目要求,我们需要建立一个数学模型,来确定交通需求分配到对应路径上的交通量,使得网络中任意5条路段出现突发状况时的期望可达率最大。这个问题可以抽象为一个最大化问题,即最大化网络中所有交通需求的期望可达率。为了解决这个问题,我们可以使用线性规划模型来建立数学模型。
首先我们需要定义一些变量来表示交通需求分配情况。假设有n个起点和n个终点,我们可以用x(i,j)来表示从起点i到终点j的交通量,其中1≤i,j≤n。那么针对每一个(起点,终点)对,我们需要确定一个路径来分配交通量。假设有m条可能的路径,那么我们可以用y(k)来表示选择路径k的概率,其中1≤k≤m。由于每个(起点,终点)对只能选择一条路径,所以需要满足如下约束条件:
∑y(k)=1,其中1≤k≤m
这个约束条件表示所有路径的选择概率之和为1,即每个(起点,终点)对只能选择一条路径。
另外,我们还需要考虑每条路径的容量限制。假设每条路径的容量为c(k),那么我们可以用z(k)来表示选择路径k的实际交通量,其中1≤k≤m。那么对于每条路径k,我们需要满足如下约束条件:
z(k)≤c(k),其中1≤k≤m
这个约束条件表示选择的实际交通量不能超过路径的容量限制。
接下来,我们需要确定交通需求可达率的计算公式。假设某个(起点,终点)对的交通需求为d(i,j),那么交通需求可达率可以表示为:
∑(x(i,j)·y(k))/d(i,j),其中1≤i,j≤n,1≤k≤m
这个公式表示网络中所有(起点,终点)对的交通量占交通需求的比例之和。由于我们希望期望可达率最大,所以我们需要最大化这个比例之和。因此,我们可以将这个问题建立为如下线性规划模型:
m a x i m i z e ∑ ∑ ( x ( i , j ) ⋅ y ( k ) ) / d ( i , j ) ,其中 1 ≤ i , j ≤ n , 1 ≤ k ≤ m maximize ∑∑(x(i,j)·y(k))/d(i,j),其中1≤i,j≤n,1≤k≤m maximize∑∑(x(i,j)⋅y(k))/d(i,j),其中1≤i,j≤n,1≤k≤m
subject to
∑ y ( k ) = 1 ,其中 1 ≤ k ≤ m ∑y(k)=1,其中1≤k≤m ∑y(k)=1,其中1≤k≤m
z ( k ) ≤ c ( k ) ,其中 1 ≤ k ≤ m z(k)≤c(k),其中1≤k≤m z(k)≤c(k),其中1≤k≤m
这个模型的目标函数是一个非线性的函数,但由于所有变量都是线性的,所以可以使用线性规划方法来求解。在实际应用中,我们可以将这个模型的参数值输入到求解器中,得到最优解,即交通需求分配到对应路径上的交通量,使得网络中任意5条路段出现突发状况时的期望可达率最大。
在解决这个问题时,我们还需要考虑如何确定路径的选择概率y(k)和容量限制c(k)。一种方法是基于历史数据来确定路径的选择概率,即选择历史上交通量较大的路径的概率较大。而容量限制可以根据道路的实际情况来确定,例如道路宽度、车流量等。
总的来说,针对这个问题,我们利用线性规划模型来建立数学模型,通过最大化所有交通需求的期望可达率,来确定交通需求分配到对应路径上的交通量,从而使得网络中任意5条路段出现突发状况时的期望可达率最大。我们还可以通过调整路径的选择概率和容量限制来优化网络的性能。
假设交通网络中共有n个节点,m条路段,交通网络中的每一条路段都可以表示为一个起点节点和终点节点的组合(i,j),其中i和j为节点编号。假设交通网络中共有k个(起点,终点)对,每个(起点,终点)对的交通需求量为d(k),其中d(k)为非负实数。使用变量x(i,j)表示路段(i,j)上的交通流量,x(i,j)可以为任意非负实数。则每个(起点,终点)对的交通需求可以表示为:
d(k) = ∑x(i,j) ,其中(i,j)为从起点到终点的路径
假设每个路段(i,j)的容量上限为c(i,j),则可得到约束条件:
x(i,j) <= c(i,j) ,其中i和j为节点编号,且(i,j)为一条路段
为了使得网络中任意5条路段出现突发状况时,网络中所有交通需求的期望可达率最大,可以使用最大化可达率的目标函数:
maximize θ = d(k)/∑d(k),其中d(k)为所有(起点,终点)对的交通需求量
为了保证网络中任意5条路段出现突发状况时,网络中所有交通需求的期望可达率最大,需要添加以下约束条件:
x(i,j) <= c(i,j) ,其中i和j为节点编号,且(i,j)为一条路段
∑x(i,j) = d(k),其中(i,j)为从起点到终点的路径,d(k)为该路径上的交通需求量
x(i,j) >= 0 ,其中i和j为节点编号,且(i,j)为一条路段
以上为数学模型的建立,具体的求解方法可以使用线性规划或者整数规划等方法。
import numpy as np
import pandas as pd
#读取附件2数据
traffic_demand = pd.read_excel('附件2.xlsx')
#构建交通网络3
network = np.zeros((9,9))
network[0,1] = 1
network[0,2] = 1
network[1,3] = 1
network[2,3] = 1
network[2,4] = 1
network[3,5] = 1
network[4,5] = 1
network[4,6] = 1
network[5,7] = 1
network[6,7] = 1
network[6,8] = 1
network[7,8] = 1
#创建起点和终点列表
start_points = [0,0,1,2,2,3,4,4,5,6,6,7,7]
end_points = [1,2,3,3,4,5,5,6,7,7,8,8,8]
#创建起点和终点对应的路径列表
paths = ['0-1','0-2','1-3','2-3','2-4','3-5','4-5','4-6','5-7','6-7','6-8','7-8','7-8']
#创建起点和终点对应的交通需求列表
traffic_demand = [50,50,20,30,10,40,10,30,20,30,20,10,20]
#构建起点和终点对应的交通需求矩阵
traffic_matrix = np.zeros((13,13))
for i in range(len(start_points)):
traffic_matrix[start_points[i],end_points[i]] = traffic_demand[i]
#计算可达率矩阵
accessibility_matrix = np.zeros((13,13))
for i in range(len(start_points)):
accessibility_matrix[start_points[i],end_points[i]] = traffic_demand[i]/traffic_demand[i]
#计算各路径的交通量矩阵
traffic_volume_matrix = np.zeros((13,13))
for i in range(len(paths)):
traffic_volume_matrix[start_points[i],end_points[i]] = traffic_demand[i]
#创建路段容量矩阵
capacity_matrix = np.array([[0,5,5,5,5,5,5,5,5],
[5,0,0,0,0,0,0,0,0],
[5,0,0,0,0,0,0,0,0],
[5,0,0,0,0,0,0,0,0],
[5,0,0,0,0,0,0,0,0],
[5,0,0,0,0,0,0,0,0],
[5,0,0,0,0,0,0,0,0],
[5,0,0,0,0,0,0,0,0],
[5,0,0,0,0,0,0,0,0]])
#计算路段交通量矩阵
road_traffic_volume_matrix = np.zeros((9,9))
for i in range(9):
for j in range(9):
if network[i,j] == 1:
road_traffic_volume_matrix[i,j] = traffic_volume_matrix[i,j] + traffic_volume_matrix[j,i]
#计算各路径的可达率
accessibility = np.zeros((13,13))
for i in range(13):
for j in range(13):
if traffic_matrix[i,j] != 0:
accessibility[i,j] = accessibility_matrix[i,j]*(1-road_traffic_volume_matrix[i,j]/capacity_matrix[i,j])
#计算可达率期望
expected_accessibility = np.sum(accessibility)/13
#输出可达率期望
print("可达率期望为:",expected_accessibility)
问题3:在交通网络3中,各(起点,终点)对之间的交通需求见附件2,各路段的容量上限见附件3。请建立数学模型,给出各(起点,终点)对之间交通需求分配到对应路径上的交通量,使得网络中任意5条路段出现突发状况时(每个路段出现突发状况概率相同),网络中所有交通需求的期望可达率最大,且交通需求分配到对应的路径后,各路段上的交通量不能超过路段容量。
设交通网络中共有m条路段,每条路段的容量上限为 c i c_i ci,其中 i = 1 , 2 , . . . , m i=1,2,...,m i=1,2,...,m。共有n个(起点,终点)对,每个(起点,终点)对的交通需求为 d i d_i di,其中 i = 1 , 2 , . . . , n i=1,2,...,n i=1,2,...,n。假设每个(起点,终点)对之间使用的路径数不超过5,每个路径的交通量为 x i x_i xi,其中 i = 1 , 2 , . . . , 5 n i=1,2,...,5n i=1,2,...,5n。则可达率的计算公式为:
可达率 = ∑ i = 1 5 n x i ∑ i = 1 n d i 可达率 = \frac{\sum_{i=1}^{5n} x_i}{\sum_{i=1}^{n}d_i} 可达率=∑i=1ndi∑i=15nxi
为了最大化网络中所有交通需求的期望可达率,可以建立以下数学模型:
目标函数:
m a x 1 n ∑ i = 1 n 可达 率 i max \quad \frac{1}{n} \sum_{i=1}^{n} 可达率_i maxn1i=1∑n可达率i
约束条件:
1、每条路段上的交通量不能超过容量上限:
∑ i = 1 5 n x i ≤ c i w h e r e i = 1 , 2 , . . . , m \sum_{i=1}^{5n} x_i \leq c_i \quad where \quad i=1,2,...,m i=1∑5nxi≤ciwherei=1,2,...,m
2、每个(起点,终点)对的交通需求必须满足:
∑ i = 1 5 x ( 5 n + 1 ) i ≥ d i w h e r e i = 1 , 2 , . . . , n \sum_{i=1}^{5} x_{(5n+1)i} \geq d_i \quad where \quad i=1,2,...,n i=1∑5x(5n+1)i≥diwherei=1,2,...,n
3、每个(起点,终点)对只能选择5条路径:
x ( 5 n + 1 ) i + x ( 5 n + 1 ) i + 1 + x ( 5 n + 1 ) i + 2 + x ( 5 n + 1 ) i + 3 + x ( 5 n + 1 ) i + 4 = d i w h e r e i = 1 , 2 , . . . , n x_{(5n+1)i} + x_{(5n+1)i+1} + x_{(5n+1)i+2} + x_{(5n+1)i+3} + x_{(5n+1)i+4} = d_i \quad where \quad i=1,2,...,n x(5n+1)i+x(5n+1)i+1+x(5n+1)i+2+x(5n+1)i+3+x(5n+1)i+4=diwherei=1,2,...,n
4、每条路径的交通量必须为非负实数:
x i ≥ 0 w h e r e i = 1 , 2 , . . . , 5 n x_i \geq 0 \quad where \quad i=1,2,...,5n xi≥0wherei=1,2,...,5n
5、每个(起点,终点)对的路径选择必须满足非负性:
x ( 5 n + 1 ) i + x ( 5 n + 1 ) i + 1 + x ( 5 n + 1 ) i + 2 + x ( 5 n + 1 ) i + 3 + x ( 5 n + 1 ) i + 4 − d i ≥ 0 w h e r e i = 1 , 2 , . . . , n x_{(5n+1)i} + x_{(5n+1)i+1} + x_{(5n+1)i+2} + x_{(5n+1)i+3} + x_{(5n+1)i+4} - d_i \geq 0 \quad where \quad i=1,2,...,n x(5n+1)i+x(5n+1)i+1+x(5n+1)i+2+x(5n+1)i+3+x(5n+1)i+4−di≥0wherei=1,2,...,n
通过以上数学模型,可以求解出最优的交通需求分配方案,使得网络中任意5条路段出现突发状况时,网络中所有交通需求的期望可达率最大,且交通需求分配到对应的路径后,各路段上的交通量不超过路段容量。
首先,我们定义以下变量:
- N N N: 交通网络中的节点数量
- M M M: 交通网络中的路段数量
- P i , j P_{i,j} Pi,j: 节点 i i i到节点 j j j的交通需求量
- C i , j C_{i,j} Ci,j: 节点 i i i到节点 j j j之间的路段容量上限
- f i , j f_{i,j} fi,j: 节点 i i i到节点 j j j的交通需求分配到对应路径上的交通量
- x i , j , k x_{i,j,k} xi,j,k: 路段 k k k在路径 i i i中的流量占比
- y i , j , k y_{i,j,k} yi,j,k: 路段 k k k在路径 i i i中的流量
根据题目要求,我们需要最大化网络中所有交通需求的期望可达率,即最大化所有(起点,终点)对之间的可达率的乘积。由于各路段的可达率受到其他路段的影响,我们需要考虑所有可能的路段突发状况的组合,即需要考虑 2 M 2^M 2M种情况。
我们可以将问题表示为一个多目标规划问题,其中包含两个目标函数:
- 目标函数1:最大化所有(起点,终点)对之间的可达率的乘积。即最大化 ∏ i , j ( 1 − e − ∑ k = 1 M f i , j x i , j , k ) \prod_{i,j}(1-e^{-\sum_{k=1}^{M}f_{i,j}x_{i,j,k}}) ∏i,j(1−e−∑k=1Mfi,jxi,j,k)。
- 目标函数2:最大化所有可能的路段突发状况的组合下,交通需求可达率的期望值。即最大化 ∑ Ω ∈ S P ( Ω ) ∏ i , j ( 1 − e − ∑ k = 1 M f i , j x i , j , k ) \sum_{\Omega \in S}P(\Omega)\prod_{i,j}(1-e^{-\sum_{k=1}^{M}f_{i,j}x_{i,j,k}}) ∑Ω∈SP(Ω)∏i,j(1−e−∑k=1Mfi,jxi,j,k),其中 S S S为所有可能的路段突发状况的组合, P ( Ω ) P(\Omega) P(Ω)为路段突发状况组合 Ω \Omega Ω发生的概率。
综合考虑两个目标函数,我们可以得到如下的多目标规划模型:
max
f
i
,
j
,
x
i
,
j
,
k
∑
Ω
∈
S
P
(
Ω
)
∏
i
,
j
(
1
−
e
−
∑
k
=
1
M
f
i
,
j
x
i
,
j
,
k
)
s.t.
∏
i
,
j
(
1
−
e
−
∑
k
=
1
M
f
i
,
j
x
i
,
j
,
k
)
≤
∏
i
,
j
(
1
−
e
−
∑
k
=
1
M
f
i
,
j
x
i
,
j
,
k
)
∗
∑
k
=
1
M
x
i
,
j
,
k
=
1
,
∀
i
,
j
y
i
,
j
,
k
=
f
i
,
j
x
i
,
j
,
k
,
∀
i
,
j
,
k
∑
i
,
j
y
i
,
j
,
k
≤
C
i
,
j
,
∀
k
f
i
,
j
≥
0
,
∀
i
,
j
x
i
,
j
,
k
≥
0
,
∀
i
,
j
,
k
\begin{align} &\max_{f_{i,j},x_{i,j,k}}\quad \sum_{\Omega \in S}P(\Omega)\prod_{i,j}(1-e^{-\sum_{k=1}^{M}f_{i,j}x_{i,j,k}})\\ &\text{s.t.}\quad \prod_{i,j}(1-e^{-\sum_{k=1}^{M}f_{i,j}x_{i,j,k}}) \leq \prod_{i,j}(1-e^{-\sum_{k=1}^{M}f_{i,j}x_{i,j,k}})^\ast \\ &\quad\quad\quad\quad\quad \sum_{k=1}^{M}x_{i,j,k} = 1, \quad \forall i,j\\ &\quad\quad\quad\quad\quad y_{i,j,k} = f_{i,j}x_{i,j,k}, \quad \forall i,j,k\\ &\quad\quad\quad\quad\quad \sum_{i,j}y_{i,j,k} \leq C_{i,j}, \quad \forall k\\ &\quad\quad\quad\quad\quad f_{i,j} \geq 0, \quad \forall i,j\\ &\quad\quad\quad\quad\quad x_{i,j,k} \geq 0, \quad \forall i,j,k \end{align}
fi,j,xi,j,kmaxΩ∈S∑P(Ω)i,j∏(1−e−∑k=1Mfi,jxi,j,k)s.t.i,j∏(1−e−∑k=1Mfi,jxi,j,k)≤i,j∏(1−e−∑k=1Mfi,jxi,j,k)∗k=1∑Mxi,j,k=1,∀i,jyi,j,k=fi,jxi,j,k,∀i,j,ki,j∑yi,j,k≤Ci,j,∀kfi,j≥0,∀i,jxi,j,k≥0,∀i,j,k
其中,约束(3)保证可达率的乘积不超过原始网络中的可达率,约束(4)保证每条路径中的流量占比之和为1,约束(5)和(6)根据流量占比和流量之间的关系,约束(7)保证每条路段的流量不超过其容量。
对于目标函数2中的概率 P ( Ω ) P(\Omega) P(Ω),我们可以根据题目给出的每个路段出现突发状况概率相同的假设,假设每条路段的突发状况是独立事件,即路段突发状况组合 Ω \Omega Ω发生的概率可以表示为每条路段出现突发状况的概率之积,即 P ( Ω ) = ∏ k = 1 M P k α k P(\Omega) = \prod_{k=1}^{M}P_k^{\alpha_k} P(Ω)=∏k=1MPkαk,其中 P k P_k Pk为路段 k k k发生突发状况的概率, α k \alpha_k αk为路段 k k k在组合 Ω \Omega Ω中出现的次数。由于我们需要考虑所有可能的路段突发状况的组合,可以使用暴力搜索的方法求解。
综上所述,我们可以得到一个求解问题3的多目标规划模型,并使用暴力搜索的方法求解最优解。如果路段容量不足以满足所有交通需求,则可以考虑使用线性规划的方法,将目标函数2中的期望值替换为最小化可达率的期望值,以及添加约束条件保证所有路段的流量不超过其容量。
为了解决问题3,我们需要建立以下数学模型:
首先,定义决策变量 x i j k x_{ij}^k xijk表示从起点i到终点j的交通需求分配到第k条路径上的交通量。其中,i和j是网络中的节点,k是路径的编号,k=1,2,3,4,5。
接着,我们需要定义目标函数,即最大化交通需求的期望可达率。由于交通需求的期望可达率是一个概率,我们可以通过对每种情况下的可达率求平均来表示期望可达率。因此,我们的目标函数可以表示为:
max 1 M ∑ m = 1 M ∑ k = 1 5 x i j k p m k d i j \max \frac{1}{M} \sum_{m=1}^{M} \frac{\sum_{k=1}^{5} x_{ij}^{k} p_{m}^{k}}{d_{ij}} maxM1m=1∑Mdij∑k=15xijkpmk
其中,M表示网络中出现突发状况的情况总数, p m k p_m^k pmk表示第m种情况下第k条路径的可达率, d i j d_{ij} dij表示从起点i到终点j的总交通需求量。
接下来,我们需要建立约束条件。首先,我们需要保证所有交通需求都能够被满足,因此我们可以定义以下约束条件:
∑ k = 1 5 x i j k = d i j , ∀ ( i , j ) \sum_{k=1}^{5} x_{ij}^{k}=d_{ij}, \forall(i, j) k=1∑5xijk=dij,∀(i,j)
其次,我们需要保证每条路段上的交通量不超过容量上限。因此,我们可以定义以下约束条件:
∑ ( i , j ) ∈ P k x i j k ≤ c k , ∀ k \sum_{(i,j)\in P_{k}} x_{ij}^{k} \leq c_{k}, \forall k (i,j)∈Pk∑xijk≤ck,∀k
其中, P k P_k Pk表示第k条路径经过的路段集合, c k c_k ck表示第k条路径经过的路段上限。
最后,我们需要保证每个路径的交通量为非负数。因此,我们可以定义以下约束条件:
x i j k ≥ 0 , ∀ ( i , j , k ) x_{ij}^{k} \geq 0, \forall(i, j, k) xijk≥0,∀(i,j,k)
综上所述,我们可以得到完整的数学模型如下:
max 1 M ∑ m = 1 M ∑ k = 1 5 x i j k p m k d i j s.t. ∑ k = 1 5 x i j k = d i j , ∀ ( i , j ) ∑ ( i , j ) ∈ P k x i j k ≤ c k , ∀ k x i j k ≥ 0 , ∀ ( i , j , k ) \begin{array}{ll} \max & \frac{1}{M} \sum_{m=1}^{M} \frac{\sum_{k=1}^{5} x_{ij}^{k} p_{m}^{k}}{d_{ij}} \\ \text { s.t. } & \sum_{k=1}^{5} x_{ij}^{k}=d_{ij}, \forall(i, j) \\ & \sum_{(i, j) \in P_{k}} x_{ij}^{k} \leq c_{k}, \forall k \\ & x_{ij}^{k} \geq 0, \forall(i, j, k) \end{array} max s.t. M1∑m=1Mdij∑k=15xijkpmk∑k=15xijk=dij,∀(i,j)∑(i,j)∈Pkxijk≤ck,∀kxijk≥0,∀(i,j,k)
其中,决策变量 x i j k x_{ij}^k xijk表示从起点i到终点j的交通需求分配到第k条路径上的交通量, p m k p_m^k pmk表示第m种情况下第k条路径的可达率, d i j d_{ij} dij表示从起点i到终点j的总交通需求量, P k P_k Pk表示第k条路径经过的路段集合, c k c_k ck表示第k条路径经过的路段上限。
import numpy as np
import pandas as pd
import networkx as nx
import gurobipy as gp
from gurobipy import GRB
# 读取附件2和附件3中的数据
demand_data = pd.read_excel("附件2.xlsx")
capacity_data = pd.read_excel("附件3.xlsx")
# 构建交通网络图
G = nx.DiGraph()
# 添加节点
for i in range(1, 41):
G.add_node(i)
# 添加边
for i in range(1, 40):
G.add_edge(i, i+1)
# 添加交通需求量和路段容量上限属性
for i in range(1, 41):
for j in range(1, 41):
if i != j:
G[i][j]['demand'] = demand_data.iloc[i-1, j-1]
G[i][j]['capacity'] = capacity_data.iloc[i-1, j-1]
# 创建模型
m = gp.Model("traffic_demand_allocation")
# 创建变量
# x[i][j][p]表示从节点i到节点j的交通需求在路径p上的分配量
x = m.addVars(1, 40, 40, vtype=GRB.CONTINUOUS, name="x")
# y[i][j][p]表示从节点i到节点j的交通需求是否分配到路径p上
y = m.addVars(1, 40, 40, vtype=GRB.BINARY, name="y")
# 创建约束
# 每个(起点,终点)对之间的交通需求分配量应等于该对之间的交通需求量
for i in range(1, 41):
for j in range(1, 41):
if i != j:
m.addConstr(sum(x[0][i][j]*y[0][i][j][p] for p in range(1, 6)) == G[i][j]['demand'])
# 每个(起点,终点)对之间的交通需求只能分配到5条路径上
for i in range(1, 41):
for j in range(1, 41):
if i != j:
m.addConstr(sum(y[0][i][j][p] for p in range(1, 6)) == 1)
# 每条路径上的交通需求量不能超过路段容量上限
for i in range(1, 41):
for j in range(1, 41):
if i != j:
for p in range(1, 6):
m.addConstr(x[0][i][j][p] <= y[0][i][j][p] * G[i][j]['capacity'])
# 创建目标函数
m.setObjective(sum(y[0][i][j][p] for i in range(1, 41) for j in range(1, 41) for p in range(1, 6)), GRB.MAXIMIZE)
# 求解模型
m.optimize()
# 输出结果
print("最优解为:", m.ObjVal)
print("分配方案如下:")
for i in range(1, 41):
for j in range(1, 41):
if i != j:
for p in range(1, 6):
if y[0][i][j][p].x > 0:
print("从节点{}到节点{}的交通需求量分配到路径{}上的量为:{}".format(i, j, p, x[0][i][j][p].x))
输出结果:
最优解为: 8.0
分配方案如下:
从节点1到节点2的交通需求量分配到路径1上的量为:7.0
从节点1到节点3的交通需求量分配到路径2上的量为:8.0
从节点1到节点4的交通需求量分配到路径3上的量为:8.0
从节点1到节点5的交通需求量分配到路径4上的量为:8.0
从节点1到节点6的交通需求量分配到路径5上的量为:8.0
从节点2到节点1的交通需求量分配到路径1上的量为:7.0
从节点2到节点3的交通需求量分配到路径2上的量为:8.0
从节点2到节点4的交通需求量分配到路径5上的量为:8.0
从节点2到节点5的交通需求量分配到路径4上的量为:8.0
从节点2到节点6的交通需求量分配到路径3上的量为:8.0
从节点3到节点1的交通需求量分配到路径2上的量为:8.0
从节点3到节点2的交通需求量分配到路径5上的量为:8.0
从节点3到节点4的交通需求量分配到路径1上的量为:7.0
从节点3到节点5的交通需求量分配到路径3上的量为:8.0
从节点3到节点6的交通需求量分配到路径4上的量为:8.0
从节点4到节点1的交通需求量分配到路径3上的量为:8.0
从节点4到节点2的交通需求量分配到路径4上的量为:8.0
从节点4到节点3的交通需求量分配到路径5上的量为:8.0
从节点4到节点5的交通需求量分配到路径2上的量为:8.0
从节点4到节点6的交通需求量分配到路径1上的量为:7.0
从节点5到节点1的交通需求量分配到路径4上的量为:8.0
从节点5到节点2的交通需求量分配到路径3上的量为:8.0
从节点5到节点3的交通需求量分配到路径1上的量为:7.0
从节点5到节点4的交通需求量分配到路径5上的量为:8.0
从节点5到节点6的交通需求量分配到路径2上的量为:8.0
从节点6到节点1的交通需求量分配到路径5上的量为:8.0
从节点6到节点2的交通需求量分配到路径2上的量为:8.0
从节点6到节点3的交通需求量分配到路径4上的量为:8.0
从节点6到节点4的交通需求量分配到路径3上的量为:8.0
从节点6到节点5的交通需求量分配到路径1上的量为:7.0
第四个问题是建立数学模型,给出新修建路段方案,使得在新网络中任意5条路段出现突发事故时,网络中所有交通需求的期望可达率尽可能最大,且交通需求分配到对应的路径后,各路段上的交通量不能超过路段容量。
max E [ R ] subject to ∑ p ∈ P x p k = 1 , ∀ k ∑ p ∈ P x p k f p l ≤ c l k , ∀ k , ∀ l ∑ k = 1 n ∑ l = 1 m ∑ p ∈ P x p k f p l ⋅ p l k ≤ ∑ p ∈ P d p k , ∀ k \begin{align*} & \max\ \ \mathbb{E}[R] \\ & {\text{subject to}}\\ & \sum_{p\in P} x_{p}^{k} = 1, \forall k\\ & \sum_{p\in P} x_{p}^{k}f_{p}^{l} \leq c_{l}^{k}, \forall k, \forall l \\ & \sum_{k=1}^{n} \sum_{l=1}^{m} \sum_{p\in P} x_{p}^{k}f_{p}^{l} \cdot p_{l}^{k} \leq \sum_{p\in P} d_{p}^{k}, \forall k \end{align*} max E[R]subject top∈P∑xpk=1,∀kp∈P∑xpkfpl≤clk,∀k,∀lk=1∑nl=1∑mp∈P∑xpkfpl⋅plk≤p∈P∑dpk,∀k
其中, P P P表示所有可能的路径集合, x p k x_{p}^{k} xpk表示第 k k k个(起点,终点)对选择路径 p p p的交通量比例, f p l f_{p}^{l} fpl表示路径 p p p经过的第 l l l条路段的交通量, c l k c_{l}^{k} clk表示第 k k k个(起点,终点)对选择路径时,第 l l l条路段的容量上限, p l k p_{l}^{k} plk表示第 k k k个(起点,终点)对在第 l l l条路段上的概率, d p k d_{p}^{k} dpk表示第 k k k个(起点,终点)对的交通需求量。
首先,根据题目要求,新修建的6条路段必须是单向直线路段且长度为1,且起点和终点必须是交通网络中的任意两个节点。因此,我们可以将新建路段视为一种补充路段,即在原有的交通网络上添加一些额外的路段,来提升网络的可达率。
其次,我们需要确定新建路段的位置。为了使得网络中任意5条路段出现突发事故时,可达率最大,我们可以采用贪心的策略,即优先选择那些对网络可达率提升贡献最大的路段进行新建。具体来说,我们可以使用以下公式来计算每条路段对可达率的贡献:
C i , j = ∑ k = 1 n Q i , j , k N i , j C_{i,j} = \frac{\sum_{k=1}^{n} Q_{i,j,k}}{N_{i,j}} Ci,j=Ni,j∑k=1nQi,j,k
其中, C i , j C_{i,j} Ci,j表示路段 ( i , j ) (i,j) (i,j)对可达率的贡献, Q i , j , k Q_{i,j,k} Qi,j,k表示起点为 i i i,终点为 j j j的交通需求在路段 ( i , j ) (i,j) (i,j)上的交通量, N i , j N_{i,j} Ni,j表示从起点 i i i到终点 j j j的所有路径数。
根据该公式,我们可以计算出网络中所有路段的贡献,并选择其中贡献最大的6条路段作为新建路段的位置。
最后,我们需要确定新建路段的容量。根据题目要求,新建路段的容量足够大,因此我们可以将其容量设置为无穷大。但是,为了保证网络中所有交通需求的期望可达率尽可能最大,我们需要限制各路段上的交通量不能超过路段容量。因此,我们可以使用线性规划来确定各路段的最大容量,以保证网络中所有交通需求的可达率最大化。
综上所述,可以使用线性规划模型来解决第四个问题,具体的数学表达式如下:
m a x ∑ i = 1 m P i ⋅ C i max \quad \sum_{i=1}^{m}P_{i}\cdot C_{i} maxi=1∑mPi⋅Ci
s . t . C i , j = ∑ k = 1 n Q i , j , k N i , j s.t. \quad C_{i,j} = \frac{\sum_{k=1}^{n} Q_{i,j,k}}{N_{i,j}} s.t.Ci,j=Ni,j∑k=1nQi,j,k
∑ j = 1 n Q i , j , k ≤ C i , j , ∀ i , j , k \sum_{j=1}^{n} Q_{i,j,k} \leq C_{i,j}, \quad \forall i,j,k j=1∑nQi,j,k≤Ci,j,∀i,j,k
P i ⋅ C i ≤ C m a x , ∀ i P_{i}\cdot C_{i} \leq C_{max}, \quad \forall i Pi⋅Ci≤Cmax,∀i
其中, m m m表示新建路段的数量, n n n表示网络中的节点数, Q i , j , k Q_{i,j,k} Qi,j,k表示起点为 i i i,终点为 j j j的交通需求在路段 ( i , j ) (i,j) (i,j)上的交通量, N i , j N_{i,j} Ni,j表示从起点 i i i到终点 j j j的所有路径数, C i , j C_{i,j} Ci,j表示路段 ( i , j ) (i,j) (i,j)对可达率的贡献, P i P_{i} Pi表示新建路段 i i i的位置, C m a x C_{max} Cmax表示路段的最大容量。
该数学模型可以通过线性规划的求解方法来求得最优解,即可达率最大化的路段位置和容量。通过将新建路段作为补充路段来提高网络的可达率,可以有效应对突发状况,保障交通需求的实现。
假设新增的6条路段分别为:
新建路段1:节点1到节点2
新建路段2:节点3到节点4
新建路段3:节点5到节点6
新建路段4:节点7到节点8
新建路段5:节点9到节点10
新建路段6:节点11到节点12
其中,节点1~12为原有交通网络中的节点。
定义冲突矩阵M,其中M(i,j)=1代表节点i和节点j之间存在冲突,M(i,j)=0代表没有冲突,即可以修建新路段。
根据题目要求,可达率最大化的目标函数为:
maximize
P
=
1
N
∑
i
=
1
N
P
i
P = \frac{1}{N}\sum_{i=1}^{N}P_i
P=N1∑i=1NPi
其中,N为交通需求总量,
P
i
P_i
Pi为第i条交通需求的可达率。
现在假设任意5条路段出现突发事故后,网络中的交通流量为
λ
\lambda
λ,根据可达率的定义,有:
P
i
=
Q
i
D
i
P_i = \frac{Q_i}{D_i}
Pi=DiQi
其中,
Q
i
Q_i
Qi为第i条交通需求分配到的路径上的交通流量,
D
i
D_i
Di为第i条交通需求的总量。
假设新增的路段容量足够大,不会影响交通需求的可达率,即不会产生拥堵。因此,可达率的计算只需考虑原有的路段。
根据题目要求,交通需求分配到对应路径后,各路段上的交通量不能超过路段容量,即有:
∑
i
=
1
N
Q
i
≤
∑
j
=
1
M
C
j
\sum_{i=1}^{N}Q_i \leq \sum_{j=1}^{M}C_j
∑i=1NQi≤∑j=1MCj
其中,N为交通需求总量,M为路段总数,
Q
i
Q_i
Qi为第i条交通需求分配到的路径上的交通流量,
C
j
C_j
Cj为第j条路段的容量。
综上所述,可以建立如下的数学模型:
maximize
P
=
1
N
∑
i
=
1
N
P
i
P = \frac{1}{N}\sum_{i=1}^{N}P_i
P=N1∑i=1NPi
subject to
∑
i
=
1
N
Q
i
≤
∑
j
=
1
M
C
j
\sum_{i=1}^{N}Q_i \leq \sum_{j=1}^{M}C_j
∑i=1NQi≤∑j=1MCj
∑
i
=
1
N
Q
i
=
λ
\sum_{i=1}^{N}Q_i = \lambda
∑i=1NQi=λ
Q
i
≥
0
Q_i \geq 0
Qi≥0
Q
i
≤
D
i
Q_i \leq D_i
Qi≤Di
Q
i
≤
C
j
(
1
−
M
(
i
,
j
)
)
Q_i \leq C_j(1-M(i,j))
Qi≤Cj(1−M(i,j))
其中,N为交通需求总量,M为路段冲突矩阵,
P
i
P_i
Pi为第i条交通需求的可达率,
λ
\lambda
λ为网络中交通流量,
Q
i
Q_i
Qi为第i条交通需求分配到的路径上的交通流量,
C
j
C_j
Cj为第j条路段的容量,
D
i
D_i
Di为第i条交通需求的总量。
该数学模型可以用线性规划的方法求解,得到最优的可达率和交通流量分配方案。最后,根据分配方案,可以确定每条新增路段的使用量,从而得到网络中任意5条路段出现突发事故时,网络中所有交通需求的期望可达率最大的方案。
# 导入必要的库
import numpy as np
import pandas as pd
import networkx as nx
import random
# 读取数据
demand = pd.read_excel('附件2.xlsx', sheet_name='需求量')
capacity = pd.read_excel('附件3.xlsx', sheet_name='路段容量')
# 构建图
G = nx.Graph()
# 添加节点
for i in range(1, 41):
G.add_node(i)
# 添加所有的边
for i in range(1, 41):
for j in range(i + 1, 41):
G.add_edge(i, j, weight=1)
# 添加新建路段
# 选择任意两个节点作为新建路段的起点和终点
# 并且新建路段的容量足够大
G.add_edge(1, 31, weight=1)
G.add_edge(2, 32, weight=1)
G.add_edge(3, 33, weight=1)
G.add_edge(4, 34, weight=1)
G.add_edge(5, 35, weight=1)
G.add_edge(6, 36, weight=1)
# 计算交通需求可达率
def calculate_reachability(G, demand, capacity):
# 循环计算所有起点和终点对之间的交通需求可达率
for index, row in demand.iterrows():
# 获取起点和终点
origin = row['起点']
destination = row['终点']
# 获取起点和终点之间的路径
paths = nx.all_simple_paths(G, origin, destination)
# 初始化交通需求可达率
reachability = 0
# 遍历所有的路径
for path in paths:
# 初始化路径交通量
path_traffic = 0
# 遍历路径上的所有路段
for i in range(len(path) - 1):
# 获取路段起点和终点
start = path[i]
end = path[i + 1]
# 获取路段容量
cap = capacity.loc[(capacity['起点'] == start) & (capacity['终点'] == end), '容量'].values[0]
# 计算路段交通量
traffic = min(row['交通量'], cap)
# 更新路径交通量
path_traffic += traffic
# 更新交通需求可达率
reachability = max(reachability, path_traffic / row['交通量'])
# 将交通需求可达率填入表格中
demand.loc[index, '可达率'] = reachability
# 返回交通需求可达率表格
return demand
# 用来保存最优方案的可达率
max_reachability = 0
# 用来保存最优方案的新建路段
best_new_edges = []
# 用来保存最优方案的交通需求分配结果
best_traffic_distribution = []
# 用来保存最优方案的路径
best_paths = []
# 循环1000次,找出最优方案
for i in range(1000):
# 随机选择5条路段作为突发状况
new_edges = random.sample(G.edges(), 5)
# 将被选择的路段的容量设为0
for edge in new_edges:
capacity.loc[(capacity['起点'] == edge[0]) & (capacity['终点'] == edge[1]), '容量'] = 0
# 计算交通需求可达率
reachability = calculate_reachability(G, demand, capacity)
# 计算期望可达率
expected_reachability = reachability['可达率'].mean()
# 如果期望可达率大于当前最优方案的可达率,则更新最优方案
if expected_reachability > max_reachability:
max_reachability = expected_reachability
best_new_edges = new_edges
best_traffic_distribution = reachability['交通量'].tolist()
best_paths = reachability['路径'].tolist()
# 将最优方案的结果打印出来
print('最优方案的期望可达率为:{}'.format(max_reachability))
print('最优方案的新建路段为:{}'.format(best_new_edges))
print('最优方案的交通需求分配结果为:{}'.format(best_traffic_distribution))
print('最优方案的路径为:{}'.format(best_paths))
更多内容可以点击下方名片详细了解,让小鹿学长带你冲刺五一杯夺奖之路!
敬请期待我们的努力所做出的工作!记得关注 鹿鹿学长呀!