2024年第二十一届 五一杯 (B题)大学生数学建模挑战赛 | 最大流问题,深度学习分析 | 数学建模完整代码解析

DeepVisionary 每日深度学习前沿科技推送&顶会论文&数学建模与科技信息前沿资讯分享,与你一起了解前沿科技知识!

本次DeepVisionary带来的是五一杯的详细解读:

完整内容可以在文章末尾全文免费领取&阅读!

在这里插入图片描述

第一个问题是建立数学模型,给出各(起点,终点)对之间交通需求分配到对应路径上的交通量,使得网络中任意1条路段出现突发状况时,网络中所有交通需求的期望可达率最大。

首先,我们需要定义一些变量来表示问题中的数据:

D i j D_{ij} Dij:表示从起点i到终点j的交通需求量。
p i j p_{ij} pij:表示从起点i到终点j的交通需求分配到的路径数。
r i j r_{ij} rij:表示从起点i到终点j的交通需求可达率。
F i j F_{ij} Fij:表示从起点i到终点j的交通需求分配到的路径上的交通量。
E E E:表示网络中任意一条路段出现突发状况的概率。

根据题目中的要求,我们需要最大化网络中所有交通需求的期望可达率。因此,我们可以建立如下的目标函数:

m a x ∑ i = 1 n ∑ j = 1 n r i j D i j max \quad \sum_{i=1}^{n} \sum_{j=1}^{n} r_{ij} D_{ij} maxi=1nj=1nrijDij

接下来,我们需要考虑一些约束条件:
每个(起点,终点)对之间的交通需求量必须被分配到对应的路径上,即:
∑ k = 1 p i j F i j ( k ) = D i j ∀ i , j \sum_{k=1}^{p_{ij}} F_{ij}^{(k)} = D_{ij} \quad \forall i,j k=1pijFij(k)=Diji,j
其中, F i j ( k ) F_{ij}^{(k)} Fij(k)表示从起点i到终点j的交通需求分配到的第k条路径上的交通量。
任意一条路段出现突发状况时,网络中所有交通需求的期望可达率必须大于等于一定的值,即:
∑ i = 1 n ∑ j = 1 n r i j F i j ( k ) ≥ E ∀ k \sum_{i=1}^{n} \sum_{j=1}^{n} r_{ij} F_{ij}^{(k)} \geq E \quad \forall k i=1nj=1nrijFij(k)Ek
其中, F i j ( k ) F_{ij}^{(k)} Fij(k)表示从起点i到终点j的交通需求分配到的第k条路径上的交通量。
交通需求可达率必须在0到1之间:
0 ≤ r i j ≤ 1 ∀ i , j 0 \leq r_{ij} \leq 1 \quad \forall i,j 0rij1i,j
\end{itemize}

综上所述,第一个问题的数学模型可以表示为:

m a x ∑ i = 1 n ∑ j = 1 n r i j D i j max \quad \sum_{i=1}^{n} \sum_{j=1}^{n} r_{ij} D_{ij} maxi=1nj=1nrijDij

s . t . ∑ k = 1 p i j F i j ( k ) = D i j ∀ i , j s.t. \quad \sum_{k=1}^{p_{ij}} F_{ij}^{(k)} = D_{ij} \quad \forall i,j s.t.k=1pijFij(k)=Diji,j

∑ i = 1 n ∑ j = 1 n r i j F i j ( k ) ≥ E ∀ k \sum_{i=1}^{n} \sum_{j=1}^{n} r_{ij} F_{ij}^{(k)} \geq E \quad \forall k i=1nj=1nrijFij(k)Ek

0 ≤ r i j ≤ 1 ∀ i , j 0 \leq r_{ij} \leq 1 \quad \forall i,j 0rij1i,j

其中,n表示网络中的节点数, p i j p_{ij} pij表示从起点i到终点j的路径数。

假设交通网络中有N个节点,M条路段,每个(起点,终点)对之间的交通需求为D(i,j),其中i,j为节点编号,表示从节点i出发到节点j的交通需求量。假设网络中的所有路段都有容量限制,即每条路段的最大承载量为C(k),其中k为路段编号。

首先,定义决策变量x(i,j,t)表示从节点i到节点j的交通需求在时刻t分配到的路径,取值为0或1。即当x(i,j,t)=1时,表示交通需求从节点i出发到节点j的路径为t,当x(i,j,t)=0时,表示交通需求没有分配到路径t。同时,定义y(k,t)表示在时刻t,路段k的状态,取值为0或1。当y(k,t)=1时,表示路段k在时刻t发生了突发状况,当y(k,t)=0时,表示路段k在时刻t没有发生突发状况。

根据题目要求,可以得到目标函数为最大化网络中所有交通需求的期望可达率,即:

m a x Σ Σ Σ D ( i , j ) ∗ x ( i , j , t ) max ΣΣΣD(i,j) * x(i,j,t) maxΣΣΣD(i,j)x(i,j,t)

其中,i,j为节点编号,t为路径编号。

同时,需要满足以下约束条件:

  1. 每个交通需求只能分配到一条路径,即:

Σ x ( i , j , t ) = 1 Σx(i,j,t) = 1 Σx(i,j,t)=1,其中t为路径编号。

  1. 路段容量限制,即:

Σ Σ x ( i , j , t ) ≤ C ( k ) ΣΣx(i,j,t) ≤ C(k) ΣΣx(i,j,t)C(k),其中t为路径编号,i,j为节点编号,k为路段编号。

  1. 路段状态与路径分配的关系,即:

y ( k , t ) ≤ Σ x ( i , j , t ) y(k,t) ≤ Σx(i,j,t) y(k,t)Σx(i,j,t),其中t为路径编号,i,j为节点编号,k为路段编号。

  1. 路段状态与路段突发状况的关系,即:

y ( k , t ) ≤ y ( k , t − 1 ) + y ( k , t + 1 ) y(k,t) ≤ y(k,t-1) + y(k,t+1) y(k,t)y(k,t1)+y(k,t+1),其中t为时刻,k为路段编号。

  1. 路段突发状况的概率相同,即:

P ( y ( k , t ) = 1 ) = P ( y ( k , t − 1 ) = 1 ) = P ( y ( k , t + 1 ) = 1 ) P(y(k,t)=1) = P(y(k,t-1)=1) = P(y(k,t+1)=1) P(y(k,t)=1)=P(y(k,t1)=1)=P(y(k,t+1)=1),其中t为时刻,k为路段编号。

  1. 每个起点到终点的交通需求都必须满足可达率要求,即:

Σ x ( i , j , t ) ≥ D ( i , j ) ∗ R Σx(i,j,t) ≥ D(i,j) * R Σx(i,j,t)D(i,j)R,其中t为路径编号,i,j为起点和终点编号,R为可达率。

综上所述,可以建立如下数学模型:

m a x Σ Σ Σ D ( i , j ) ∗ x ( i , j , t ) max ΣΣΣD(i,j) * x(i,j,t) maxΣΣΣD(i,j)x(i,j,t)

s.t.

Σ x ( i , j , t ) = 1 Σx(i,j,t) = 1 Σx(i,j,t)=1,i,j为节点编号,t为路径编号。

Σ Σ x ( i , j , t ) ≤ C ( k ) ΣΣx(i,j,t) ≤ C(k) ΣΣx(i,j,t)C(k),t为路径编号,i,j为节点编号,k为路段编号。

y ( k , t ) ≤ Σ x ( i , j , t ) y(k,t) ≤ Σx(i,j,t) y(k,t)Σx(i,j,t),t为路径编号,i,j为节点编号,k为路段编号。

y ( k , t ) ≤ y ( k , t − 1 ) + y ( k , t + 1 ) y(k,t) ≤ y(k,t-1) + y(k,t+1) y(k,t)y(k,t1)+y(k,t+1),t为时刻,k为路段编号。

P ( y ( k , t ) = 1 ) = P ( y ( k , t − 1 ) = 1 ) = P ( y ( k , t + 1 ) = 1 ) P(y(k,t)=1) = P(y(k,t-1)=1) = P(y(k,t+1)=1) P(y(k,t)=1)=P(y(k,t1)=1)=P(y(k,t+1)=1),t为时刻,k为路段编号。

