2024年第二十一届 五一杯 (B题)大学生数学建模挑战赛|流网络,路径规划|数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为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 ij的容量

p i j p_{ij} pij 为路段 i − j i-j ij发生突发状况的概率

l i j l_{ij} lij 为路径 i − j i-j ij的长度

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,jdiji,jdijxij

约束条件:

  1. 每个(起点,终点)对之间的交通需求量应满足需求量不变的条件:

\begin{equation}
\sum_{i}d_{ij}=\sum_{j}d_{ij}
\end{equation}

  1. 每个(起点,终点)对之间的交通需求应该被分配到对应的路径上:
    ∑ j x i j = 1 , ∀ i ≠ j \begin{equation} \sum_{j}x_{ij}=1, \forall i \neq j \end{equation} jxij=1,i=j
    ∑ i x i j = 1 , ∀ i ≠ j \begin{equation} \sum_{i}x_{ij}=1, \forall i \neq j \end{equation} ixij=1,i=j

  2. 所有路径的交通量不能超过路段容量:
    ∑ 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,jdijxijcij,i,j

  3. 路段 i − j i-j ij的交通量等于经过该路段的路径交通量之和:
    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,jdijxij,i,j

  4. 路段 i − j i-j ij的交通量不能超过路段容量:
    d i j ≤ c i j , ∀ i , j \begin{equation} d_{ij} \leq c_{ij}, \forall i,j \end{equation} dijcij,i,j

  5. 路段 i − j i-j ij的可达率为:
    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

  6. 当路段 i − j i-j ij发生突发状况时,对应的可达率为:
    R i j ′ = R i j ⋅ ( 1 − p i j ) \begin{equation} R_{ij}' = R_{ij} \cdot (1-p_{ij}) \end{equation} Rij=Rij(1pij)
    最终的目标函数为:
    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,jdiji,jdijxiji,j(1pij)

综上所述,问题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条路径的交通需求。

根据题意,我们可以得到以下约束条件:

  1. 每个(起点,终点)对中的交通需求必须满足,即∑(j=1,m(i))X(i,j)=D(i),其中,D(i)为第i个(起点,终点)对的交通需求。

  2. 每条路段上的交通量必须小于等于该路段的容量上限,即∑(i=1,n)∑(j=1,m(i))x(i,j,k)≤C(k),其中,C(k)为第k个路段的容量上限。

  3. 每个(起点,终点)对中的交通量必须满足,即∑(k=1,N(i,j))x(i,j,k)=X(i,j),其中,X(i,j)为第i个(起点,终点)对分配到第j条路径上的交通量。

  4. 如果发生突发状况的路段不在第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)

满足约束条件:

  1. ∑(j=1,m(i))X(i,j)=D(i),∀i=1,2,…,n

  2. ∑(i=1,n)∑(j=1,m(i))x(i,j,k)≤C(k),∀k=1,2,…,N(i,j)

  3. ∑(k=1,N(i,j))x(i,j,k)=X(i,j),∀i=1,2,…,n,∀j=1,2,…,m(i)

  4. 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)pPfpdij

其中, P P P 为所有可能的路径集合。

约束条件包括:

  1. 每个(起点,终点)对之间的交通需求分配量等于该对之间的交通需求量:

