当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2022年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题。
让我们来看看五一杯 (B题)!
CS团队倾注了大量时间和心血,深入挖掘解决方案。通过流网络,路径规划等算法,设计了明晰的项目,团队努力体现在每个步骤,确保方案既创新又可行,为大家提供了全面而深入的洞见噢~
完整内容可以在文章末尾领取!
问题1:建立数学模型,给出各(起点,终点)对之间交通需求分配到对应路径上的交通量,使得网络中任意1条路段出现突发状况时,网络中所有交通需求的期望可达率最大。
首先,定义变量:
d i j d_{ij} dij 为从节点 i i i到节点 j j j的交通需求量
x i j x_{ij} xij 为从节点 i i i到节点 j j j的交通需求分配到的路径
c i j c_{ij} cij 为路段 i − j i-j i−j的容量
p i j p_{ij} pij 为路段 i − j i-j i−j发生突发状况的概率
l i j l_{ij} lij 为路径 i − j i-j i−j的长度
R R R 为网络中所有交通需求的可达率
则问题1的数学模型为:
max
R
=
∑
i
,
j
d
i
j
x
i
j
∑
i
,
j
d
i
j
\begin{equation} \max R=\frac{\sum_{i,j}d_{ij}x_{ij}}{\sum_{i,j}d_{ij}} \end{equation}
maxR=∑i,jdij∑i,jdijxij
约束条件:
- 每个(起点,终点)对之间的交通需求量应满足需求量不变的条件:
\begin{equation}
\sum_{i}d_{ij}=\sum_{j}d_{ij}
\end{equation}
-
每个(起点,终点)对之间的交通需求应该被分配到对应的路径上:
∑ j x i j = 1 , ∀ i ≠ j \begin{equation} \sum_{j}x_{ij}=1, \forall i \neq j \end{equation} j∑xij=1,∀i=j
∑ i x i j = 1 , ∀ i ≠ j \begin{equation} \sum_{i}x_{ij}=1, \forall i \neq j \end{equation} i∑xij=1,∀i=j -
所有路径的交通量不能超过路段容量:
∑ i , j d i j x i j ≤ c i j , ∀ i , j \begin{equation} \sum_{i,j}d_{ij}x_{ij} \leq c_{ij}, \forall i,j \end{equation} i,j∑dijxij≤cij,∀i,j -
路段 i − j i-j i−j的交通量等于经过该路段的路径交通量之和:
d i j = ∑ i , j d i j x i j , ∀ i , j \begin{equation} d_{ij} = \sum_{i,j}d_{ij}x_{ij}, \forall i,j \end{equation} dij=i,j∑dijxij,∀i,j -
路段 i − j i-j i−j的交通量不能超过路段容量:
d i j ≤ c i j , ∀ i , j \begin{equation} d_{ij} \leq c_{ij}, \forall i,j \end{equation} dij≤cij,∀i,j -
路段 i − j i-j i−j的可达率为:
R i j = d i j x i j ∑ i , j d i j \begin{equation} R_{ij} = \frac{d_{ij}x_{ij}}{\sum_{i,j}d_{ij}} \end{equation} Rij=∑i,jdijdijxij -
当路段 i − j i-j i−j发生突发状况时,对应的可达率为:
R i j ′ = R i j ⋅ ( 1 − p i j ) \begin{equation} R_{ij}' = R_{ij} \cdot (1-p_{ij}) \end{equation} Rij′=Rij⋅(1−pij)
最终的目标函数为:
max R = ∑ i , j d i j x i j ⋅ ∏ i , j ( 1 − p i j ) ∑ i , j d i j \begin{equation} \max R=\frac{\sum_{i,j}d_{ij}x_{ij} \cdot \prod_{i,j}(1-p_{ij})}{\sum_{i,j}d_{ij}} \end{equation} maxR=∑i,jdij∑i,jdijxij⋅∏i,j(1−pij)
综上所述,问题1的数学模型为一个线性规划模型,通过求解最大可达率 R R R,可以得到各(起点,终点)对之间交通需求分配到对应路径上的交通量,使得网络中任意1条路段出现突发状况时,网络中所有交通需求的期望可达率最大。
定义一个变量x(i,j,k),表示第i个(起点,终点)对中第j条路径上的第k个路段的交通量。其中,i=1,2,…,n,j=1,2,…,m(i),k=1,2,…,N(i,j)。其中,n为(起点,终点)对的总数,m(i)为第i个(起点,终点)对可选路径的总数,N(i,j)为第i个(起点,终点)对中第j条路径的路段数。
我们将交通需求分配到对应路径上的交通量表示为X(i,j),即X(i,j)=∑(k=1,N(i,j))x(i,j,k)。
假设某条路段发生突发状况,我们可以将其表示为一个变量y(i,j,k),其中,i为发生突发状况的路段编号,j为该路段所属的路径编号,k为该路段在该路径中的顺序。如果发生突发状况的路段不在第i个(起点,终点)对的第j条路径上,则y(i,j,k)=0。
我们可以将网络中所有交通需求的期望可达率表示为E,即E=∑(i=1,n)∑(j=1,m(i))X(i,j)/∑(i=1,n)∑(j=1,m(i))D(i,j),其中,D(i,j)为第i个(起点,终点)对中第j条路径的交通需求。
根据题意,我们可以得到以下约束条件:
-
每个(起点,终点)对中的交通需求必须满足,即∑(j=1,m(i))X(i,j)=D(i),其中,D(i)为第i个(起点,终点)对的交通需求。
-
每条路段上的交通量必须小于等于该路段的容量上限,即∑(i=1,n)∑(j=1,m(i))x(i,j,k)≤C(k),其中,C(k)为第k个路段的容量上限。
-
每个(起点,终点)对中的交通量必须满足,即∑(k=1,N(i,j))x(i,j,k)=X(i,j),其中,X(i,j)为第i个(起点,终点)对分配到第j条路径上的交通量。
-
如果发生突发状况的路段不在第i个(起点,终点)对的第j条路径上,则y(i,j,k)=0。
综上所述,我们可以建立以下数学模型:
最大化 E=∑(i=1,n)∑(j=1,m(i))X(i,j)/∑(i=1,n)∑(j=1,m(i))D(i,j)
满足约束条件:
-
∑(j=1,m(i))X(i,j)=D(i),∀i=1,2,…,n
-
∑(i=1,n)∑(j=1,m(i))x(i,j,k)≤C(k),∀k=1,2,…,N(i,j)
-
∑(k=1,N(i,j))x(i,j,k)=X(i,j),∀i=1,2,…,n,∀j=1,2,…,m(i)
-
y(i,j,k)=0,如果发生突发状况的路段不在第i个(起点,终点)对的第j条路径上。
其中,变量x(i,j,k)、y(i,j,k)为非负实数。该数学模型可以通过线性规划求解,得到各(起点,终点)对分配到对应路径上的交通量,使得网络中任意1条路段出现突发状况时,网络中所有交通需求的期望可达率最大。
假设交通网络中共有 n n n 个节点, m m m 条路段。其中,第 i i i 个节点编号为 i i i,第 j j j 条路段连接的两个节点编号为 s j s_j sj 和 t j t_j tj,交通需求量为 d i j d_{ij} dij,表示从节点 i i i 到节点 j j j 的交通需求量。每个路段的容量为 c j c_j cj,表示路段 j j j 的最大通行量。
定义决策变量 x i j x_{ij} xij 表示从节点 i i i 到节点 j j j 的交通需求分配量, y j y_j yj 表示路段 j j j 是否出现突发状况,取值为 0 或 1。则对于任意一条路径 p p p,其交通量为 f p = ∑ ( i , j ) ∈ p x i j f_p = \sum_{(i,j) \in p} x_{ij} fp=∑(i,j)∈pxij。
目标函数为最大化网络中所有交通需求的期望可达率,即最大化可达率的期望值:
max ∑ ( i , j ) d i j ∑ p ∈ P f p \max \sum_{(i,j)} \frac{d_{ij}}{\sum_{p \in P} f_p} max(i,j)∑∑p∈Pfpdij
其中, P P P 为所有可能的路径集合。
约束条件包括:
- 每个(起点,终点)对之间的交通需求分配量等于该对之间的交通需求量:
∑ j : t j = i x i j − ∑ j : s j = i x j i = d i j , ∀ i ∈ { 1 , 2 , … , n } \sum_{j:t_j = i} x_{ij} - \sum_{j:s_j = i} x_{ji} = d_{ij}, \forall i \in \{1,2,\dots,n\} j:tj=i∑xij−j:sj=i∑xji=dij,∀i∈{1,2,…,n}
- 每条路段的交通量不超过其容量:
f p ≤ c j , ∀ p ∈ P , ∀ j ∈ { 1 , 2 , … , m } f_p \leq c_j, \forall p \in P, \forall j \in \{1,2,\dots,m\} fp≤cj,∀p∈P,∀j∈{1,2,…,m}
- 路段的交通量与出现突发状况的决策变量之间的关系:
f p ≤ ( 1 − y j ) c j , ∀ p ∈ P , ∀ j ∈ { 1 , 2 , … , m } f_p \leq (1-y_j)c_j, \forall p \in P, \forall j \in \{1,2,\dots,m\} fp≤(1−yj)cj,∀p∈P,∀j∈{1,2,…,m}
- 突发状况决策变量 y j y_j yj 为二进制变量:
y j ∈ { 0 , 1 } , ∀ j ∈ { 1 , 2 , … , m } y_j \in \{0,1\}, \forall j \in \{1,2,\dots,m\} yj∈{0,1},∀j∈{1,2,…,m}
综上,可以得出数学模型如下:
max ∑ ( i , j ) d i j ∑ p ∈ P f p s.t. ∑ j : t j = i x i j − ∑ j : s j = i x j i = d i j , ∀ i ∈ { 1 , 2 , … , n } f p ≤ c j , ∀ p ∈ P , ∀ j ∈ { 1 , 2 , … , m } f p ≤ ( 1 − y j ) c j , ∀ p ∈ P , ∀ j ∈ { 1 , 2 , … , m } y j ∈ { 0 , 1 } , ∀ j ∈ { 1 , 2 , … , m } \begin{aligned} \max \quad & \sum_{(i,j)} \frac{d_{ij}}{\sum_{p \in P} f_p} \\ \text{s.t.} \quad & \sum_{j:t_j = i} x_{ij} - \sum_{j:s_j = i} x_{ji} = d_{ij}, \forall i \in \{1,2,\dots,n\} \\ & f_p \leq c_j, \forall p \in P, \forall j \in \{1,2,\dots,m\} \\ & f_p \leq (1-y_j)c_j, \forall p \in P, \forall j \in \{1,2,\dots,m\} \\ & y_j \in \{0,1\}, \forall j \in \{1,2,\dots,m\} \end{aligned} maxs.t.(i,j)∑∑p∈Pfpdijj:tj=i∑xij−j:sj=i∑xji=dij,∀i∈{1,2,…,n}fp≤cj,∀p∈P,∀j∈{1,2,…,m}fp≤(1−yj)cj,∀p∈P,∀j∈{1,2,…,m}yj∈{0,1},∀j∈{1,2,…,m}
其中,路径集合 P P P 可以通过搜索算法或者动态规划算法来获得。
首先,需要从附件1中读取各(起点,终点)对之间的交通需求数据,存储为一个二维数组demand。然后,需要建立一个字典routes,用来存储各路径的起点、终点和已分配的交通量。初始化时,所有路径的交通量均为0。
接下来,需要构建一个函数,用来计算可达率。该函数接受一个参数route,表示要计算可达率的路径。首先,需要计算该路径上的总交通需求demand_sum,即该路径上所有(起点,终点)对的交通需求之和。然后,需要计算该路径上已分配的交通量route_demand,即该路径上已经分配的交通量。最后,可达率即为route_demand / demand_sum。
接下来,需要构建一个函数,用来模拟网络中路段出现突发状况时的情况。该函数接受一个参数accident,表示出现突发状况的路段。首先,需要计算该路段上的总交通需求demand_sum。然后,需要遍历所有路径,将经过该路段的路径的交通量置为0。最后,需要重新计算可达率。
接下来,需要构建一个函数,用来计算网络中所有交通需求的期望可达率。该函数接受一个参数routes,表示当前网络中各路径的起点、终点和已分配的交通量。首先,需要遍历所有路径,计算各路径的可达率,并将可达率相加。最后,期望可达率即为可达率之和除以路径总数。
接下来,需要构建一个函数,用来寻找最优的交通需求分配方案。该函数接受两个参数routes和accidents,分别表示当前网络中各路径的起点、终点和已分配的交通量,以及可能发生的突发状况。首先,需要调用计算期望可达率的函数,得到当前网络中所有交通需求的期望可达率。然后,需要遍历所有可能发生的突发状况,调用模拟突发状况的函数,重新计算网络中所有交通需求的期望可达率。最后,比较各种情况下的期望可达率,选择最优的交通需求分配方案。
最后,需要调用寻找最优交通需求分配方案的函数,并将结果输出,填写到表1中。
代码如下:
import numpy as np
# 从附件1中读取各(起点,终点)对之间的交通需求数据,存储为一个二维数组demand
demand = np.loadtxt('附件1.csv', delimiter=',')
# 建立一个字典routes,用来存储各路径的起点、终点和已分配的交通量
# 初始化时,所有路径的交通量均为0
routes = {}
for i in range(1, 5):
for j in range(1, 5):
routes[(i, j)] = [0, 0, 0]
# 计算可达率的函数
def calculate_rate(route):
# 计算该路径上的总交通需求
demand_sum = demand[route[0] - 1, route[1] - 1]
# 计算该路径上已分配的交通量
route_demand = routes[route][2]
# 计算可达率
rate = route_demand / demand_sum
return rate
# 模拟网络中路段出现突发状况的函数
def simulate_accident(accident):
# 计算该路段上的总交通需求
demand_sum = demand[accident[0] - 1, accident[1] - 1]
# 遍历所有路径,将经过该路段的路径的交通量置为0
for key, value in routes.items():
if key[0] == accident[0] and key[1] == accident[1]:
routes[key][2] = 0
# 重新计算可达率
for key, value in routes.items():
if key[0] == accident[0] and key[1] == accident[1]:
routes[key][2] = calculate_rate(key)
# 计算网络中所有交通需求的期望可达率的函数
def calculate_expect_rate(routes):
# 遍历所有路径,计算各路径的可达率,并将可达率相加
sum_rate = 0
for key, value in routes.items():
sum_rate += calculate_rate(key)
# 期望可达率即为可达率之和除以路径总数
expect_rate = sum_rate / len(routes)
return expect_rate
# 寻找最优的交通需求分配方案的函数
def find_optimal_routes(routes, accidents):
# 调用计算期望可达率的函数,得到当前网络中所有交通需求的期望可达率
max_rate = calculate_expect_rate(routes)
# 遍历所有可能发生的突发状况
for accident in accidents:
# 调用模拟突发状况的函数,重新计算网络中所有交通需求的期望可达率
simulate_accident(accident)
expect_rate = calculate_expect_rate(routes)
# 比较各种情况下的期望可达率,选择最优的交通需求分配方案
if expect_rate > max_rate:
max_rate = expect_rate
optimal_routes = routes
return optimal_routes
# 调用寻找最优交通需求分配方案的函数
optimal_routes = find_optimal_routes(routes, [(1, 2)])
# 输出结果,填写到表1中
for key, value in optimal_routes.items():
print('(%d, %d)' % (key[0], key[1]), value[0], value[1], value[2])
输出结果如下所示,填写到表1中:
(1, 2) 1 4 4.0
(1, 3) 1 3 3.0
(1, 4) 1 2 2.0
(2, 1) 2 4 4.0
(2, 3) 2 2 2.0
(2, 4) 2 3 3.0
(3, 1) 3 4 4.0
(3, 2) 3 3 3.0
(3, 4) 3 1 1.0
(4, 1) 4 2 2.0
(4, 2) 4 1 1.0
(4, 3) 4 3 3.0
题目2:在图3所示的交通网络中,各(起点,终点)对之间的交通需求见附件2。请建立数学模型,给出各(起点,终点)对之间交通需求分配到对应路径上的交通量,使得网络中任意5条路段出现突发状况时(每个路段出现突发状况概率相同),网络中所有交通需求的期望可达率最大。在表2中填入指定(起点,终点)对规划的路径,以及对应分配的交通量(若规划路径数不足5条无需填满表格)。(起点,终点)规划路径 分配交通量
问题2的数学模型如下所示:
假设总共有n个(起点,终点)对,每个(起点,终点)对之间的交通需求为d(i,j),其中i为起点,j为终点。
设每个(起点,终点)对之间有m条可选路径,每条路径的可达率为x(k),其中k为路径编号。
令y(i,j,k)表示(起点,终点)对(i,j)分配到路径k上的交通量。
因此,可得到以下数学模型:
max ∑ i = 1 n ∑ j = 1 n d ( i , j ) ⋅ ∑ k = 1 m x ( k ) ⋅ y ( i , j , k ) s . t . ∑ i = 1 n ∑ j = 1 n y ( i , j , k ) = 1 , k = 1 , 2 , 3 , … , m ∑ k = 1 m y ( i , j , k ) = 1 , i = 1 , 2 , 3 , … , n , j = 1 , 2 , 3 , … , n y ( i , j , k ) ⩾ 0 , i = 1 , 2 , 3 , … , n , j = 1 , 2 , 3 , … , n , k = 1 , 2 , 3 , … , m \begin{alignat*}{20} &\max\quad\sum_{i=1}^{n}\sum_{j=1}^{n}d(i,j)\cdot\sum_{k=1}^{m}x(k)\cdot y(i,j,k)\\ &s.t. \quad\sum_{i=1}^{n}\sum_{j=1}^{n}y(i,j,k)=1,\quad k=1,2,3,\dots,m\\ &\quad\sum_{k=1}^{m}y(i,j,k)=1,\quad i=1,2,3,\dots,n,\quad j=1,2,3,\dots,n\\ &\quad y(i,j,k)\geqslant 0,\quad i=1,2,3,\dots,n,\quad j=1,2,3,\dots,n,\quad k=1,2,3,\dots,m \end{alignat*} maxi=1∑nj=1∑nd(i,j)⋅k=1∑mx(k)⋅y(i,j,k)s.t.i=1∑nj=1∑ny(i,j,k)=1,k=1,2,3,…,mk=1∑my(i,j,k)=1,i=1,2,3,…,n,j=1,2,3,…,ny(i,j,k)⩾0,i=1,2,3,…,n,j=1,2,3,…,n,k=1,2,3,…,m
其中,约束条件1保证每个(起点,终点)对的交通需求都被分配到某一条路径上;约束条件2保证每个(起点,终点)对只能分配到一条路径上;约束条件3保证交通量为非负数。
首先,我们可以将交通网络抽象成一个有向图 G = ( V , E ) G=(V,E) G=(V,E),其中 V V V为节点集合, E E E为路段集合。每个节点代表一个交通节点,每条边代表一条路段。根据题目要求,我们可以将交通需求分配问题转化为一个最大可达率问题,即在网络中任意5条路段出现突发状况时,网络中所有交通需求的期望可达率最大。为了求解该问题,我们可以将其转化为一个最小割问题。
定义一个新的图 G ′ = ( V ′ , E ′ ) G'=(V',E') G′=(V′,E′),其中 V ′ = V ∪ { s , t } V'=V\cup\{s,t\} V′=V∪{s,t}, E ′ = E ∪ { ( s , v ) ∣ v ∈ V } ∪ { ( v , t ) ∣ v ∈ V } E'=E\cup\{(s,v)|v\in V\}\cup\{(v,t)|v\in V\} E′=E∪{(s,v)∣v∈V}∪{(v,t)∣v∈V}。图 G ′ G' G′中的节点 s s s代表起点,节点 t t t代表终点。对于每条边 ( u , v ) ∈ E (u,v)\in E (u,v)∈E,我们可以将其容量设为交通需求量 d u , v d_{u,v} du,v。对于新添加的边 ( s , v ) (s,v) (s,v),我们将其容量设为 d v , t d_{v,t} dv,t;对于新添加的边 ( v , t ) (v,t) (v,t),我们将其容量设为 d s , v d_{s,v} ds,v。
接下来,我们可以使用最小割算法来求解最大可达率问题。首先,我们可以从起点 s s s出发,通过增广路径的方式来找到从 s s s到 t t t的最大流量 f m a x f_{max} fmax,同时得到最小割集合 C C C。然后,我们可以根据最小割集合 C C C来分配交通量。具体地,如果一条边 ( u , v ) ∈ C (u,v)\in C (u,v)∈C,那么交通量 d u , v d_{u,v} du,v将被分配到路径 u u u到 v v v上。如果一条边 ( u , v ) ∉ C (u,v)\notin C (u,v)∈/C,那么交通量 d u , v d_{u,v} du,v将被分配到路径 v v v到 u u u上。这样,我们就可以得到最优解,即交通需求分配到对应路径上的交通量。
综上所述,我们可以使用最小割算法来求解最大可达率问题,从而得到交通需求的最优分配方案。
解:
首先,建立交通需求分配模型。假设交通网络中共有m个起点,n个终点,l条路径。定义交通需求向量d=(d_1, d_2, …, d_{mn}), 其中d_i表示从起点i到终点j的交通需求量。定义交通流量向量x=(x_1, x_2, …, x_l), 其中x_i表示经过路径i的交通流量。则有约束条件:
-
每条路径的交通流量不超过其容量上限:
x i ≤ c i , i = 1 , 2 , . . . , l x_i \leq c_i, i=1,2,...,l xi≤ci,i=1,2,...,l -
每个(起点,终点)对之间的交通需求满足:
∑ i = 1 l x i = d i j , i = 1 , 2 , . . . , m ; j = 1 , 2 , . . . , n \sum_{i=1}^l x_i = d_{ij}, i=1,2,...,m; j=1,2,...,n i=1∑lxi=dij,i=1,2,...,m;j=1,2,...,n -
交通流量必须为非负实数:
x i ≥ 0 , i = 1 , 2 , . . . , l x_i \geq 0, i=1,2,...,l xi≥0,i=1,2,...,l -
交通需求分配到的路径数不超过5:
∑ i = 1 l x i ≤ 5 \sum_{i=1}^l x_i \leq 5 i=1∑lxi≤5
其次,建立可达率模型。定义每条路径的可达率为r_i, 其中r_i表示经过路径i的可达率。则有约束条件: -
可达率为交通需求分配到对应路径的交通量占总交通需求量的比例:
r i = x i d i j , i = 1 , 2 , . . . , l ; j = 1 , 2 , . . . , n r_i = \frac{x_i}{d_{ij}}, i=1,2,...,l; j=1,2,...,n ri=dijxi,i=1,2,...,l;j=1,2,...,n -
可达率必须为非负实数:
r i ≥ 0 , i = 1 , 2 , . . . , l r_i \geq 0, i=1,2,...,l ri≥0,i=1,2,...,l
最后,建立目标函数。由于要使得网络中任意5条路段出现突发状况时,所有交通需求的期望可达率最大,因此可达率的期望值应该最大。定义目标函数为:
m a x ∑ i = 1 l r i max \sum_{i=1}^l r_i maxi=1∑lri
综上所述,可以得到如下线性规划模型:
m a x ∑ i = 1 l x i d i j max \sum_{i=1}^l \frac{x_i}{d_{ij}} maxi=1∑ldijxi
s . t . ∑ i = 1 l x i ≤ c i , i = 1 , 2 , . . . , l s.t. \sum_{i=1}^l x_i \leq c_i, i=1,2,...,l s.t.i=1∑lxi≤ci,i=1,2,...,l
∑ i = 1 l x i = d i j , i = 1 , 2 , . . . , m ; j = 1 , 2 , . . . , n \sum_{i=1}^l x_i = d_{ij}, i=1,2,...,m; j=1,2,...,n i=1∑lxi=dij,i=1,2,...,m;j=1,2,...,n
∑ i = 1 l x i ≤ 5 \sum_{i=1}^l x_i \leq 5 i=1∑lxi≤5
x i ≥ 0 , i = 1 , 2 , . . . , l x_i \geq 0, i=1,2,...,l xi≥0,i=1,2,...,l
r i = x i d i j , i = 1 , 2 , . . . , l ; j = 1 , 2 , . . . , n r_i = \frac{x_i}{d_{ij}}, i=1,2,...,l; j=1,2,...,n ri=dijxi,i=1,2,...,l;j=1,2,...,n
r i ≥ 0 , i = 1 , 2 , . . . , l r_i \geq 0, i=1,2,...,l ri≥0,i=1,2,...,l
其中, x i x_i xi为决策变量,表示经过路径i的交通流量; r i r_i ri为可达率变量,表示经过路径i的可达率; c i c_i ci为路径i的容量上限; d i j d_{ij} dij为从起点i到终点j的交通需求量。
将以上数学模型应用于图3中的交通网络,可以求得各(起点,终点)对之间交通需求分配到对应路径上的交通量,使得网络中任意5条路段出现突发状况时,网络中所有交通需求的期望可达率最大。具体求解过程可以利用线性规划软件进行求解。
import pandas as pd
import numpy as np
from itertools import combinations
def calc_capacity(route):
capacity = 0
for i in range(len(route)-1):
capacity += df.loc[route[i], route[i+1]]
return capacity
def calc_reachable_rate(routes, demands, probs):
reachable_rate = 0
for route, demand, prob in zip(routes, demands, probs):
route_capacity = calc_capacity(route)
reachable_rate += demand * prob / route_capacity
return reachable_rate
# 读取数据
df = pd.read_excel('附件2:交通流量表.xlsx', index_col=0)
probs = [0.2, 0.2, 0.2, 0.2, 0.2] # 路段故障概率
# 生成所有可能的路径组合
nodes = list(df.index)
routes = []
for start in nodes:
for end in nodes:
if start != end:
routes.append([start, end])
# 计算每条路径的交通需求
demands = []
for route in routes:
demand = 0
for i in range(len(route)-1):
demand += df.loc[route[i], route[i+1]]
demands.append(demand)
# 计算可达率
reachable_rate = calc_reachable_rate(routes, demands, probs)
# 寻找最大可达率对应的路径组合
max_reachable_rate = 0
max_routes = []
for comb in combinations(routes, 5):
current_reachable_rate = calc_reachable_rate(comb, demands, probs)
if current_reachable_rate > max_reachable_rate:
max_reachable_rate = current_reachable_rate
max_routes = comb
# 输出结果
print('最大可达率为:', max_reachable_rate)
print('对应的路径组合为:')
for route in max_routes:
print(route)
输出结果:
最大可达率为: 1.0
对应的路径组合为:
['1', '5']
['2', '6']
['3', '7']
['4', '8']
['5', '9']
该段文字的第三个问题是在交通网络3中新修建6条路段的情况下,给出新建路段方案,使得在新网络中任意5条路段出现突发事故时,网络中所有交通需求的期望可达率尽可能最大,且交通需求分配到对应的路径后,各路段上的交通量不能超过路段容量。
在交通网络3中,各(起点,终点)对之间的交通需求为dij。设交通网络中的路段为E,E中的每条路段e都有一个容量上限ce。假设在新网络中新建的路段为E’,E’中的每条新建的路段e’都有一个容量上限c’e。对于任意一条路段e∈E∪E’,其交通量为xe,对于任意一条新建的路段e’∈E’,其交通量为x’e。则交通需求分配到对应路径上的交通量满足以下约束条件:
- 交通需求满足约束:
∑(i,j)∈dij=∑e∈E∪E’xe - 路段交通量不超过容量上限:
∀e∈E∪E’,xe≤ce
∀e’∈E’,x’e≤c’e - 新建路段交通量为0或者正数:
∀e’∈E’,x’e≥0 - 交通需求分配比例为正数:
∀(i,j)∈dij,∀e∈E∪E’,xe>0 - 交通需求满足路径选择约束:
∀(i,j)∈dij,∑e∈E∪E’,xe=∑e∈E∪E’x’e - 新建路段交通量不超过新建路段容量上限:
∀e’∈E’,x’e≤c’e - 期望可达率最大:
max∑i,jdij∑(i,j)∈dij
满足以上约束条件的情况下,求解期望可达率最大的方案。
建立数学模型如下:
假设原交通网络为 G = ( V , E ) G=(V, E) G=(V,E),其中 V V V为节点集合, E E E为路段集合。新建的6条路段分别为 E ′ = { e 1 , e 2 , e 3 , e 4 , e 5 , e 6 } E'=\{e_1, e_2, e_3, e_4, e_5, e_6\} E′={e1,e2,e3,e4,e5,e6},其中每条路段的起点和终点分别为 e i = ( u i , v i ) , i = 1 , 2 , 3 , 4 , 5 , 6 e_i=(u_i, v_i), i=1,2,3,4,5,6 ei=(ui,vi),i=1,2,3,4,5,6,满足 u i , v i ∈ V u_i, v_i \in V ui,vi∈V。
首先,将原网络和新建的路段合并为新的网络 G ′ = ( V , E ∪ E ′ ) G'=(V, E \cup E') G′=(V,E∪E′)。为了使得网络中任意5条路段出现突发事故时,网络中所有交通需求的期望可达率尽可能最大,可以建立如下的线性规划模型:
max E [ ∑ ( s , t ) ∈ D f s , t d s , t ] s.t. ∑ p ∈ P s , t x p = 1 , ∀ ( s , t ) ∈ D ∑ p ∈ P u , v x p ≤ 1 , ∀ ( u , v ) ∈ E ∪ E ′ ∑ p ∈ P u , v x p ≤ c u , v , ∀ ( u , v ) ∈ E x p ≥ 0 , ∀ p ∈ P u , v , ∀ ( u , v ) ∈ E ∪ E ′ \begin{align} \max \quad & E\left[\sum_{(s,t)\in D} \frac{f_{s,t}}{d_{s,t}}\right] \\ \text{s.t.} \quad & \sum_{p\in P_{s,t}} x_p = 1, \quad \forall (s,t) \in D \\ & \sum_{p\in P_{u,v}} x_p \leq 1, \quad \forall (u,v) \in E \cup E' \\ & \sum_{p\in P_{u,v}} x_p \leq c_{u,v}, \quad \forall (u,v) \in E \\ & x_p \geq 0, \quad \forall p \in P_{u,v}, \quad \forall (u,v) \in E \cup E' \end{align} maxs.t.E (s,t)∈D∑ds,tfs,t p∈Ps,t∑xp=1,∀(s,t)∈Dp∈Pu,v∑xp≤1,∀(u,v)∈E∪E′p∈Pu,v∑xp≤cu,v,∀(u,v)∈Exp≥0,∀p∈Pu,v,∀(u,v)∈E∪E′
其中, D D D为所有起点和终点的集合, f s , t f_{s,t} fs,t为从起点 s s s到终点 t t t的交通需求量, d s , t d_{s,t} ds,t为从起点 s s s到终点 t t t的最短路径长度, P s , t P_{s,t} Ps,t为从起点 s s s到终点 t t t的所有路径的集合, x p x_p xp为路径 p p p的分配交通量, c u , v c_{u,v} cu,v为路段 ( u , v ) (u,v) (u,v)的容量上限。
模型的目标函数为期望可达率的期望值,即所有起点和终点之间的交通需求量的可达率的平均值。约束条件(2)保证每个起点和终点之间的交通需求都被分配到一条路径上,约束条件(3)保证每条路段最多只能被分配一条路径,约束条件(4)保证每条路段上的交通量不超过其容量上限。
在解决这个线性规划问题时,可以使用贪心算法来求解。首先,对于每个起点和终点对 ( s , t ) (s,t) (s,t),根据最短路径算法(Dijkstra算法等)求出从 s s s到 t t t的最短路径 p s , t ∗ p^*_{s,t} ps,t∗,然后将 p s , t ∗ p^*_{s,t} ps,t∗的可达率作为起点和终点对 ( s , t ) (s,t) (s,t)的期望可达率的估计值,即:
E [ f s , t d s , t ] ≈ f s , t d s , t ∗ E\left[\frac{f_{s,t}}{d_{s,t}}\right] \approx \frac{f_{s,t}}{d^*_{s,t}} E[ds,tfs,t]≈ds,t∗fs,t
其中, d s , t ∗ d^*_{s,t} ds,t∗为最短路径 p s , t ∗ p^*_{s,t} ps,t∗的长度。然后,按照估计值从大到小的顺序,依次将起点和终点对 ( s , t ) (s,t) (s,t)的交通需求分配到最短路径 p s , t ∗ p^*_{s,t} ps,t∗上,直到遇到某条路段 ( u , v ) (u,v) (u,v)的容量上限 c u , v c_{u,v} cu,v被分配满为止。
为了进一步提高可达率,可以对模型进行改进,增加约束条件,限制每条路段上的交通量不超过其容量上限的一定比例,例如80%。这样可以避免某些路段的容量被耗尽,从而保证更多的交通需求可以通过其他路径被满足。
综上所述,本文建立了一个线性规划模型,用于求解在新建路段的情况下,使得网络中任意5条路段出现突发事故时,网络中所有交通需求的期望可达率尽可能最大的问题。该模型可以通过贪心算法求解,并可以根据需要增加约束条件来进一步提高可达率。
在交通网络3中,各(起点,终点)对之间的交通需求见附件2,各路段的容量上限见附件3。请建立数学模型,给出新建路段方案,使得在新网络中任意5条路段出现突发事故时(每个路段出现突发状况概率相同),网络中所有交通需求的期望可达率最大,且交通需求分配到对应的路径后,各路段上的交通量不能超过路段容量。假设新修建的6条路段分别为 ( u 1 , v 1 ) , ( u 2 , v 2 ) , ( u 3 , v 3 ) , ( u 4 , v 4 ) , ( u 5 , v 5 ) , ( u 6 , v 6 ) (u_1, v_1), (u_2, v_2), (u_3, v_3), (u_4, v_4), (u_5, v_5), (u_6, v_6) (u1,v1),(u2,v2),(u3,v3),(u4,v4),(u5,v5),(u6,v6),其中 u i u_i ui和 v i v_i vi分别为新建路段的起点和终点, i = 1 , 2 , 3 , 4 , 5 , 6 i=1,2,3,4,5,6 i=1,2,3,4,5,6。
首先,定义决策变量 x i j x_{ij} xij表示从起点 i i i到终点 j j j的交通需求分配到新建路段的量,其中 i , j = 1 , 2 , 3 , 4 , 5 , 6 i,j=1,2,3,4,5,6 i,j=1,2,3,4,5,6。因此, x i j x_{ij} xij的取值范围为非负实数。
其次,定义决策变量 y i j k y_{ijk} yijk表示新建路段 k k k是否被选择,其中 i , j = 1 , 2 , 3 , 4 , 5 , 6 i,j=1,2,3,4,5,6 i,j=1,2,3,4,5,6, k = 1 , 2 , 3 , 4 , 5 , 6 k=1,2,3,4,5,6 k=1,2,3,4,5,6。因此, y i j k y_{ijk} yijk的取值范围为0或1。
接着,定义决策变量 z l z_{l} zl表示路段 l l l上的交通量,其中 l = 1 , 2 , . . . , 18 l=1,2,...,18 l=1,2,...,18。因此, z l z_{l} zl的取值范围为非负实数。
然后,根据题目要求,可以列出以下约束条件:
-
新建路段上的交通量不能超过容量上限,即
z 18 + i ≤ c 18 + i , i = 1 , 2 , 3 , 4 , 5 , 6 z_{18+i} \leq c_{18+i}, \quad i=1,2,3,4,5,6 z18+i≤c18+i,i=1,2,3,4,5,6
其中 c 18 + i c_{18+i} c18+i表示新建路段 i i i的容量上限。 -
新建路段的起点和终点必须是交通网络中的任意两个节点,即
∑ j = 1 6 y i j k = 1 , i = 1 , 2 , 3 , 4 , 5 , 6 ; k = 1 , 2 , 3 , 4 , 5 , 6 \sum_{j=1}^6 y_{ijk}=1, \quad i=1,2,3,4,5,6; k=1,2,3,4,5,6 j=1∑6yijk=1,i=1,2,3,4,5,6;k=1,2,3,4,5,6
∑ i = 1 6 y i j k = 1 , j = 1 , 2 , 3 , 4 , 5 , 6 ; k = 1 , 2 , 3 , 4 , 5 , 6 \sum_{i=1}^6 y_{ijk}=1, \quad j=1,2,3,4,5,6; k=1,2,3,4,5,6 i=1∑6yijk=1,j=1,2,3,4,5,6;k=1,2,3,4,5,6 -
新建路段不能跨越其他路段,只能在网络内部修建,即
x 18 + i , l = 0 , i = 1 , 2 , 3 , 4 , 5 , 6 ; l = 1 , 2 , . . . , 18 x_{18+i, l}=0, \quad i=1,2,3,4,5,6; l=1,2,...,18 x18+i,l=0,i=1,2,3,4,5,6;l=1,2,...,18
x l , 18 + i = 0 , i = 1 , 2 , 3 , 4 , 5 , 6 ; l = 1 , 2 , . . . , 18 x_{l, 18+i}=0, \quad i=1,2,3,4,5,6; l=1,2,...,18 xl,18+i=0,i=1,2,3,4,5,6;l=1,2,...,18 -
新建路段的交通量必须满足交通需求,即
∑ j = 1 6 x 18 + i , j = ∑ j = 1 6 x j , 18 + i , i = 1 , 2 , 3 , 4 , 5 , 6 \sum_{j=1}^6 x_{18+i,j}=\sum_{j=1}^6 x_{j,18+i}, \quad i=1,2,3,4,5,6 j=1∑6x18+i,j=j=1∑6xj,18+i,i=1,2,3,4,5,6 -
网络中任意5条路段出现突发事故时,交通需求的期望可达率最大,即
max ∑ i = 1 6 ∑ j = 1 6 x i j d i j \max \sum_{i=1}^6 \sum_{j=1}^6 \frac{x_{ij}}{d_{ij}} maxi=1∑6j=1∑6dijxij
其中 d i j d_{ij} dij表示从起点 i i i到终点 j j j的最短路径长度。 -
交通需求分配到对应的路径后,各路段上的交通量不能超过路段容量,即
∑ i = 1 6 ∑ j = 1 6 x i j ⋅ p i j l ≤ z l , l = 1 , 2 , . . . , 18 \sum_{i=1}^6 \sum_{j=1}^6 x_{ij} \cdot p_{ijl} \leq z_l, \quad l=1,2,...,18 i=1∑6j=1∑6xij⋅pijl≤zl,l=1,2,...,18
其中 p i j l p_{ijl} pijl为0-1变量,表示路段 l l l是否在从起点 i i i到终点 j j j的路径中。
最后,目标函数为使网络中所有交通需求的期望可达率最大,即
max
∑
i
=
1
6
∑
j
=
1
6
x
i
j
d
i
j
\max \sum_{i=1}^6 \sum_{j=1}^6 \frac{x_{ij}}{d_{ij}}
maxi=1∑6j=1∑6dijxij
因此,该问题可以建立如下数学模型:
max
∑
i
=
1
6
∑
j
=
1
6
x
i
j
d
i
j
s.t.
z
18
+
i
≤
c
18
+
i
,
i
=
1
,
2
,
3
,
4
,
5
,
6
∑
j
=
1
6
y
i
j
k
=
1
,
i
=
1
,
2
,
3
,
4
,
5
,
6
;
k
=
1
,
2
,
3
,
4
,
5
,
6
∑
i
=
1
6
y
i
j
k
=
1
,
j
=
1
,
2
,
3
,
4
,
5
,
6
;
k
=
1
,
2
,
3
,
4
,
5
,
6
x
18
+
i
,
l
=
0
,
i
=
1
,
2
,
3
,
4
,
5
,
6
;
l
=
1
,
2
,
.
.
.
,
18
x
l
,
18
+
i
=
0
,
i
=
1
,
2
,
3
,
4
,
5
,
6
;
l
=
1
,
2
,
.
.
.
,
18
∑
j
=
1
6
x
18
+
i
,
j
=
∑
j
=
1
6
x
j
,
18
+
i
,
i
=
1
,
2
,
3
,
4
,
5
,
6
∑
i
=
1
6
∑
j
=
1
6
x
i
j
⋅
p
i
j
l
≤
z
l
,
l
=
1
,
2
,
.
.
.
,
18
x
i
j
≥
0
,
i
,
j
=
1
,
2
,
3
,
4
,
5
,
6
y
i
j
k
∈
{
0
,
1
}
,
i
,
j
=
1
,
2
,
3
,
4
,
5
,
6
;
k
=
1
,
2
,
3
,
4
,
5
,
6
z
l
≥
0
,
l
=
1
,
2
,
.
.
.
,
18
p
i
j
l
∈
{
0
,
1
}
,
i
,
j
=
1
,
2
,
3
,
4
,
5
,
6
;
l
=
1
,
2
,
.
.
.
,
18
\begin{array}{cl} \max & \sum_{i=1}^6 \sum_{j=1}^6 \frac{x_{ij}}{d_{ij}} \\ \text{s.t.} & z_{18+i} \leq c_{18+i}, \quad i=1,2,3,4,5,6 \\ & \sum_{j=1}^6 y_{ijk}=1, \quad i=1,2,3,4,5,6; k=1,2,3,4,5,6 \\ & \sum_{i=1}^6 y_{ijk}=1, \quad j=1,2,3,4,5,6; k=1,2,3,4,5,6 \\ & x_{18+i, l}=0, \quad i=1,2,3,4,5,6; l=1,2,...,18 \\ & x_{l, 18+i}=0, \quad i=1,2,3,4,5,6; l=1,2,...,18 \\ & \sum_{j=1}^6 x_{18+i,j}=\sum_{j=1}^6 x_{j,18+i}, \quad i=1,2,3,4,5,6 \\ & \sum_{i=1}^6 \sum_{j=1}^6 x_{ij} \cdot p_{ijl} \leq z_l, \quad l=1,2,...,18 \\ & x_{ij} \geq 0, \quad i,j=1,2,3,4,5,6 \\ & y_{ijk} \in \{0,1\}, \quad i,j=1,2,3,4,5,6; k=1,2,3,4,5,6 \\ & z_{l} \geq 0, \quad l=1,2,...,18 \\ & p_{ijl} \in \{0,1\}, \quad i,j=1,2,3,4,5,6; l=1,2,...,18 \end{array}
maxs.t.∑i=16∑j=16dijxijz18+i≤c18+i,i=1,2,3,4,5,6∑j=16yijk=1,i=1,2,3,4,5,6;k=1,2,3,4,5,6∑i=16yijk=1,j=1,2,3,4,5,6;k=1,2,3,4,5,6x18+i,l=0,i=1,2,3,4,5,6;l=1,2,...,18xl,18+i=0,i=1,2,3,4,5,6;l=1,2,...,18∑j=16x18+i,j=∑j=16xj,18+i,i=1,2,3,4,5,6∑i=16∑j=16xij⋅pijl≤zl,l=1,2,...,18xij≥0,i,j=1,2,3,4,5,6yijk∈{0,1},i,j=1,2,3,4,5,6;k=1,2,3,4,5,6zl≥0,l=1,2,...,18pijl∈{0,1},i,j=1,2,3,4,5,6;l=1,2,...,18
其中, x i j x_{ij} xij表示从起点 i i i到终点 j j j的交通需求分配到新建路段的量, y i j k y_{ijk} yijk表示新建路段 k k k是否被选择, z l z_{l} zl表示路段 l l l上的交通量, p i j l p_{ijl} pijl为0-1变量,表示路段 l l l是否在从起点 i i i到终点 j j j的路径中。 d i j d_{ij} dij为从起点 i i i到终点 j j j的最短路径长度, c 18 + i c_{18+i} c18+i表示新建路段 i i i的容量上限。
#导入求解器
from pulp import *
#读取数据
demands = pd.read_excel('附件2.xlsx', sheet_name='需求量')
capacities = pd.read_excel('附件3.xlsx', sheet_name='容量上限')
#创建问题
prob = LpProblem("Network Optimization", LpMaximize)
#定义决策变量
#路径选择变量
x = LpVariable.dicts('x',[(i,j) for i in range(1,11) for j in range(1,11)], cat='Binary')
#交通量变量
f = LpVariable.dicts('f',[(i,j) for i in range(1,11) for j in range(1,11)], lowBound=0)
#新建路段选择变量
new_lanes = LpVariable.dicts('new_lane',[(i,j) for i in range(1,41) for j in range(1,41)], cat='Binary')
#新建路段交通量变量
new_f = LpVariable.dicts('new_f',[(i,j) for i in range(1,41) for j in range(1,41)], lowBound=0)
#定义目标函数
prob += lpSum([demands.iloc[i-1,j-1]*f[(i,j)] for i in range(1,11) for j in range(1,11)])
#定义约束条件
#起点和终点的流量平衡约束
for i in range(1,11):
prob += lpSum([f[(i,j)] for j in range(1,11)]) - lpSum([f[(j,i)] for j in range(1,11)]) == demands.iloc[i-1,10]
#路径选择变量与交通量之间的关系
for i in range(1,11):
for j in range(1,11):
prob += f[(i,j)] <= x[(i,j)]*capacities.iloc[i-1,j-1]
#新建路段选择变量与交通量之间的关系
for i in range(1,41):
for j in range(1,41):
prob += new_f[(i,j)] <= new_lanes[(i,j)]*1000 #假设新建路段的容量足够大
#起点和终点只能通过已有的路径或新建的路段
for i in range(1,11):
for j in range(1,11):
prob += lpSum([x[(i,k)] for k in range(1,11)]) + lpSum([new_lanes[(i,k)] for k in range(1,41)]) == 1
prob += lpSum([x[(k,j)] for k in range(1,11)]) + lpSum([new_lanes[(k,j)] for k in range(1,41)]) == 1
#限制新建路段只能在网络内部建设
for i in range(1,41):
for j in range(1,41):
prob += new_lanes[(i,j)] == 0 #假设新建路段只能在网络内部建设,即新建路段起点和终点必须是交通网络中的节点
#限制新建路段的数量
prob += lpSum([new_lanes[(i,j)] for i in range(1,41) for j in range(1,41)]) == 6 #假设新建路段的数量为6
#求解问题
prob.solve()
#输出结果
print("Status:", LpStatus[prob.status])
for v in prob.variables():
print(v.name, "=", v.varValue)
print("Total Expected Reachability =", value(prob.objective))
第四个问题是在交通网络3中新修建6条路段的方案,使得在新网络中任意5条路段出现突发事故时,网络中所有交通需求的期望可达率最大,且交通需求分配到对应的路径后,各路段上的交通量不能超过路段容量。
假设新建的6条路段分别为:(节点a,节点b),(节点c,节点d),(节点e,节点f),(节点g,节点h),(节点i,节点j),(节点k,节点l)。其中,节点a至节点l为交通网络3中的任意两个节点。
令参数:
N N N为交通网络中的节点总数;
M M M为交通网络中原有的路段总数,也即路段容量上限的个数;
D i j D_{ij} Dij为从节点 i i i到节点 j j j的交通需求量;
C i j C_{ij} Cij为从节点 i i i到节点 j j j的交通需求规划的路径;
F i j F_{ij} Fij为从节点 i i i到节点 j j j的交通需求分配的交通量;
P i j P_{ij} Pij为从节点 i i i到节点 j j j的交通需求分配的路径的可达率;
G i j G_{ij} Gij为从节点 i i i到节点 j j j的新建路段的容量;
T i j T_{ij} Tij为从节点 i i i到节点 j j j的新建路段的交通量。
则原交通网络的每条路段的交通量可以表示为:
F i j = ∑ p = 1 M D i j P i j p F_{ij} = \sum_{p=1}^{M}D_{ij}P_{ijp} Fij=∑p=1MDijPijp
其中, P i j p P_{ijp} Pijp为从节点 i i i到节点 j j j的第 p p p条路径的可达率。
假设新建的6条路段的交通量分别为:
T a b , T c d , T e f , T g h , T i j , T k l T_{ab},T_{cd},T_{ef},T_{gh},T_{ij},T_{kl} Tab,Tcd,Tef,Tgh,Tij,Tkl
则新网络中任意5条路段出现突发事故时,交通需求的期望可达率最大,可以表示为:
m a x { ∑ i = 1 N ∑ j = 1 N ∑ p = 1 M D i j P i j p ∑ i = 1 N ∑ j = 1 N ∑ p = 1 M D i j } max\{\frac{\sum_{i=1}^{N}\sum_{j=1}^{N}\sum_{p=1}^{M}D_{ij}P_{ijp}}{\sum_{i=1}^{N}\sum_{j=1}^{N}\sum_{p=1}^{M}D_{ij}}\} max{∑i=1N∑j=1N∑p=1MDij∑i=1N∑j=1N∑p=1MDijPijp}
受新建路段容量限制的约束条件为:
F i j + T a b + T c d + T e f + T g h + T i j + T k l ≤ G i j F_{ij}+T_{ab}+T_{cd}+T_{ef}+T_{gh}+T_{ij}+T_{kl} \leq G_{ij} Fij+Tab+Tcd+Tef+Tgh+Tij+Tkl≤Gij
因此,第四个问题可以建立如下数学模型:
m a x { ∑ i = 1 N ∑ j = 1 N ∑ p = 1 M D i j P i j p ∑ i = 1 N ∑ j = 1 N ∑ p = 1 M D i j } max\{\frac{\sum_{i=1}^{N}\sum_{j=1}^{N}\sum_{p=1}^{M}D_{ij}P_{ijp}}{\sum_{i=1}^{N}\sum_{j=1}^{N}\sum_{p=1}^{M}D_{ij}}\} max{∑i=1N∑j=1N∑p=1MDij∑i=1N∑j=1N∑p=1MDijPijp}
s u b j e c t t o subject\ to subject to
F i j = ∑ p = 1 M D i j P i j p F_{ij} = \sum_{p=1}^{M}D_{ij}P_{ijp} Fij=∑p=1MDijPijp
F i j + T a b + T c d + T e f + T g h + T i j + T k l ≤ G i j F_{ij}+T_{ab}+T_{cd}+T_{ef}+T_{gh}+T_{ij}+T_{kl} \leq G_{ij} Fij+Tab+Tcd+Tef+Tgh+Tij+Tkl≤Gij
T a b , T c d , T e f , T g h , T i j , T k l ≥ 0 T_{ab},T_{cd},T_{ef},T_{gh},T_{ij},T_{kl} \geq 0 Tab,Tcd,Tef,Tgh,Tij,Tkl≥0
假设新建的6条路段分别为路段1、路段2、路段3、路段4、路段5、路段6,容量分别为 c 1 c_1 c1、 c 2 c_2 c2、 c 3 c_3 c3、 c 4 c_4 c4、 c 5 c_5 c5、 c 6 c_6 c6。
根据题目要求,新建路段不能跨越其他路段,只能在网络内部修建,且新建路段的容量足够大,即容量 c i c_i ci大于任意路段的交通需求量 d d d。
假设在新建路段的方案中,每条新建路段的起点和终点分别为节点 i i i和节点 j j j,则新建路段的容量 c i j c_{ij} cij可以表示为:
c i j = c i + c j c_{ij} = c_i + c_j cij=ci+cj
其中 c i c_i ci和 c j c_j cj分别为节点 i i i和节点 j j j的容量。为了使得网络中任意5条路段出现突发事故时,网络中所有交通需求的期望可达率最大,我们需要找出一种最优的新建路段方案,使得网络中的期望可达率最大。
假设网络中的总路段数为 n n n,则任意5条路段出现突发事故的概率为:
P = 5 n P = \frac{5}{n} P=n5
则网络中所有交通需求的期望可达率为:
R = 1 − P = 1 − 5 n R = 1 - P = 1 - \frac{5}{n} R=1−P=1−n5
为了使得期望可达率最大,我们需要最小化
5
n
\frac{5}{n}
n5,即使得网络中的总路段数尽可能的小。
根据题目要求,新建路段的起点和终点必须是交通网络中的任意两个节点,且不能跨越其他路段,只能在网络内部修建。假设网络中的节点数为 m m m,则不考虑新建路段的情况下,网络中最多可以存在的路段数为 C m 2 = m × ( m − 1 ) 2 C_m^2 = \frac{m\times(m-1)}{2} Cm2=2m×(m−1)。
为了使得网络中的总路段数尽可能地小,我们可以将新建路段的起点和终点设置为网络中相邻的节点,即节点 i i i和节点 i + 1 i+1 i+1,则新建路段的个数最多可以达到 m − 1 m-1 m−1条。
因此,为了使得期望可达率最大,需要满足以下条件:
m − 1 = n ⇒ m = n + 1 m - 1 = n \Rightarrow m = n + 1 m−1=n⇒m=n+1
也就是说,为了使得期望可达率最大,需要在网络中增加1个节点。新增的节点可以作为新建路段的起点和终点,从而实现最优的新建路段方案,使得网络中所有交通需求的期望可达率最大。
因此,我们可以得出结论:在交通网络3中新修建6条路段的最优方案为在网络中增加1个节点,并将该节点作为新建路段的起点和终点,从而使得网络中所有交通需求的期望可达率最大,且交通需求分配到对应的路径后,各路段上的交通量不能超过路段容量。
假设新建路段的起点和终点分别为节点 i i i和节点 j j j,则新建路段的容量为 C i j C_{ij} Cij。令 N N N为交通网络中的节点数, M M M为路段数, G G G为邻接矩阵,其中 G i j G_{ij} Gij表示节点 i i i和节点 j j j之间的路段数目。
首先,建立一个
N
×
N
N \times N
N×N的决策变量矩阵
X
X
X,其中
X
i
j
X_{ij}
Xij表示从节点
i
i
i到节点
j
j
j的路径是否经过新建路段,即:
X
i
j
=
{
1
,
路径经过新建路段
0
,
路径不经过新建路段
X_{ij} = \begin{cases} 1, & \text{路径经过新建路段} \\ 0, & \text{路径不经过新建路段} \end{cases}
Xij={1,0,路径经过新建路段路径不经过新建路段
其次,建立一个
N
×
N
N \times N
N×N的交通量矩阵
F
F
F,其中
F
i
j
F_{ij}
Fij表示从节点
i
i
i到节点
j
j
j的交通量,根据题目要求,我们需要最大化期望可达率,即最大化所有交通需求的期望可达率,可以表示为:
max
∑
i
=
1
N
∑
j
=
1
N
p
i
j
F
i
j
D
i
j
\max \sum_{i=1}^{N} \sum_{j=1}^{N} p_{ij} \frac{F_{ij}}{D_{ij}}
maxi=1∑Nj=1∑NpijDijFij
其中
p
i
j
p_{ij}
pij为从起点
i
i
i到终点
j
j
j的交通需求量,
D
i
j
D_{ij}
Dij为从起点
i
i
i到终点
j
j
j的交通需求总量。
同时,根据题目要求,交通需求分配到对应的路径后,各路段上的交通量不能超过路段容量,可以表示为:
F
i
j
≤
C
i
j
F_{ij} \leq C_{ij}
Fij≤Cij
另外,根据题目要求,所有交通需求的期望可达率最大,即可达率的期望最大,可以表示为:
max
E
=
∑
i
=
1
N
∑
j
=
1
N
p
i
j
F
i
j
D
i
j
\max E = \sum_{i=1}^{N} \sum_{j=1}^{N} p_{ij} \frac{F_{ij}}{D_{ij}}
maxE=i=1∑Nj=1∑NpijDijFij
综上,可以建立如下数学模型:
max
E
=
∑
i
=
1
N
∑
j
=
1
N
p
i
j
F
i
j
D
i
j
s.t.
X
i
j
∈
{
0
,
1
}
,
i
,
j
=
1
,
2
,
…
,
N
F
i
j
≤
C
i
j
,
i
,
j
=
1
,
2
,
…
,
N
F
i
j
=
∑
k
=
1
M
X
i
k
p
k
j
,
i
,
j
=
1
,
2
,
…
,
N
∑
i
=
1
N
X
i
j
=
1
,
j
=
1
,
2
,
…
,
N
∑
j
=
1
N
X
i
j
=
1
,
i
=
1
,
2
,
…
,
N
\begin{aligned} \max \quad & E = \sum_{i=1}^{N} \sum_{j=1}^{N} p_{ij} \frac{F_{ij}}{D_{ij}} \\ \text{s.t.} \quad & X_{ij} \in \{0, 1\}, \quad i,j=1,2,\ldots,N \\ & F_{ij} \leq C_{ij}, \quad i,j=1,2,\ldots,N \\ & F_{ij} = \sum_{k=1}^{M} X_{ik} p_{kj}, \quad i,j=1,2,\ldots,N \\ & \sum_{i=1}^{N} X_{ij} = 1, \quad j=1,2,\ldots,N \\ & \sum_{j=1}^{N} X_{ij} = 1, \quad i=1,2,\ldots,N \end{aligned}
maxs.t.E=i=1∑Nj=1∑NpijDijFijXij∈{0,1},i,j=1,2,…,NFij≤Cij,i,j=1,2,…,NFij=k=1∑MXikpkj,i,j=1,2,…,Ni=1∑NXij=1,j=1,2,…,Nj=1∑NXij=1,i=1,2,…,N
其中, X i j X_{ij} Xij表示从起点 i i i到终点 j j j的路径是否经过新建路段, F i j F_{ij} Fij表示从起点 i i i到终点 j j j的交通量, p i j p_{ij} pij为从起点 i i i到终点 j j j的交通需求量, D i j D_{ij} Dij为从起点 i i i到终点 j j j的交通需求总量, C i j C_{ij} Cij为从节点 i i i到节点 j j j的新建路段容量。
最后,通过求解以上数学模型,可以得到最优的新建路段方案,使得在新网络中任意5条路段出现突发事故时,网络中所有交通需求的期望可达率最大,且交通需求分配到对应的路径后,各路段上的交通量不能超过路段容量。
由于此问题涉及到网络最大流问题,可以使用Python中的NetworkX库来解决。具体步骤如下:
Step 1:导入所需的库
首先,需要导入NetworkX库来构建交通网络,导入copy库来复制数据,导入numpy库来处理数据,导入random库来生成随机数。
import networkx as nx
import copy
import numpy as np
import random
Step 2:构建交通网络
根据附件2和附件3中提供的数据,可以构建一个有向图,其中节点表示交通网络中的路口,边表示道路,边的权重表示道路的容量。同时,节点的属性中可以存储每个路口的可达率,边的属性中可以存储每条道路的交通量。
# 创建一个有向图
G = nx.DiGraph()
# 为图中的每个节点添加属性,属性值为可达率
for i in range(1, 41):
G.add_node(i, probability=1.0)
# 为图中的每条边添加属性,属性值为道路容量
G.add_edge(1, 2, capacity=2)
G.add_edge(1, 3, capacity=5)
G.add_edge(2, 4, capacity=3)
G.add_edge(3, 4, capacity=3)
G.add_edge(2, 5, capacity=4)
G.add_edge(3, 6, capacity=2)
G.add_edge(4, 5, capacity=5)
G.add_edge(4, 6, capacity=6)
G.add_edge(5, 7, capacity=4)
G.add_edge(6, 7, capacity=3)
G.add_edge(5, 8, capacity=5)
G.add_edge(6, 9, capacity=4)
G.add_edge(7, 8, capacity=5)
G.add_edge(7, 9, capacity=3)
G.add_edge(8, 10, capacity=5)
G.add_edge(9, 10, capacity=4)
G.add_edge(8, 11, capacity=2)
G.add_edge(9, 12, capacity=3)
G.add_edge(10, 11, capacity=4)
G.add_edge(10, 12, capacity=4)
G.add_edge(11, 13, capacity=3)
G.add_edge(12, 13, capacity=2)
G.add_edge(11, 14, capacity=5)
G.add_edge(12, 15, capacity=3)
G.add_edge(13, 14, capacity=4)
G.add_edge(13, 15, capacity=2)
G.add_edge(14, 16, capacity=2)
G.add_edge(15, 16, capacity=3)
G.add_edge(14, 17, capacity=4)
G.add_edge(15, 18, capacity=3)
Step 3:计算每条道路的可达率
根据附件1中提供的数据,可以计算出每条道路的可达率,具体方法如下:
# 读取附件1中的数据
with open('附件1.txt', 'r') as f:
data = f.readlines()
# 将数据转换为列表
data = [i.strip().split(',') for i in data]
# 计算每条道路的可达率
for i in range(len(data)):
start, end, demand = data[i][0], data[i][1], int(data[i][2])
# 获取从起点到终点的所有路径
paths = list(nx.all_simple_paths(G, start, end, cutoff=5))
# 计算所有路径的总长度
total_length = sum([len(path)-1 for path in paths])
# 根据路径长度和交通需求计算可达率
for path in paths:
length = len(path) - 1
path_probability = demand * (length/total_length)
# 将可达率分配给每条道路
for j in range(length):
G[path[j]][path[j+1]]['probability'] += path_probability
Step 4:构建新的交通网络
在新的交通网络中,需要包含原交通网络的所有节点和边,同时还需要添加6条新的路段,其中新路段的起点和终点可以随机生成。
# 复制原交通网络
G_new = copy.deepcopy(G)
# 设置新路段的起点和终点
start_nodes = [random.randint(1, 40) for i in range(6)]
end_nodes = [random.randint(1, 40) for i in range(6)]
# 添加新路段
for i in range(6):
G_new.add_edge(start_nodes[i], end_nodes[i], capacity=100)
Step 5:计算新网络中任意5条路段出现突发事故时的可达率
首先,需要生成任意5条路段出现突发事故的情况,然后根据新的交通网络计算可达率。
# 生成任意5条路段出现突发事故的情况
accidents = []
for i in range(5):
accidents.append(random.choice(list(G_new.edges())))
# 计算可达率
total_probability = 0
for i in range(len(data)):
start, end, demand = data[i][0], data[i][1], int(data[i][2])
# 获取从起点到终点的所有路径
paths = list(nx.all_simple_paths(G_new, start, end, cutoff=5))
# 计算所有路径的总长度
total_length = sum([len(path)-1 for path in paths])
# 根据路径长度和交通需求计算可达率
for path in paths:
length = len(path) - 1
path_probability = demand * (length/total_length)
# 如果路径中包含突发事故的路段,则可达率为0
for accident in accidents:
if accident in zip(path[:-1], path[1:]):
path_probability = 0
break
# 将可达率累加到总可达率
total_probability += path_probability
# 计算期望可达率
expected_probability = total_probability/len(data)
Step 6:构建新建路段方案
根据前面计算的期望可达率,可以构建新建路段方案。
# 创建一个列表来存储所有方案
solutions = []
# 设置方案数量
num_solutions = 5
更多内容具体可以看看我的下方名片!里面包含有华中杯一手资料与分析!
另外在赛中,我们也会陪大家一起解析华中杯的一些方向
关注 CS数模 团队,数模不迷路~