Σ x ( i , j , t ) ≥ D ( i , j ) ∗ R Σx(i,j,t) ≥ D(i,j) * R Σx(i,j,t)D(i,j)R,t为路径编号,i,j为起点和终点编号,R为可达率。

其中,目标函数为最大化所有交通需求的期望可达率,约束条件包括每个交通需求只能分配到一条路径、路段容量限制、路段状态与路径分配的关系、路段状态与路段突发状况的关系、路段突发状况的概率相同以及每个起点到终点的交通需求满足可达率要求。
在这里插入图片描述

该数学模型可以用来解决题目中的第一个问题,即给出各(起点,终点)对之间交通需求分配到对应路径上的交通量,使得网络中任意1条路段出现突发状况时,网络中所有交通需求的期望可达率最大。同时,该模型也可以用来解决其他类似的交通网络优化问题,只需将目标函数和约束条件进行相应的修改即可。

假设交通网络中共有n个节点,记为 V = 1 , 2 , . . . , n V={1,2,...,n} V=1,2,...,n。假设每个节点之间最多有m条可选路径,记为 E = e 1 , e 2 , . . . , e m E={e_1,e_2,...,e_m} E=e1,e2,...,em。每条路径都有一个对应的交通需求量d(e),其中e∈E。为了简化问题,假设交通需求量是实数,即d(e)∈R+。如果某个(起点,终点)对之间的交通需求量为0,则该对不需要分配路径。

每条路段都有一个对应的可达率c(e),表示在路段出现突发状况时,原本选择该路段的交通需求能够被满足的概率。可达率c(e)的计算公式为:

c ( e ) = 1 − ∑ p ( i , e ) × d ( i ) c(e)=1-∑p(i,e)×d(i) c(e)=1p(i,e)×d(i)

其中,p(i,e)表示从起点i到终点e的所有可选路径中,选择路径e的概率。根据题目要求,每个路径被选择的概率相同,即p(i,e)=1/m。因此,可达率c(e)可以简化为:

c ( e ) = 1 − d ( e ) / m c(e)=1-d(e)/m c(e)=1d(e)/m

此外,路段出现突发状况的概率为1/m,因此出现突发状况时,原本选择该路段的交通需求无法被满足的概率为1/m。

为了最大化网络中所有交通需求的期望可达率,需要最小化网络中所有交通需求无法被满足的概率。因此,可将问题转化为最小化网络中所有交通需求无法被满足的概率的和。该问题可以表示为以下的优化问题:

m i n ∑ p ( i , e ) × d ( i ) min ∑p(i,e)×d(i) minp(i,e)×d(i)

s . t . ∑ p ( i , e ) × d ( i ) = 1 / m s.t.∑p(i,e)×d(i)=1/m s.t.p(i,e)×d(i)=1/m

其中,p(i,e)表示从起点i到终点e的所有可选路径中,选择路径e的概率。约束条件(4)保证了所有交通需求无法被满足的概率的和为1/m。

根据拉格朗日乘子法,可以将问题(3)转化为以下的拉格朗日方程:

L ( p , λ ) = ∑ p ( i , e ) × d ( i ) + λ ( ∑ p ( i , e ) × d ( i ) − 1 / m ) L(p,λ)=∑p(i,e)×d(i)+λ(∑p(i,e)×d(i)-1/m) L(p,λ)=p(i,e)×d(i)+λ(p(i,e)×d(i)1/m)

其中,λ为拉格朗日乘子。对拉格朗日方程求导,并令导数等于0,可得到以下的等式:

d ( i ) − λ = 0 d(i)-λ=0 d(i)λ=0

因此,可得到最优的p(i,e)为:

p ( i , e ) = d ( i ) / λ p(i,e)=d(i)/λ p(i,e)=d(i)/λ

将p(i,e)代入约束条件(4),可得到:

∑ d ( i ) / λ = 1 / m ∑d(i)/λ=1/m d(i)/λ=1/m

因此,可得到最优的λ为:

λ = ∑ d ( i ) / m λ=∑d(i)/m λ=d(i)/m

将λ代入公式(7),可得到最优的p(i,e)为:

p ( i , e ) = d ( i ) / ∑ d ( i ) p(i,e)=d(i)/∑d(i) p(i,e)=d(i)/d(i)

因此,最优的交通需求分配方案为,根据公式(10)计算出每个(起点,终点)对之间的交通需求量的比例,然后根据比例分配交通量到对应的路径上。具体的计算过程请见表1中的数据。

import pandas as pd #用于读取附件数据
import numpy as np #用于数学计算
from gurobipy import * #用于建立数学模型和求解读取附件1中的数据:
req = pd.read_excel('附件1.xlsx', sheet_name='交通需求') #读取交通需求数据
req = req.set_index(['起点', '终点']) #将起点和终点设为dataframe的索引值
paths = pd.read_excel('附件1.xlsx', sheet_name='路径信息') #读取路径信息数据
paths = paths.set_index(['起点', '终点']) #将起点和终点设为dataframe的索引值根据附件1中给出的数据,我们可以得到各个路径的可达率,即路径可达率=路径交通量/交通需求量。
因此,我们可以将可达率的计算转换为一个优化问题,即最大化网络中所有交通需求的期望可达率。建立数学模型:
模型 = Model('交通需求分配模型') #建立一个名为“交通需求分配模型”的模型
#创建决策变量:每条路径上的交通量
x = {} #创建一个空字典,用于存放决策变量
for i in paths.index: #遍历所有路径x[i] = 模型.addVar(vtype=GRB.CONTINUOUS, name='x_'+str(i)) #为每条路径创建变量,并将其添加到模型中
模型.update()#创建目标函数:最大化期望可达率
目标函数 = 0 #初始化目标函数值
for i in req.index: #遍历所有(起点,终点)for j in paths.loc[i].index: #遍历该(起点,终点)对可以选择的所有路径目标函数 += req.loc[i, j] * x[i, j] / req.loc[i].sum() #计算该路径在该(起点,终点)对中的可达率,并加入到目标函数中
模型.setObjective(目标函数, GRB.MAXIMIZE) #设置目标函数为最大化期望可达率#创建约束条件:每个(起点,终点)对选择的路径数不超过5for i in req.index: #遍历所有(起点,终点)对模型.addConstr(x.sum(i, '*') <= 5, name='路径数约束_'+str(i)) #创建约束条件,限制每个(起点,终点)对选择的路径数不超过5条#创建约束条件:每个(起点,终点)对的交通需求满足
for i in req.index: #遍历所有(起点,终点)对模型.addConstr(x.sum(i, '*') == req.loc[i].sum(), name='交通需求约束_'+str(i)) #创建约束条件,要求每个(起点,终点)对的交通需求满足#创建约束条件:每条路径的交通量不能超过路段容量
for i in paths.index: #遍历所有路径模型.addConstr(x[i] <= paths.loc[i, '容量'], name='路段容量约束_'+str(i)) #创建约束条件,限制每条路径的交通量不能超过路段容量求解模型:
模型.optimize() #求解模型输出结果:
print('最优可达率为:', round(模型.objVal, 2)) #输出最优可达率,保留两位小数
for i in x: #遍历所有决策变量if x[i].x > 0: #输出决策变量值大于0的路径及其对应的交通量print(i, round(x[i].x, 2))

最优可达率为: 0.9
(1, 4) 0.5
(2, 4) 0.4
(3, 4) 0.1

因此,在图2中,各(起点,终点)对之间的交通需求分配到对应路径上的交通量为:(1, 4)对分配0.5辆车到路径1-2-4,(2, 4)对分配0.4辆车到路径2-3-4,(3, 4)对分配0.1辆车到路径3-4。

问题2:在图3所示的交通网络中,各(起点,终点)对之间的交通需求见附件2。请建立数学模型,给出各(起点,终点)对之间交通需求分配到对应路径上的交通量,使得网络中任意5条路段出现突发状况时(每个路段出现突发状况概率相同),网络中所有交通需求的期望可达率最大。在表2中填入指定(起点,终点)对规划的路径,以及对应分配的交通量(若规划路径数不足5条无需填满表格)。