∑ 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=ixijj:sj=ixji=dij,i{1,2,,n}

  1. 每条路段的交通量不超过其容量:

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\} fpcj,pP,j{1,2,,m}

  1. 路段的交通量与出现突发状况的决策变量之间的关系:

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(1yj)cj,pP,j{1,2,,m}

  1. 突发状况决策变量 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)pPfpdijj:tj=ixijj:sj=ixji=dij,i{1,2,,n}fpcj,pP,j{1,2,,m}fp(1yj)cj,pP,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=1nj=1nd(i,j)k=1mx(k)y(i,j,k)s.t.i=1nj=1ny(i,j,k)=1,k=1,2,3,,mk=1my(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)vV}{(v,t)vV}。图 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的交通流量。则有约束条件:

  1. 每条路径的交通流量不超过其容量上限:
    x i ≤ c i , i = 1 , 2 , . . . , l x_i \leq c_i, i=1,2,...,l xici,i=1,2,...,l

  2. 每个(起点,终点)对之间的交通需求满足:
    ∑ 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=1lxi=dij,i=1,2,...,m;j=1,2,...,n

  3. 交通流量必须为非负实数:
    x i ≥ 0 , i = 1 , 2 , . . . , l x_i \geq 0, i=1,2,...,l xi0,i=1,2,...,l

  4. 交通需求分配到的路径数不超过5:
    ∑ i = 1 l x i ≤ 5 \sum_{i=1}^l x_i \leq 5 i=1lxi5
    其次,建立可达率模型。定义每条路径的可达率为r_i, 其中r_i表示经过路径i的可达率。则有约束条件:

  5. 可达率为交通需求分配到对应路径的交通量占总交通需求量的比例:
    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

  6. 可达率必须为非负实数:
    r i ≥ 0 , i = 1 , 2 , . . . , l r_i \geq 0, i=1,2,...,l ri0,i=1,2,...,l
    最后,建立目标函数。由于要使得网络中任意5条路段出现突发状况时,所有交通需求的期望可达率最大,因此可达率的期望值应该最大。定义目标函数为:
    m a x ∑ i = 1 l r i max \sum_{i=1}^l r_i maxi=1lri
    综上所述,可以得到如下线性规划模型:
    m a x ∑ i = 1 l x i d i j max \sum_{i=1}^l \frac{x_i}{d_{ij}} maxi=1ldijxi
    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=1lxici,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=1lxi=dij,i=1,2,...,m;j=1,2,...,n
    ∑ i = 1 l x i ≤ 5 \sum_{i=1}^l x_i \leq 5 i=1lxi5
    x i ≥ 0 , i = 1 , 2 , . . . , l x_i \geq 0, i=1,2,...,l xi0,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 ri0,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。则交通需求分配到对应路径上的交通量满足以下约束条件:

  1. 交通需求满足约束:
    ∑(i,j)∈dij=∑e∈E∪E’xe
  2. 路段交通量不超过容量上限:
    ∀e∈E∪E’,xe≤ce
    ∀e’∈E’,x’e≤c’e
  3. 新建路段交通量为0或者正数:
    ∀e’∈E’,x’e≥0
  4. 交通需求分配比例为正数:
    ∀(i,j)∈dij,∀e∈E∪E’,xe>0
  5. 交通需求满足路径选择约束:
    ∀(i,j)∈dij,∑e∈E∪E’,xe=∑e∈E∪E’x’e
  6. 新建路段交通量不超过新建路段容量上限:
    ∀e’∈E’,x’e≤c’e
  7. 期望可达率最大:
    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,viV

首先,将原网络和新建的路段合并为新的网络 G ′ = ( V , E ∪ E ′ ) G'=(V, E \cup E') G=(V,EE)。为了使得网络中任意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)Dds,tfs,t pPs,txp=1,(s,t)DpPu,vxp1,(u,v)EEpPu,vxpcu,v,(u,v)Exp0,pPu,v,(u,v)EE

其中, 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,tfs,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的取值范围为非负实数。