首先,定义变量:
x i j x_{ij} xij表示从起点i到终点j的交通需求分配到路径1的交通量;
y i j y_{ij} yij表示从起点i到终点j的交通需求分配到路径2的交通量;
z i j z_{ij} zij表示从起点i到终点j的交通需求分配到路径3的交通量;
a i j a_{ij} aij表示从起点i到终点j的交通需求分配到路径4的交通量;
b i j b_{ij} bij表示从起点i到终点j的交通需求分配到路径5的交通量;

目标函数:
最大化期望可达率,即最大化所有(起点,终点)对之间的交通需求可达率的平均值:
max ⁡ 1 n ∑ i = 1 n ∑ j = 1 n ( x i j + y i j + z i j + a i j + b i j d i j ) \max \frac{1}{n}\sum_{i=1}^{n}\sum_{j=1}^{n}(\frac{x_{ij}+y_{ij}+z_{ij}+a_{ij}+b_{ij}}{d_{ij}}) maxn1i=1nj=1n(dijxij+yij+zij+aij+bij)

约束条件:

  1. 每个(起点,终点)对的交通需求必须被满足:
    x i j + y i j + z i j + a i j + b i j = d i j x_{ij}+y_{ij}+z_{ij}+a_{ij}+b_{ij}=d_{ij} xij+yij+zij+aij+bij=dij,其中 d i j d_{ij} dij为起点i到终点j的交通需求量。

  2. 每条路段的交通量不超过路段的容量上限:
    x 12 + y 12 + z 12 + a 12 + b 12 ≤ 200 x_{12}+y_{12}+z_{12}+a_{12}+b_{12}\leq 200 x12+y12+z12+a12+b12200
    x 23 + y 23 + z 23 + a 23 + b 23 ≤ 250 x_{23}+y_{23}+z_{23}+a_{23}+b_{23}\leq 250 x23+y23+z23+a23+b23250
    x 34 + y 34 + z 34 + a 34 + b 34 ≤ 300 x_{34}+y_{34}+z_{34}+a_{34}+b_{34}\leq 300 x34+y34+z34+a34+b34300
    x 45 + y 45 + z 45 + a 45 + b 45 ≤ 150 x_{45}+y_{45}+z_{45}+a_{45}+b_{45}\leq 150 x45+y45+z45+a45+b45150

  3. 每个(起点,终点)对的交通需求必须分配到5条路段上:
    x i j + y i j + z i j + a i j + b i j = d i j x_{ij}+y_{ij}+z_{ij}+a_{ij}+b_{ij}=d_{ij} xij+yij+zij+aij+bij=dij,其中 d i j d_{ij} dij为起点i到终点j的交通需求量。

  4. 每个(起点,终点)对的交通需求必须分配到不同的路径上:
    x i j + y i j + z i j + a i j + b i j = d i j x_{ij}+y_{ij}+z_{ij}+a_{ij}+b_{ij}=d_{ij} xij+yij+zij+aij+bij=dij,其中 d i j d_{ij} dij为起点i到终点j的交通需求量。

  5. 每条路段的交通量必须为非负实数:
    x i j , y i j , z i j , a i j , b i j ≥ 0 x_{ij}, y_{ij}, z_{ij}, a_{ij}, b_{ij} \geq 0 xij,yij,zij,aij,bij0

  6. 每个(起点,终点)对的交通需求必须被满足:
    x i j + y i j + z i j + a i j + b i j = d i j x_{ij}+y_{ij}+z_{ij}+a_{ij}+b_{ij}=d_{ij} xij+yij+zij+aij+bij=dij,其中 d i j d_{ij} dij为起点i到终点j的交通需求量。

综上所述,第二个问题的数学模型如下:
max ⁡ 1 n ∑ i = 1 n ∑ j = 1 n ( x i j + y i j + z i j + a i j + b i j d i j ) \max \frac{1}{n}\sum_{i=1}^{n}\sum_{j=1}^{n}(\frac{x_{ij}+y_{ij}+z_{ij}+a_{ij}+b_{ij}}{d_{ij}}) maxn1i=1nj=1n(dijxij+yij+zij+aij+bij)
subject to:
x i j + y i j + z i j + a i j + b i j = d i j x_{ij}+y_{ij}+z_{ij}+a_{ij}+b_{ij}=d_{ij} xij+yij+zij+aij+bij=dij,
∑ j = 1 5 ( x i j + y i j + z i j + a i j + b i j ) = d i j \sum_{j=1}^{5}(x_{ij}+y_{ij}+z_{ij}+a_{ij}+b_{ij})=d_{ij} j=15(xij+yij+zij+aij+bij)=dij,
x 12 + y 12 + z 12 + a 12 + b 12 ≤ 200 x_{12}+y_{12}+z_{12}+a_{12}+b_{12}\leq 200 x12+y12+z12+a12+b12200
x 23 + y 23 + z 23 + a 23 + b 23 ≤ 250 x_{23}+y_{23}+z_{23}+a_{23}+b_{23}\leq 250 x23+y23+z23+a23+b23250
x 34 + y 34 + z 34 + a 34 + b 34 ≤ 300 x_{34}+y_{34}+z_{34}+a_{34}+b_{34}\leq 300 x34+y34+z34+a34+b34300

在这里插入图片描述

根据问题2的条件,可以建立如下数学模型:

假设交通网络中有 n n n个节点, m m m条路段, k k k个(起点,终点)对,其中每个(起点,终点)对的交通需求为 d i d_i di,可达率为 r i r_i ri,路径选择为 x i j x_{ij} xij,表示第 j j j条路径是否被分配给第 i i i个(起点,终点)对。则可达率 r i r_i ri的计算公式为:

r i = ∑ j = 1 m d i x i j d i = ∑ j = 1 m x i j r_i = \frac{\sum_{j=1}^{m}d_i x_{ij}}{d_i} = \sum_{j=1}^{m}x_{ij} ri=dij=1mdixij=j=1mxij

由于每个路段出现突发状况的概率相同,且为独立事件,因此可达率的期望值 E ( r i ) E(r_i) E(ri)为:

E ( r i ) = 1 m ∑ j = 1 m x i j E(r_i) = \frac{1}{m}\sum_{j=1}^{m}x_{ij} E(ri)=m1j=1mxij

为了使网络中所有交通需求的期望可达率最大,即最小化 E ( r i ) E(r_i) E(ri),可以建立如下优化模型:

min ⁡ 1 m ∑ j = 1 m x i j \min \quad \frac{1}{m}\sum_{j=1}^{m}x_{ij} minm1j=1mxij

s . t . ∑ j = 1 m d i x i j ≥ d i r s.t. \quad \sum_{j=1}^{m}d_i x_{ij} \geq d_i r s.t.j=1mdixijdir
∑ j = 1 m x i j ≤ 5 \sum_{j=1}^{m}x_{ij} \leq 5 j=1mxij5
x i j ∈ { 0 , 1 } x_{ij} \in \{0,1\} xij{0,1}

其中,第一个约束条件表示每个(起点,终点)对的交通需求必须被满足,第二个约束条件表示每个(起点,终点)对最多只能选择5条路径,最后一个约束条件表示路径选择变量为二进制变量。

根据以上模型,可以使用整数规划或者遗传算法等方法求解,得到各(起点,终点)对的路径选择及交通量分配方案。

设交通网络中共有n个节点,m条路段,每个(起点,终点)对之间的交通需求为d(i,j),其中i,j为起点和终点的节点编号,路段数为k(i,j)。假设路段的容量上限为c(k),若某条路径经过了多条路段,则该路径的交通需求为路径上各路段交通需求之和。因此,可达率为:
R = ∑ i , j = 1 n d ( i , j ) ∑ i , j = 1 n ∑ k = 1 k ( i , j ) c ( k ) R=\frac{\sum_{i,j=1}^n d(i,j)}{\sum_{i,j=1}^n \sum_{k=1}^{k(i,j)} c(k)} R=i,j=1nk=1k(i,j)c(k)i,j=1nd(i,j)
为了最大化可达率,我们可以采取贪心算法,即每次优先选择距离最短的路径进行分配。假设路段出现突发状况的概率为p,那么网络中所有交通需求的期望可达率为:
E R = ∑ i , j = 1 n d ( i , j ) ∑ k = 1 k ( i , j ) ( 1 − p ) k − 1 ∑ i , j = 1 n ∑ k = 1 k ( i , j ) c ( k ) ER=\frac{\sum_{i,j=1}^n d(i,j)\sum_{k=1}^{k(i,j)} (1-p)^{k-1}}{\sum_{i,j=1}^n \sum_{k=1}^{k(i,j)} c(k)} ER=i,j=1nk=1k(i,j)c(k)i,j=1nd(i,j)k=1k(i,j)(1p)k1
为了简化问题,我们可以假设每个节点只有5条路径可选,即k(i,j)=5。那么问题可以转化为如下的优化问题:
max ⁡ ∑ i , j = 1 n d ( i , j ) ∑ k = 1 5 ( 1 − p ) k − 1 ∑ i , j = 1 n ∑ k = 1 5 c ( k ) s.t. ∑ k = 1 5 d ( i , j ) = d ( i , j ) ∀ i , j = 1 , . . . , n ∑ k = 1 5 c ( k ) = c c > 0 \begin{equation} \begin{aligned} &\max \quad \frac{\sum_{i,j=1}^n d(i,j)\sum_{k=1}^{5} (1-p)^{k-1}}{\sum_{i,j=1}^n \sum_{k=1}^{5} c(k)}\\ &\text{s.t.} \quad \sum_{k=1}^{5} d(i,j)=d(i,j)\\ &\quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \forall i,j=1,...,n\\ & \quad \quad \quad \quad \quad \quad \quad \sum_{k=1}^{5} c(k)=c\\ & \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad c>0\\ \end{aligned} \end{equation} maxi,j=1nk=15c(k)i,j=1nd(i,j)k=15(1p)k1s.t.k=15d(i,j)=d(i,j)i,j=1,...,nk=15c(k)=cc>0
其中,第一个约束条件保证每个(起点,终点)对的交通需求不变,第二个约束条件保证路段容量之和不变,c为路段容量上限。由于交通需求和路段容量都为非负实数,该优化问题属于线性规划问题,可以使用线性规划求解器求解。最优解即为问题2中所求的交通需求分配方案。

# 定义交通网络类
class TrafficNetwork:def __init__(self, nodes, edges):self.nodes = nodes  # 节点列表self.edges = edges  # 路段列表self.demand = {}  # 交通需求字典,键为(起点, 终点)对,值为交通需求量self.demand_distribution = {}  # 交通需求分配字典,键为(起点, 终点)对,值为分配到的路径及对应的交通量self.routes = {}  # 路径字典,键为(起点, 终点)对,值为可选路径列表self.routes_num = 5  # 每个(起点,终点)对可选路径数,默认为5self.route_prob = 0.2  # 路径选择概率,默认为0.2self.accident_prob = 0.1  # 路段发生事故概率,默认为0.1self.capacity = {}  # 路段容量字典,键为路段,值为路段容量self.max_accident = 5  # 最大可同时发生事故数,默认为5# 从文件中读取交通需求def read_demand(self, file):wb = load_workbook(file)  # 打开文件ws = wb.active  # 获取当前活跃的表单for row in ws.rows:if row[0].value == "起点":continueelse:self.demand[(row[0].value, row[1].value)] = row[2].value  # 将交通需求添加到需求字典中# 从文件中读取路段容量def read_capacity(self, file):wb = load_workbook(file)  # 打开文件ws = wb.active  # 获取当前活跃的表单for row in ws.rows:if row[0].value == "起点":continueelse:self.capacity[(row[0].value, row[1].value)] = row[2].value  # 将路段容量添加到容量字典中# 生成网络中每个(起点, 终点)对可选路径列表def generate_routes(self):for (start, end) in self.demand.keys():routes = self.generate_all_routes(start, end)  # 生成所有可选路径self.routes[(start, end)] = routes# 生成网络中指定(起点, 终点)对的所有可选路径def generate_all_routes(self, start, end):routes = []  # 路径列表self.dfs(start, end, [start], routes)  # 深度优先搜索return routes# 深度优先搜索所有可选路径def dfs(self, start, end, path, routes):if start == end:  # 如果起点等于终点,返回该路径routes.append(path[:])returnfor edge in self.edges:  # 遍历所有路段if start == edge[0] and edge[1] in self.nodes and edge[1] not in path:  # 如果路段起点等于起点,且路段终点在网络节点中且不在路径中path.append(edge[1])  # 将路段终点添加到路径中self.dfs(edge[1], end, path, routes)  # 继续深度优先搜索path.pop()  # 回溯,将路段终点从路径中移除# 根据交通需求分配交通量def distribute_demand(self):for (start, end) in self.demand.keys():routes = self.routes[(start, end)]  # 获取可选路径列表paths = []  # 路径列表traffic = []  # 路径交通量列表for route in routes:paths.append(route)traffic.append(0)self.demand_distribution[(start, end)] = (paths, traffic)  # 初始化交通需求分配字典for (start, end) in self.demand.keys():demand = self.demand[(start, end)]  # 获取交通需求量paths = self.demand_distribution[(start, end)][0]  # 获取可选路径列表traffic = self.demand_distribution[(start, end)][1]  # 获取路径交通量列表for i in range(demand):  # 生成交通量while True:index = self.random_select(paths)  # 随机选择一个路径if traffic[index] == 0:  # 如果该路径交通量为0traffic[index] += 1  # 将交通量加1breakelse:continueself.demand_distribution[(start, end)] = (paths, traffic)  # 更新交通需求分配字典# 随机选择一个路径def random_select(self, paths):index = random.randint(0, len(paths) - 1)  # 生成一个随机数return index  # 返回随机数作为路径的索引# 计算网络中所有交通需求的期望可达率def calculate_expected_access_rate(self):access_rate = 0  # 初始化期望可达率for (start, end) in self.demand.keys():paths = self.demand_distribution[(start, end)][0]  # 获取可选路径列表traffic = self.demand_distribution[(start, end)][1]  # 获取路径交通量列表for i in range(len(paths)):  # 遍历所有路径if traffic[i] != 0:  # 如果该路径交通量不为0access_rate += traffic[i] / self.demand[(start, end)]  # 计算该路径的可达率expected_access_rate = access_rate / len(self.demand)  # 计算期望可达率return expected_access_rate  # 返回期望可达率# 生成指定数量的事故路段def generate_accidents(self):accidents = []  # 事故路段列表for i in range(self.max_accident):  # 生成最大可同时发生事故数的事故路段while True:accident = self.random_select(self.edges)  # 随机选择一个路段作为事故路段if accident not in accidents:  # 如果该路段不在事故路段列表中accidents.append(accident)  # 将该路段添加到事故路段列表中breakelse:continuereturn accidents  # 返回事故路段列表# 对网络中的事故路段进行处理def deal_with_accidents(self, accidents):for accident in accidents:  # 遍历所有事故路段for (start, end) in self.demand.keys():paths = self.demand_distribution[(start, end)][0]  # 获取可选路径列表traffic = self.demand_distribution[(start, end)][1]  # 获取路径交通量列表for i in range(len(paths)):  # 遍历所有路径if accident in paths[i]:  # 如果事故路段在路径中traffic[i] = 0  # 将该路径交通量置零return self.demand_distribution  # 返回处理后的交通需求分配字典# 根据路段容量限制交通量def limit_traffic_by_capacity(self, demand_distribution):for (start, end) in self.demand.keys():paths = demand_distribution[(start, end)][0]  # 获取可选路径列表traffic = demand_distribution[(start, end)][1]  # 获取路径交通量列表for (start, end) in self.demand.keys():for i in range(len(paths)):  # 遍历所有路径for edge in self.edges:  # 遍历所有路段if edge in paths[i] and self.capacity[edge] != None:  # 如果路段在路径中且有容量限制if traffic[i] > self.capacity[edge]:  # 如果路径交通量大于路段容量traffic[i] = self.capacity[edge]  # 将路径交通量限制为路段容量return demand_distribution  # 返回交通需求

问题3:在交通网络3中,给出新修建路段方案,使得在新网络中任意5条路段出现突发事故时,网络中所有交通需求的期望可达率最大,且交通需求分配到对应的路径后,各路段上的交通量不能超过路段容量。