然后,根据题目要求,可以列出以下约束条件:

  1. 新建路段上的交通量不能超过容量上限,即
    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+ic18+i,i=1,2,3,4,5,6
    其中 c 18 + i c_{18+i} c18+i表示新建路段 i i i的容量上限。

  2. 新建路段的起点和终点必须是交通网络中的任意两个节点,即
    ∑ 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=16yijk=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=16yijk=1,j=1,2,3,4,5,6;k=1,2,3,4,5,6

  3. 新建路段不能跨越其他路段,只能在网络内部修建,即
    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

  4. 新建路段的交通量必须满足交通需求,即
    ∑ 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=16x18+i,j=j=16xj,18+i,i=1,2,3,4,5,6

  5. 网络中任意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=16j=16dijxij
    其中 d i j d_{ij} dij表示从起点 i i i到终点 j j j的最短路径长度。

  6. 交通需求分配到对应的路径后,各路段上的交通量不能超过路段容量,即
    ∑ 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=16j=16xijpijlzl,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=16j=16dijxij

因此,该问题可以建立如下数学模型:
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=16j=16dijxijz18+ic18+i,i=1,2,3,4,5,6j=16yijk=1,i=1,2,3,4,5,6;k=1,2,3,4,5,6i=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,...,18j=16x18+i,j=j=16xj,18+i,i=1,2,3,4,5,6i=16j=16xijpijlzl,l=1,2,...,18xij0,i,j=1,2,3,4,5,6yijk{0,1},i,j=1,2,3,4,5,6;k=1,2,3,4,5,6zl0,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=1Nj=1Np=1MDiji=1Nj=1Np=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+TklGij

因此,第四个问题可以建立如下数学模型:

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=1Nj=1Np=1MDiji=1Nj=1Np=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+TklGij

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,Tkl0

假设新建的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=1P=1n5

为了使得期望可达率最大,我们需要最小化 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×(m1)

为了使得网络中的总路段数尽可能地小,我们可以将新建路段的起点和终点设置为网络中相邻的节点,即节点 i i i和节点 i + 1 i+1 i+1,则新建路段的个数最多可以达到 m − 1 m-1 m1条。

因此,为了使得期望可达率最大,需要满足以下条件:

m − 1 = n ⇒ m = n + 1 m - 1 = n \Rightarrow m = n + 1 m1=nm=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=1Nj=1NpijDijFij
其中 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} FijCij

另外,根据题目要求,所有交通需求的期望可达率最大,即可达率的期望最大,可以表示为:
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=1Nj=1NpijDijFij

综上,可以建立如下数学模型:
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=1Nj=1NpijDijFijXij{0,1},i,j=1,2,,NFijCij,i,j=1,2,,NFij=k=1MXikpkj,i,j=1,2,,Ni=1NXij=1,j=1,2,,Nj=1NXij=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数模 团队,数模不迷路~

  • 9
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2023 第八届数维杯大学生数学建模挑战赛b要求我们通过建立数学模型来解决问。在解答这道之前,我们首先需要理解目的要求和条件。 经过分析目内容,我们可以得知该要求我们确定三幅相互切线连接的圆的半径和切点位置。首先,我们可以通过计算出三个切点的坐标来确定切点位置。可以利用已知条件,使用平行四边形法则,得到切点的坐标。然后,我们可以根据切点坐标计算出三个圆之间的距离,从而求出圆的半径。 为了建立数学模型解决问,我们可以做如下步骤: 第一步,确定切点坐标:根据已知条件,计算出三个切点的坐标。假设三个切点坐标分别为A(x1, y1),B(x2, y2),C(x3, y3)。 第二步,计算圆心坐标:利用平行四边形法则,根据已知的切点坐标可以求得三个圆心的坐标。令圆心坐标分别为O1(xo1, yo1),O2(xo2, yo2),O3(xo3, yo3)。 第三步,计算半径:利用已知的切点和圆心坐标,可以计算出三幅圆之间的距离。令圆的半径分别为r1,r2,r3。 最后,我们可以将以上三步整合在一起,建立数学模型来解决问。运用相关的几何原理和计算方法,可以计算出目要求的圆的半径和切点位置。 总的来说,通过建立数学模型,可以解决2023 第八届数维杯大学生数学建模挑战赛b。我们可以分步骤确定切点坐标和圆心坐标,进而计算出圆的半径。这样,我们就能够满足目的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值