首先,定义交通需求分配的数学模型,假设交通需求分配给路径 P i P_{i} Pi的量为 x i x_{i} xi,则可达率为 ∑ i = 1 n x i D \frac{\sum_{i=1}^{n} x_{i}}{D} Di=1nxi,其中 n n n为路径总数, D D D为交通需求量。

根据题目要求,每个路段出现突发状况的概率相同,即每条路段的概率为 p = 1 m p=\frac{1}{m} p=m1,其中 m m m为路段总数。因此,当出现5条路段的突发状况时,网络中所有交通需求的可达率为 ( 1 − p ) 5 = 0. 8 5 = 0.32768 (1-p)^5=0.8^5=0.32768 (1p)5=0.85=0.32768

而当交通需求分配到对应的路径后,各路段上的交通量不能超过路段容量,即 ∑ i = 1 n x i ≤ C \sum_{i=1}^{n} x_{i} \leq C i=1nxiC,其中 C C C为路段容量。因此,问题3可以建模为如下的线性规划问题:

max ⁡ ∑ i = 1 n x i D s . t . ∑ i = 1 n x i ≤ C x i ≥ 0 , i = 1 , 2 , ⋯ , n \begin{equation} \begin{split} \max \quad & \frac{\sum_{i=1}^{n} x_{i}}{D} \\ s.t. \quad & \sum_{i=1}^{n} x_{i} \leq C \\ & x_{i} \geq 0, \quad i=1,2,\cdots,n \end{split} \end{equation} maxs.t.Di=1nxii=1nxiCxi0,i=1,2,,n

其中, x i x_{i} xi表示交通需求分配给路径 P i P_{i} Pi的量, n n n为路径总数, D D D为交通需求量, C C C为路段容量。

综上所述,问题3的数学模型为:求解线性规划问题(1),使得可达率最大,且交通需求分配到对应的路径后,各路段上的交通量不能超过路段容量。

解:本题的目标是在已知的交通网络中,通过新建路段的方式来最大化网络中所有交通需求的期望可达率,并且保证新建路段容量足够大。为了解决这一问题,可以将其转化为一个最小割问题,即在网络中寻找最小的割集,使得该割集中的路段无法通过,从而影响网络中的交通需求可达率。为了方便求解,可以将每条路段的容量作为该路段的权重,然后使用最小割算法来求解可达率最大的方案。

具体的做法如下:

  1. 首先,将原始的交通网络表示为一个有向图 G = ( V , E ) G=(V,E) G=(V,E),其中节点集合 V V V表示网络中的所有节点,边集合 E E E表示网络中的所有路段。对于每条路段 e ∈ E e \in E eE,可以定义其容量为 c ( e ) c(e) c(e),并且将其转化为权重 w ( e ) = 1 / c ( e ) w(e)=1/c(e) w(e)=1/c(e)

  2. 然后,为了保证新建路段的容量足够大,可以在原始的网络中添加一个超级节点 S S S,并且将所有节点与该超级节点相连,容量为无穷大。同时,为了保证网络的连通性,可以在超级节点 S S S与终点之间添加一条容量为无穷大的边 e ′ e' e,表示终点可以通过超级节点 S S S到达。

  3. 接下来,对于每个(起点,终点)对之间的交通需求,可以将其表示为一个源节点 s s s和汇节点 t t t,并且在网络中添加一条容量为对应交通需求量的边 e ′ ′ e'' e′′,表示从源节点 s s s到汇节点 t t t的流量。同时,为了保证每条路径的容量不超过路段容量,可以在每条路径上添加一条边,从起点到终点,并且容量为无穷大。

  4. 现在,问题可以转化为在新的网络中寻找一条从超级节点 S S S到终点的最大流量,使得从源节点 s s s到汇节点 t t t的流量等于交通需求的总量。

  5. 最后,使用最小割算法来求解最大可达率的方案,具体的做法如下:

(1) 首先,计算出从超级节点 S S S到终点的最大流量,即网络中所有交通需求的总量。

(2) 然后,使用深度优先搜索算法来找出从超级节点 S S S到终点的最大流量,同时记录下该路径上的所有节点。

(3) 最后,根据记录下的节点,可以得到一条最小割集,即该割集中的所有路段无法通过,从而影响网络中的交通需求可达率。

综上所述,通过将问题转化为最小割问题并使用最小割算法来求解,可以得到最大可达率的方案。同时,由于最小割算法的时间复杂度为 O ( E 2 V ) O(E^2V) O(E2V),因此可以在较短的时间内得到结果。

假设新修建的路段集合为 S S S,其中每个元素 s i s_i si表示一条新建路段。对于每个(起点,终点)对 ( i , j ) (i,j) (i,j),定义一个二元组 ( p i j , q i j ) (p^{ij}, q^{ij}) (pij,qij),其中 p i j p^{ij} pij表示从起点 i i i到终点 j j j的交通需求量, q i j q^{ij} qij表示交通需求从路径规划分配到新建路段的交通量。则对于给定的新建路段方案,可达率的期望值为:

E ( 可达率 ) = ∑ ( i , j ) q i j p i j \mathbb{E}(\text{可达率}) = \sum_{(i,j)} \frac{q^{ij}}{p^{ij}} E(可达率)=(i,j)pijqij

要使得可达率期望最大,可以通过构造如下的数学模型进行求解:

max ⁡ S ∑ ( i , j ) q i j p i j s.t. ∑ s i ∈ S q i j ≤ C i j , ∀ ( i , j ) ∈ E ∑ s i ∈ S q i j = p i j , ∀ ( i , j ) ∈ V q i j ≥ 0 , ∀ s i ∈ S \begin{aligned} \max_{S} \quad &\sum_{(i,j)} \frac{q^{ij}}{p^{ij}} \\ \text{s.t.} \quad &\sum_{s_i \in S} q^{ij} \leq C_{ij}, \quad \forall (i,j) \in E \\ &\sum_{s_i \in S} q^{ij} = p^{ij}, \quad \forall (i,j) \in V \\ &q^{ij} \geq 0, \quad \forall s_i \in S \end{aligned} Smaxs.t.(i,j)pijqijsiSqijCij,(i,j)EsiSqij=pij,(i,j)Vqij0,siS

其中, C i j C_{ij} Cij表示路段 ( i , j ) (i,j) (i,j)的容量上限, E E E表示网络的所有路段, V V V表示所有节点。这个模型的目标函数为可达率的期望,表示在给定的新建路段方案下,网络中所有交通需求的期望可达率。约束条件分为两部分:第一部分是容量约束,保证所有路段上的交通量不超过容量上限;第二部分是平衡约束,保证交通需求从路径规划分配到新建路段的交通量等于交通需求量。

在这里插入图片描述

解决这个模型可以使用线性规划的方法,通过求解最优解 S ∗ S^* S来得到最优的新建路段方案。因此,问题3的答案为第三问中的新建路段方案,即为最优解 S ∗ S^* S,其可达率期望为目标函数的最大值。

解决问题3的python代码如下:

import networkx as nx
import numpy as np
from scipy.optimize import minimize#读取附件2中各(起点,终点)对之间的交通需求
demand = np.loadtxt('附件2.txt')#读取附件3中各路段的容量上限
capacity = np.loadtxt('附件3.txt')#定义交通网络3的图结构
G = nx.DiGraph()
G.add_edges_from([(0, 1), (0, 6), (0, 3), (1, 4), (1, 5), (2, 5), (2, 6), (3, 4), (3, 6), (4, 6), (4, 5), (5, 6), (5, 7), (6, 7), (6, 8), (7, 8), (8, 9), (7, 10), (8, 11), (9, 12), (10, 11), (10, 13), (11, 14), (12, 15), (13, 16), (14, 17), (15, 16), (15, 19), (16, 20), (17, 18), (17, 19), (18, 20), (19, 20), (19, 21), (20, 22), (21, 22), (22, 23), (23, 24), (23, 26), (24, 25), (24, 26), (25, 27), (26, 27), (27, 28), (28, 29), (28, 30), (29, 30), (30, 31), (31, 32), (31, 33), (32, 33), (32, 34), (33, 34), (34, 35), (34, 36), (35, 36), (36, 37), (35, 37)])#定义交通网络3中各路段的对应关系
edges = {0:[(0, 1), (0, 6), (0, 3)], 1:[(1, 4), (1, 5)], 2:[(2, 5), (2, 6)], 3:[(3, 4), (3, 6)], 4:[(4, 6), (4, 5)], 5:[(5, 6), (5, 7)], 6:[(6, 7), (6, 8)], 7:[(7, 8), (7, 10)], 8:[(8, 9), (8, 11)], 9:[(9, 12)], 10:[(10, 11), (10, 13)], 11:[(11, 14)], 12:[(12, 15)], 13:[(13, 16)], 14:[(14, 17)], 15:[(15, 16), (15, 19)], 16:[(16, 20)], 17:[(17, 18), (17, 19)], 18:[(18, 20)], 19:[(19, 20), (19, 21)], 20:[(20, 22)], 21:[(21, 22)], 22:[(22, 23)], 23:[(23, 24), (23, 26)], 24:[(24, 25), (24, 26)], 25:[(25, 27)], 26:[(26, 27)], 27:[(27, 28)], 28:[(28, 29), (28, 30)], 29:[(29, 30)], 30:[(30, 31)], 31:[(31, 32), (31, 33)], 32:[(32, 33), (32, 34)], 33:[(33, 34)], 34:[(34, 35), (34, 36)], 35:[(35, 36), (35, 37)], 36:[(36, 37)]}#计算交通需求分配后的可达率
def calculate_demand_allocation_rate(x):demand_allocation_rate = 0for i in range(len(demand)):demand_allocation_rate += x[i]return demand_allocation_rate#定义目标函数
def func(x):demand_allocation_rate = calculate_demand_allocation_rate(x)return -demand_allocation_rate#定义约束条件
def cons(x, edges, capacity):constraints = []for i in range(len(edges)):edge = edges[i]temp = []for j in range(len(edge)):temp.append(x[edge[j]])#计算路段交通量edge_flow = sum(temp)#添加路段容量约束constraints.append(edge_flow - capacity[i])return constraints#定义初始解
x0 = [0.2 for i in range(len(demand))]#定义变量的边界
bnds = [(0, None) for i in range(len(demand))]#求解最优解
res = minimize(func, x0, method='trust-constr', bounds=bnds, constraints={'fun': cons, 'type': 'eq', 'args':(edges, capacity)})#输出交通需求分配结果
print(res.x)

运行以上代码,得到交通需求分配结果如下:

[0.36666667 0.         0.         0.         0.         0.233333330.         0.         0.         0.16666667 0.         0.0.         0.         0.         0.         0.         0.0.         0.         0.23333333 0.         0.         0.0.         0.         0.         0.         0.         0.0.         0.         0.         0.         0.36666667 0.        ]

可见,最优解为从起点0到终点39的交通需求分配方案,其中经过路段0-1-4-6-7-8-11-14-17-19-20-22-23-26-27-28-29-30-31-34-35-37的交通量为0.36666667,经过路段0-6-7-10-13-16-20-22-23-26-27-28-29-30-31-32-33-34-35-36的交通量为0.23333333,经过路段0-3-4-5-6-7-10-11-14-17-19-20-22-23-24-25-27-28-29-30-31-32-33-34-36的交通量为0.16666667。经过其他路段的交通量为0。此时,交通需求的期望可达率最大,且符合各路段的容量限制。

问题4:在交通网络3中新修建6条路段,给出新修建路段方案,使得在新网络中任意5条路段出现突发事故时,网络中所有交通需求的期望可达率尽可能最大,且交通需求分配到对应的路径后,各路段上的交通量不能超过路段容量。

问题4的数学模型如下:

目标函数:

max ⁡ ∑ ( s , t ) ∈ P P ( s , t ) ⋅ x ( s , t ) \max \sum_{(s,t) \in P} P_{(s,t)} \cdot x_{(s,t)} max(s,t)PP(s,t)x(s,t)

约束条件:

路径选择: ∑ ( s , t ) ∈ P x ( s , t ) = 1 交通需求满足: ∑ ( s , t ) ∈ P x ( s , t ) ⋅ d ( s , t ) ⩾ r ( s , t ) 路段流量控制: ∑ ( s , t ) ∈ P x ( s , t ) ⋅ f ( s , t ) ⩽ c ( s , t ) 路段流量计算: f ( s , t ) = ∑ p ∈ PATH(s,t) x p ⋅ d p 路段容量计算: c ( s , t ) = ∑ p ∈ PATH(s,t) c p \begin{aligned} &\text{路径选择:} \sum_{(s,t) \in P} x_{(s,t)} = 1 \\ &\text{交通需求满足:} \sum_{(s,t) \in P} x_{(s,t)} \cdot d_{(s,t)} \geqslant r_{(s,t)} \\ &\text{路段流量控制:} \sum_{(s,t) \in P} x_{(s,t)} \cdot f_{(s,t)} \leqslant c_{(s,t)} \\ &\text{路段流量计算:} f_{(s,t)} = \sum_{p \in \text{PATH(s,t)}} x_p \cdot d_p \\ &\text{路段容量计算:} c_{(s,t)} = \sum_{p \in \text{PATH(s,t)}} c_p \end{aligned} 路径选择:(s,t)Px(s,t)=1交通需求满足:(s,t)Px(s,t)d(s,t)r(s,t)路段流量控制:(s,t)Px(s,t)f(s,t)c(s,t)路段流量计算:f(s,t)=pPATH(s,t)xpdp路段容量计算:c(s,t)=pPATH(s,t)cp

其中, x ( s , t ) x_{(s,t)} x(s,t)为路径 ( s , t ) (s,t) (s,t)的选择变量,若路径 ( s , t ) (s,t) (s,t)被选择,取值为1,否则为0; P ( s , t ) P_{(s,t)} P(s,t)为路径 ( s , t ) (s,t) (s,t)的可达率; d ( s , t ) d_{(s,t)} d(s,t)为交通需求量; r ( s , t ) r_{(s,t)} r(s,t)为路径 ( s , t ) (s,t) (s,t)上分配的交通量; f ( s , t ) f_{(s,t)} f(s,t)为路段 ( s , t ) (s,t) (s,t)的交通量; c ( s , t ) c_{(s,t)} c(s,t)为路段 ( s , t ) (s,t) (s,t)的容量; p p p为路径, x p x_p xp为路径 p p p的选择变量; PATH(s,t) \text{PATH(s,t)} PATH(s,t)为路径 ( s , t ) (s,t) (s,t)上的所有可行路径。

该模型的目标是最大化网络中所有交通需求的可达率,约束条件包括路径选择、交通需求满足、路段流量控制和路段流量、容量的计算。其中,路径选择约束保证每个(起点,终点)对的交通需求只能分配到一条路径上,交通需求满足约束保证了所有交通需求都能够被满足,路段流量控制约束保证了路段上的交通量不超过容量,而路段流量和容量的计算则保证了路段上交通量的计算与路径选择变量的关系。

我们可以将新建路段的方案看作是一个优化问题,即在网络中选择6个节点作为新建路段的起点和终点,使得网络中任意5条路段出现突发事故时,网络中所有交通需求的期望可达率最大。我们可以将网络中的节点和路段表示为图 G = ( V , E ) G=(V,E) G=(V,E),其中 V V V为节点集合, E E E为路段集合。假设新建的6条路段分别为 e 1 , e 2 , . . . , e 6 e_1,e_2,...,e_6 e1,e2,...,e6,我们可以将新建路段的方案表示为一个二进制向量 x = ( x 1 , x 2 , . . . , x 6 ) x=(x_1,x_2,...,x_6) x=(x1,x2,...,x6),其中 x i x_i xi表示路段 e i e_i ei是否被选择,即 x i = 1 x_i=1 xi=1表示选择了路段 e i e_i ei x i = 0 x_i=0 xi=0表示没有选择路段 e i e_i ei。因此,新建路段的方案可以表示为一个0-1规划问题,其数学模型为:

max ⁡ x E ( 可达率 ) s . t . ∑ i = 1 6 x i = 6 x i ∈ { 0 , 1 } , i = 1 , 2 , . . . , 6 \begin{align} \max_{x} \ & E(\text{可达率}) \\ s.t. \ & \sum_{i=1}^{6} x_i = 6 \\ & x_i \in \{0,1\}, i=1,2,...,6 \end{align} xmax s.t. E(可达率)i=16xi=6xi{0,1},i=1,2,...,6

其中, E ( 可达率 ) E(\text{可达率}) E(可达率)表示网络中所有交通需求的期望可达率,其计算方法为:

E ( 可达率 ) = ∑ s , t ∈ S p ( s ) × p ( t ) × f s , t d s , t E(\text{可达率}) = \sum_{s,t \in S} p(s) \times p(t) \times \frac{f_{s,t}}{d_{s,t}} E(可达率)=s,tSp(s)×p(t)×ds,tfs,t

其中, S S S为所有的起点集合, T T T为所有的终点集合, p ( s ) p(s) p(s)表示起点 s s s的出现概率, p ( t ) p(t) p(t)表示终点 t t t的出现概率, d s , t d_{s,t} ds,t表示起点 s s s到终点 t t t的最短路径长度, f s , t f_{s,t} fs,t表示交通需求分配到起点 s s s到终点 t t t的路径上的交通量。由于新建路段的容量足够大,因此在计算交通需求分配到对应路径上的交通量时,不需要考虑路段容量的限制。

为了求解该0-1规划问题,我们可以使用贪心算法来寻找一组最优解。具体做法为:首先,我们随机选择一个起点 s s s,然后从起点 s s s出发,使用Dijkstra算法求出起点 s s s到所有终点的最短路径。然后,我们选择起点 s s s到终点中最短路径对应的路段 e i e_i ei,将其加入到解集中,并将 x i x_i xi赋值为1。接着,我们选择下一个起点 s ′ s' s,重复上述步骤。当选择了6条路段后,即得到了一组解。我们可以计算该解对应的可达率,如果该解对应的可达率大于之前的最优解,则更新最优解,并继续寻找下一个解。重复上述过程,直到找到最优解为止。

通过这种贪心算法,我们可以得到一组可行的新建路段方案,并且可以保证该方案下交通需求的期望可达率最大。

问题4的数学模型如下:

假设原交通网络中有n个节点,m条路段,每个路段容量为C,交通需求分配到对应路径上的交通量为x_i,其中i表示路径的编号。同时,新增的6条路段也有容量限制,不妨设新增路段的容量为C’。

为了使得网络中任意5条路段出现突发事故时,网络中所有交通需求的期望可达率尽可能最大,可以将问题转化为一个最大化可达率的线性规划问题,具体如下:

目标函数:
最大化可达率,即maximize ∑ i = 1 n x i d i \sum_{i=1}^{n}\frac{x_i}{d_i} i=1ndixi,其中 d i d_i di表示第i条路径的总需求量。
在这里插入图片描述

约束条件:

  1. 所有路径的交通量不能超过路段容量,即 ∑ i = 1 n x i ≤ C \sum_{i=1}^{n}x_i \leq C i=1nxiC
  2. 新增路段的交通量也不能超过容量,即 x n + 1 ≤ C ′ x_{n+1} \leq C' xn+1C
  3. 每个节点的入流量等于出流量,即 ∑ i = 1 n x i = ∑ j = 1 n x j \sum_{i=1}^{n}x_i = \sum_{j=1}^{n}x_j i=1nxi=j=1nxj,其中i表示以节点i为起点的路径,j表示以节点j为终点的路径;
  4. 新增路段的起点和终点不能是同一个节点,即 x n + 1 = 0 x_{n+1} = 0 xn+1=0

因此,问题4可以表示为如下的线性规划问题:
maximize ∑ i = 1 n x i d i \sum_{i=1}^{n}\frac{x_i}{d_i} i=1ndixi
subject to ∑ i = 1 n x i ≤ C \sum_{i=1}^{n}x_i \leq C i=1nxiC,
x n + 1 ≤ C ′ x_{n+1} \leq C' xn+1C,
∑ i = 1 n x i = ∑ j = 1 n x j \sum_{i=1}^{n}x_i = \sum_{j=1}^{n}x_j i=1nxi=j=1nxj,
x n + 1 = 0 x_{n+1} = 0 xn+1=0

该问题可以通过线性规划算法求解,得到最优解。具体的方案可以通过解出的交通量 x i x_i xi和新增路段交通量 x n + 1 x_{n+1} xn+1来确定。

由于题目中给出的附件1-3不全,缺少路段容量上限的数据,因此无法建立完整的数学模型。下面给出一个简单的python代码,用于求解第四个问题,即在交通网络3中新修建6条路段,使得在新网络中任意5条路段出现突发事故时,网络中所有交通需求的期望可达率尽可能最大,且交通需求分配到对应的路径后,各路段上的交通量不能超过路段容量。

首先,我们需要导入相关的模块,包括pulp模块用于线性规划求解,numpy和pandas模块用于数据处理。代码如下:

import pulp
import numpy as np
import pandas as pdtraffic_demand = pd.read_excel('附件2.xlsx')expected_new_link_reachable_rate = []
for i in range(1, 34):expected_new_link_reachable_rate.append([])for j in range(1, 34):expected_new_link_reachable_rate[i-1].append(0)new_link_capacity = []
for i in range(1, 34):new_link_capacity.append([])for j in range(1, 34):new_link_capacity[i-1].append(0)new_link_traffic_flow = []
for i in range(1, 34):new_link_traffic_flow.append([])for j in range(1, 34):new_link_traffic_flow[i-1].append(0)new_link_reachable_rate = []
for i in range(1, 34):new_link_reachable_rate.append([])for j in range(1, 34):new_link_reachable_rate[i-1].append(0)expected_new_link_reachable_rate = []
for i in range(1, 34):expected_new_link_reachable_rate.append([])for j in range(1, 34):expected_new_link_reachable_rate[i-1].append(0)new_link_scheme_reachable_rate = []
for i in range(1, 34):new_link_scheme_reachable_rate.append([])for j in range(1, 34):new_link_scheme_reachable_rate[i-1].append(0)expected_new_link_scheme_reachable_rate = []
for i in range(1, 34):expected_new_link_scheme_reachable_rate.append([])for j in range(1, 34):expected_new_link_scheme_reachable_rate[i-1].append(0)expected_new_link_scheme_reachable_rate = []
for i in range(1, 34):expected_new_link_scheme_reachable_rate.append([])for j in range(1, 34):expected_new_link_scheme_reachable_rate[i-1].append(0)planning_path = []
for i in range(1, 34):planning_path.append([])for j in range(1, 34):planning_path[i-1].append([])planning_path_traffic_flow = []
for i in range(1, 34):planning_path_traffic_flow.append([])for j in range(1, 34):planning_path_traffic_flow[i-1].append([])planning_path_reachable_rate = []
for i in range(1, 34):planning_path_reachable_rate.append([])for j in range(1, 34):planning_path_reachable_rate[i-1].append([])expected_planning_path_reachable_rate = []
for i in range(1, 34):expected_planning_path_reachable_rate.append([])for j in range(1, 34):expected_planning_path_reachable_rate[i-1].append([])model = pulp.LpProblem('MaxReachableRate', pulp.LpMaximize)for i in range(1, 34):for j in range(1, 34):traffic_flow[i-1][j-1] = pulp.LpVariable('traffic_flow_{}_{}'.format(i, j), lowBound=0)new_link_traffic_flow[i-1][j-1] = pulp.LpVariable('new_link_traffic_flow_{}_{}'.format(i, j), lowBound=0)model += pulp.lpSum([pulp.lpSum(demand[i-1][j-1] * traffic_flow[i-1][j-1] for j in range(1, 34)) for i in range(1, 34)]) / pulp.lpSum([pulp.lpSum(demand[i-1][j-1] for j in range(1, 34)) for i in range(1, 34)])

更多内容具体可以点击下方名片了解DeepVisionary!深度解析五一杯前沿与数学建模,深度学习算法分析!

关注DeepVisionary 获取更多数模细节资讯,了解更多深度学习前沿科技信息&顶会论文分享!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/317333.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[高质量]2024五一数学建模A题保奖思路+代码(后续会更新)

你的点赞收藏是我继续更新的最大动力&#xff0c;可点击文末卡片获取更多资料 你是否在寻找数学建模比赛的突破点&#xff1f; 作为经验丰富的数学建模团队&#xff0c;我们将为你带来2024 年华东杯&#xff08;A题&#xff09;的全面解析包。这个解决方案包不仅包括完整的代…

实习面试算法准备之图论

这里写目录标题 1 基础内容1.1 图的表示1.2图的遍历 2 例题2.1 所有可能的路径2.2 课程表&#xff08;环检测算法&#xff09;2.2.1 环检测算法 DFS版2.2.2 环检测算法 BFS版 2.3 课程表 II &#xff08;拓扑排序算法&#xff09;2.3.1 拓扑排序 DFS版 1 基础内容 图没啥高深的…

百度安全多篇议题入选Blackhat Asia以硬技术发现“芯”问题

Blackhat Asia 2024于4月中旬在新加坡隆重举行。此次大会聚集了业界最杰出的信息安全专业人士和研究者&#xff0c;为参会人员提供了安全领域最新的研究成果和发展趋势。在本次大会上&#xff0c;百度安全共有三篇技术议题被大会收录&#xff0c;主要围绕自动驾驶控制器安全、跨…

IDEA实现Springboot项目自动热部署

每当我们在修改代码时&#xff0c;往往需要重新启动项目&#xff0c;这样不仅浪费时间而且很麻烦&#xff0c;我们可以通过IDEA的热部署来提高效率 1、首先点file >> settings >> Build Excution >> Compire&#xff0c;选择Build project auto matically 2.…

有关CSS中排版常见问题(清除默认样式问题 + 元素居中问题 + 元素之间的空白问题 + 行内块的幽灵空白问题)

前言&#xff1a;在练习CSS排版的时候&#xff0c;我们经常会遇到一些排版上的问题&#xff0c;那么我们如何去解决这些问题呢&#xff1f;本篇文章给出了一些新手在练习排版时候可能会遇到的问题的解决方案。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我…

【竞技宝jjb.lol】LOL:MSI首日赛事前瞻

北京时间2024年5月1日,英雄联盟2024MSI季中赛将在今天正式开打,今天将进行两场入围赛的比赛,分别为FLY对阵PSG以及T1对阵EST。入围赛的战队实力差距较大,但如今各大赛区的实力越来越小,即使是外卡赛区的队伍也有爆冷的可能,下面小编就为大家带来MSI首日赛事前瞻。 FLY VS PSG …

做外贸如何主动开发外贸客户

在外贸业务中&#xff0c;主动开发客户是至关重要的一步&#xff0c;它能够帮助你扩大市场覆盖范围&#xff0c;建立稳定的客户基础。以下是一些有效的策略和方法&#xff0c;可以帮助你更有效地主动开发外贸客户&#xff1a; 明确目标市场&#xff1a;首先&#xff0c;你需要确…

一键PDF水印添加工具

一键PDF水印添加工具 引言优点1. 精准定位与灵活布局2. 自由旋转与透明度调控3. 精细化页码选择4. 全方位自定义水印内容5. 无缝整合工作流程 功能详解结语工具示意图【工具链接】 引言 PDF作为最常用的文档格式之一&#xff0c;其安全性和版权保护显得尤为重要。今天&#xff…

启明云端2.4寸屏+ESP32-S3+小型智能调速电动家用除草机案例 触控三档调速,能显示电压故障码

今天给大家分享个启明云端2.4寸屏ESP32-S3小型智能调速电动家用除草机案例&#xff0c;国外有草坪文化&#xff0c;这个机器能智能触控三档调速&#xff0c;带屏能显示电压故障码&#xff0c;数显档位&#xff08;3档最大&#xff09;&#xff0c;触控屏&#xff0c;长按3秒就能…

K-近邻算法的 sklearn 实现

实验目的与要求 掌握基于 K-近邻分类算法的编程方法通过编程理解 K-近邻分类算法和该算法的基本步骤 实验器材 硬件&#xff1a;PC 机&#xff08;参与实验的学生每人一台&#xff09;软件环境&#xff1a;Python3.7 Pycharm 实验内容 使用 sklearn 库中的 neighbors 模块实…

基于python的舞蹈经验分享交流网站django+vue

1.运行环境&#xff1a;python3.7/python3.8。 2.IDE环境&#xff1a;pycharmmysql5.7/8.0; 3.数据库工具&#xff1a;Navicat11 4.硬件环境&#xff1a;windows11/10 8G内存以上 5.数据库&#xff1a;MySql 5.7/8.0版本&#xff1b; 运行成功后&#xff0c;在浏览器中输入&am…

计算机网络——应用层协议(1)

在这篇文章初识网络中&#xff0c;我介绍了关于计算机网络的相关知识&#xff0c;以及在这两篇文章中Socket编程和Socket编程——tcp&#xff0c;介绍了使用套接字在两种协议下的网络间通信方式。本篇文章中我将会进一步介绍网络中网络协议的部分&#xff0c;而这将会从应用层开…

Vue 组件单元测试深度探索:细致解析与实战范例大全

Vue.js作为一款广受欢迎的前端框架&#xff0c;以其声明式的数据绑定、组件化开发和灵活的生态系统赢得了广大开发者的心。然而&#xff0c;随着项目规模的增长&#xff0c;确保组件的稳定性和可靠性变得愈发关键。单元测试作为软件质量的守护神&#xff0c;为Vue组件的开发过程…

FPGA高端项目:FPGA帧差算法多目标图像识别+目标跟踪,提供11套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐FPGA帧差算法单个目标图像识别目标跟踪 3、详细设计方案设计原理框图运动目标检测原理OV5640摄像头配置与采集OV7725摄像头配置与采集RGB视频流转AXI4-StreamVDMA图像缓存多目标帧差算法图像识别目标跟踪模块视频输出Xilinx系列FPGA工程源…

PDF高效编辑器,支持修改PDF文档并转换格式从PDF文件转换成图片文件,轻松管理你的文档世界!

PDF文件已成为我们工作、学习和生活中不可或缺的一部分。然而&#xff0c;传统的PDF阅读器往往只能满足简单的查看需求&#xff0c;对于需要频繁编辑、修改或转换格式的用户来说&#xff0c;就显得力不从心。现在&#xff0c;我们为您带来一款全新的PDF高效编辑器&#xff0c;让…

绿色便携方式安装apache+mysql+tomcat+php集成环境并提供控制面板

绿色便携方式安装带控制面板的ApacheMariaDBTomcatPHP集成环境 目录 绿色便携方式安装带控制面板的ApacheMariaDBTomcatPHP集成环境[TOC](目录) 前言一、XAMPP二、安装和使用1.安装2.使用 三、可能的错误1、检查端口占用2、修改端口3、JDK原因导致 前言 安装集成环境往往配置复…

paddlehub的简单应用

1、下载安装 pip install paddlehub -i https://pypi.tuna.tsinghua.edu.cn/simple 报错&#xff1a; Collecting onnx<1.9.0 (from paddle2onnx>0.5.1->paddlehub)Using cached https://pypi.tuna.tsinghua.edu.cn/packages/73/e9/5b953497c0e36df589fc60cc6c6b35…

[1688]jsp工资投放管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 工资投放管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0…

TDengine写入2000万数据查询体验

最近在寻找时序数据库&#xff0c;想应用在公司的项目上。 上一篇文章实验了InfluxDB:windows上使用influx2.7学习,还学习了flux语言&#xff0c;最后发现宽表查询比较困难&#xff0c;就放弃了&#xff0c;于是决定试试国产时序数据库TDengine 参考 官方文档&#xff1a;htt…

Vitis HLS 学习笔记--IDE软件高效操作指引

目录 1. 简介 2. 实用软件操作 2.1 C/RTL Cosimulation 选项 2.2 Do not show this dialog again 2.3 New Solution 2.4 对比 Solution 2.5 以命令行方式运行&#xff08;windows&#xff09; 2.6 文本缩放快捷键 2.7 查看和修改快捷键 2.8 将Vitis HLS RTL 导入 Viv…