2024年美国大学生数学建模竞赛(D题)湖泊水位调控|粒子群强化学习建模解析,小鹿学长带队指引全代码文章与思路

我是鹿鹿学长,就读于上海交通大学,截至目前已经帮200+人完成了建模与思路的构建的处理了~
此篇文章是由鹿鹿学长倾心打磨,解决挑战,创造美赛建模独特思路。融合粒子群算法、深度强化学习等前沿技术,构建全面网络模型,精准优化湖泊水位调控。社会网络分析揭示利益相关者关系,助力多方共赢。思维独到,创新无限,让鹿鹿学长为你筑梦美赛建模之路!
完整内容可以在文章末尾领取!
在这里插入图片描述

问题重述

要解决的问题:

  1. 在任何时候确定五大湖的最佳水位,考虑到各利益相关者的需求(每个利益相关者的成本和收益可能不同)。
  2. 制定算法,根据湖泊的流入和流出数据,维持五大湖的最佳水位。
  3. 了解您控制算法对两个控制坝的流出的敏感性。根据2017年的数据,您的新控制是否会导致该年各利益相关者的水位令人满意或优于实际记录?
  4. 您的算法对环境条件变化(例如降水、冬季积雪、冰封)的敏感性有多大?
  5. 将您的广泛分析仅集中在影响安大略湖的利益相关者和因素上,因为近期对该湖水位管理的关注较多。

问题一(粒子群算法+多目标优化)

在结合粒子群算法(PSO)和多目标优化算法解决问题一的过程中,我们可以按照以下步骤来建模:

  1. 定义目标函数: 设计一个多目标函数,考虑各利益相关者的需求。假设有m个目标函数(m个利益相关者),目标函数可以表示为:

    f ( x ) = [ f 1 ( x ) f 2 ( x ) ⋮ f m ( x ) ] f(\mathbf{x}) = \begin{bmatrix} f_1(\mathbf{x}) \\ f_2(\mathbf{x}) \\ \vdots \\ f_m(\mathbf{x}) \end{bmatrix} f(x)= f1(x)f2(x)fm(x)

    其中 x \mathbf{x} x 是决策变量的向量,表示五大湖的水位配置。

  2. 设计决策变量: 假设有五个湖泊,每个湖泊的水位是决策变量。因此, x = [ x 1 , x 2 , x 3 , x 4 , x 5 ] \mathbf{x} = [x_1, x_2, x_3, x_4, x_5] x=[x1,x2,x3,x4,x5],表示五大湖的水位。

  3. 制定约束条件: 设定湖泊水位的合理范围、湖泊之间的关系等约束条件。例如, x i x_i xi 的取值范围在某个合理区间内。

  4. 初始化粒子群: 随机生成一群粒子,每个粒子代表一个可能的水位配置。每个粒子都有一个速度和位置,初始化为:

    v i 0 = 0 , x i 0 = [ x i 1 0 , x i 2 0 , x i 3 0 , x i 4 0 , x i 5 0 ] \mathbf{v}_i^0 = \mathbf{0}, \quad \mathbf{x}_i^0 = [x_{i1}^0, x_{i2}^0, x_{i3}^0, x_{i4}^0, x_{i5}^0] vi0=0,xi0=[xi10,xi20,xi30,xi40,xi50]

    这里下标 i i i 表示粒子编号。

  5. 粒子群优化过程: 进行迭代优化,更新粒子的速度和位置。对于第 k k k 次迭代:

    • 更新速度: v i k = w ⋅ v i k − 1 + c 1 ⋅ r 1 ⋅ ( p b e s t i − x i k − 1 ) + c 2 ⋅ r 2 ⋅ ( g b e s t − x i k − 1 ) \mathbf{v}_i^k = w \cdot \mathbf{v}_i^{k-1} + c_1 \cdot r_1 \cdot (\mathbf{pbest}_i - \mathbf{x}_i^{k-1}) + c_2 \cdot r_2 \cdot (\mathbf{gbest} - \mathbf{x}_i^{k-1}) vik=wvik1+c1r1(pbestixik1)+c2r2(gbestxik1)
      其中, w w w 是惯性权重, c 1 c_1 c1 c 2 c_2 c2 是加速因子, r 1 r_1 r1 r 2 r_2 r2 是随机数。

    • 更新位置: x i k = x i k − 1 + v i k \mathbf{x}_i^k = \mathbf{x}_i^{k-1} + \mathbf{v}_i^k xik=xik1+vik

    这里 p b e s t i \mathbf{pbest}_i pbesti 表示粒子 i i i 的个体最优解, g b e s t \mathbf{gbest} gbest 表示整个群体的全局最优解。

  6. 评估目标函数: 对于每个粒子,计算目标函数的值:

    f i k = [ f 1 ( x i k ) f 2 ( x i k ) ⋮ f m ( x i k ) ] \mathbf{f}_i^k = \begin{bmatrix} f_1(\mathbf{x}_i^k) \\ f_2(\mathbf{x}_i^k) \\ \vdots \\ f_m(\mathbf{x}_i^k) \end{bmatrix} fik= f1(xik)f2(xik)fm(xik)

  7. 更新粒子群: 根据粒子的目标函数值,更新个体最优解和全局最优解。比较 f i k \mathbf{f}_i^k fik f p b e s t i \mathbf{f}_{pbest_i} fpbesti 以及 f i k \mathbf{f}_i^k fik f g b e s t \mathbf{f}_{gbest} fgbest

  8. 终止条件: 设定合适的终止条件,例如达到最大迭代次数或达到满足要求的解。

通过以上步骤,可以建立一个粒子群算法结合多目标优化的模型,用于确定五大湖的最佳水位配置。

import numpy as np
from pymoo.model.problem import Problem
from pymoo.algorithms.so_pso import PSO
from pymoo.factory import get_performance_indicator
from pymoo.optimize import minimize
import matplotlib.pyplot as plt# 设定湖泊水位的最小和最大限制
min_water_level = 0
max_water_level = 100# 定义问题类
class MultiObjectiveLakeProblem(Problem):def __init__(self):super().__init__(n_var=5, n_obj=2, n_constr=0, xl=[min_water_level]*5, xu=[max_water_level]*5)def _evaluate(self, x, out, *args, **kwargs):# 定义目标函数obj1 = np.sum(x)  # 例如,目标函数1为水位的总和obj2 = np.prod(x)  # 例如,目标函数2为水位的乘积# 计算目标函数值out["F"] = np.column_stack((obj1, obj2))# 定义粒子群算法
algorithm = PSO(pop_size=50, n_particles=10)# 定义问题实例
#见完整版# 打印最优解
print("Best Solution:", res.X)
print("Objective Values:", res.F)# 计算 Pareto 前沿
pf = get_performance_indicator("hv", ref_point=np.array([1.0, 1.0])).calc_pareto_front(res.F)# 绘制 Pareto 前沿
plt.scatter(res.F[:, 0], res.F[:, 1], label='Pareto Front')
plt.plot(pf[:, 0], pf[:, 1], color="red", label="True Pareto Front")
plt.title("Pareto Front")
plt.xlabel("Objective 1")
plt.ylabel("Objective 2")
plt.legend()
plt.show()

在多目标优化问题中,你可以绘制各种图表来帮助理解和分析优化结果。以下是一些常见的图表类型:

  1. Pareto 前沿图: 显示所有非支配解的图表,帮助观察在一个目标优化的同时,是否存在牺牲另一个目标的情况。在上面的代码示例中,我们使用散点图展示 Pareto 前沿。

  2. 收敛图: 描述算法在优化过程中目标函数值的变化,以便评估算法的收敛性能。可以绘制每一代的 Pareto 最优解的目标函数值。

  3. 决策变量分布图: 如果问题的决策变量有多个,可以绘制它们在 Pareto 前沿上的分布情况,以更好地理解解的特征。

  4. Hypervolume 进化图: 显示算法在优化过程中 Hypervolume 的变化情况,帮助评估 Pareto 前沿的完整性。

  5. Box Plot: 可以用于显示每个目标函数在 Pareto 前沿上的分布情况,有助于了解目标函数的变异性。

以下是一些示例代码,演示如何绘制 Pareto 前沿图和收敛图:

import matplotlib.pyplot as plt# 绘制 Pareto 前沿图
plt.scatter(res.F[:, 0], res.F[:, 1], label='Pareto Front')
plt.plot(pf[:, 0], pf[:, 1], color="red", label="True Pareto Front")
plt.title("Pareto Front")
plt.xlabel("Objective 1")
plt.ylabel("Objective 2")
plt.legend()
plt.show()# 绘制收敛图
gen = np.arange(1, 101)
plt.plot(gen, res.history["F"][:, 0], label="Objective 1")
plt.plot(gen, res.history["F"][:, 1], label="Objective 2")
plt.title("Convergence Plot")
plt.xlabel("Generation")
plt.ylabel("Objective Value")
plt.legend()
plt.show()

在这里插入图片描述

问题二(DDPG算法)

对于问题二,即建立算法以维持五大湖的最佳水位,考虑到涉及到动态水流、复杂的控制机制和多目标优化,可以考虑使用强化学习算法来实现水位的动态调控。让我们使用深度确定性策略梯度算法(Deep Deterministic Policy Gradient,DDPG)来解决湖泊水位调控问题。DDPG是一种适用于连续动作空间的深度强化学习算法。

首先,我们需要定义环境、状态空间、动作空间和奖励函数。接着,我们将构建一个DDPG网络,其中包括一个用于近似状态值函数的Critic网络和一个用于近似策略的Actor网络。最后,我们将使用DDPG算法对这两个网络进行训练。
在这里插入图片描述

以下是完整的建模思路,涵盖了湖泊水位调控问题的步骤:

1. 定义问题:

  • 目标: 设定湖泊水位的最优化目标,可以考虑最小化洪涝风险、最大化航运能力、最大化发电效益等。

  • 状态空间: 定义湖泊系统的状态,包括每个湖泊的水位、当前时间、流入流量、流出流量等。将这些信息组合成一个状态向量。

  • 动作空间: 定义控制参数,即可以调整的决策变量。在这里,控制参数可以是各个湖泊的流出流量的调整,例如通过调整水坝的开合程度来改变流量。

  • 奖励函数: 设计奖励函数,以反映系统的最优化目标。奖励函数应该被设计为正奖励或负奖励,以便强化学习算法能够在训练过程中学到最优的策略。

2. 强化学习模型选择:

  • 选择算法: 使用深度确定性策略梯度算法(DDPG)来解决连续动作空间的问题。DDPG是一种适用于湖泊水位调控问题的强化学习算法。

3. 构建模型:

  • 定义环境类: 创建一个湖泊环境类,包括状态更新和奖励计算等方法。

  • 定义Actor网络: 构建用于近似策略的Actor网络,其输出为动作空间维度。

  • 定义Critic网络: 构建用于近似值函数的Critic网络,其输入为状态和动作,输出为Q值。

4. 训练模型:

  • 初始化环境、网络和优化器: 创建湖泊环境实例,初始化Actor和Critic网络,定义优化器。

  • 定义经验回放缓存: 建立一个经验回放缓存,用于存储历史经验,以随机抽样进行训练。

  • 训练循环: 在每个训练循环中,通过与环境的交互收集经验,更新Actor和Critic网络,并进行经验回放。

5. 模型测试:

  • 在真实环境或更高保真度的模拟环境中测试: 在测试环境中评估模型的性能,包括其对系统动态变化的适应能力、对各种条件的鲁棒性等。

6. 在线调整:

  • 实时在线调整算法的参数: 根据实时的水位变化、气象条件等,可以实时在线调整算法的参数,以保持系统的动态平衡。
import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np# 湖泊环境类
class LakeEnvironment:def __init__(self):self.state = np.random.rand(5) * 100  # 5个湖泊的初始水位def step(self, action):new_state = self.state + actionreward = self.calculate_reward(new_state)self.state = new_statereturn new_state, rewarddef calculate_reward(self, state):return -np.sum((state - 50) ** 2)# Actor网络
class Actor(nn.Module):def __init__(self, state_dim, action_dim):super(Actor, self).__init__()self.fc1 = nn.Linear(state_dim, 128)self.fc2 = nn.Linear(128, 64)self.fc3 = nn.Linear(64, action_dim)def forward(self, state):x = torch.relu(self.fc1(state))x = torch.relu(self.fc2(x))action = torch.tanh(self.fc3(x))return action# Critic网络
class Critic(nn.Module):def __init__(self, state_dim, action_dim):super(Critic, self).__init__()self.fc1 = nn.Linear(state_dim + action_dim, 128)self.fc2 = nn.Linear(128, 64)self.fc3 = nn.Linear(64, 1)def forward(self, state, action):x = torch.cat([state, action], 1)x = torch.relu(self.fc1(x))x = torch.relu(self.fc2(x))q_value = self.fc3(x)return q_value# DDPG算法
class DDPG:def __init__(self, state_dim, action_dim):self.actor = Actor(state_dim, action_dim)self.critic = Critic(state_dim, action_dim)self.actor_optimizer = optim.Adam(self.actor.parameters(), lr=0.001)self.critic_optimizer = optim.Adam(self.critic.parameters(), lr=0.001)self.memory = []def select_action(self, state):state = torch.FloatTensor(state).unsqueeze(0)return self.actor(state).detach().numpy().flatten()def remember(self, state, action, reward, next_state):self.memory.append((state, action, reward, next_state))def train(self, batch_size=64):if len(self.memory) < batch_size:returnbatch = np.random.choice(len(self.memory), batch_size, replace=False)states, actions, rewards, next_states = zip(*[self.memory[i] for i in batch])states = torch.FloatTensor(states)actions = torch.FloatTensor(actions)rewards = torch.FloatTensor(rewards)next_states = torch.FloatTensor(next_states)# 计算Critic损失target_actions = self.actor(next_states).detach()target_q_values = rewards + 0.99 * self.critic(next_states, target_actions)predicted_q_values = self.critic(states, actions)critic_loss = nn.MSELoss()(predicted_q_values, target_q_values)
#省略部分见完整版# 初始化环境和DDPG算法
env = LakeEnvironment()
state_dim = 5
action_dim = 5
ddpg_agent = DDPG(state_dim, action_dim)# 训练循环
for episode in range(1000):state = env.statetotal_reward = 0for _ in range(100):  # 假设每个episode有100个时间步action = ddpg_agent.select_action(state)next_state, reward = env.step(action)ddpg_agent.remember(state, action, reward, next_state)ddpg_agent.train()state = next_statetotal_reward += rewardprint(f"Episode {episode + 1}, Total Reward: {total_reward}")

在湖泊水位调控问题中,可以绘制多种图表来帮助可视化和分析模型的性能。以下是一些可能有用的图表类型:

  1. 湖泊水位变化曲线: 对于每个湖泊,绘制模型预测的水位变化曲线,与实际水位进行比较。这有助于了解模型对湖泊水位的调控效果。

  2. 奖励曲线: 绘制训练过程中的奖励曲线,以查看模型在时间内是否成功最大化奖励。这有助于评估模型在学习过程中的表现。

  3. Actor网络输出分布: 对于每个湖泊,绘制Actor网络输出的分布图。这可以显示模型对于不同湖泊的流量调整的倾向性。

  4. Critic网络Q值变化曲线: 对于一些典型状态和动作组合,绘制Critic网络输出的Q值变化曲线。这有助于了解模型对于不同决策的评估。

  5. 经验回放缓存: 如果使用了经验回放,可以绘制回放缓存中不同经验的分布图。这有助于了解模型的训练数据覆盖情况。

  6. 实时水位调控效果: 在模型实际应用中,绘制实时水位调控效果的图表,显示模型对于湖泊水位的实时调整情况。

  7. 湖泊水位与环境变量关系图: 绘制湖泊水位与环境变量(如降水量、温度等)的关系图,以帮助理解水位的影响因素。

import matplotlib.pyplot as plt
import numpy as np# 示例数据,实际中需要替换为模型输出或真实数据
time_steps = np.arange(1, 101)
predicted_water_levels = np.random.uniform(40, 60, size=(5, 100))  # 5个湖泊,每个湖泊100个时间步的水位预测
rewards = np.random.randn(100)# 绘制湖泊水位变化曲线
plt.figure(figsize=(12, 6))
for lake_index in range(predicted_water_levels.shape[0]):plt.plot(time_steps, predicted_water_levels[lake_index], label=f"Lake {lake_index + 1}")plt.title("Predicted Water Level Changes")
plt.xlabel("Time Steps")
plt.ylabel("Water Level")
plt.legend()
plt.show()# 绘制奖励曲线
plt.figure(figsize=(12, 6))
plt.plot(time_steps, rewards, label="Rewards", color="orange")plt.title("Training Rewards")
plt.xlabel("Time Steps")
plt.ylabel("Reward")
plt.legend()
plt.show()# 绘制Actor网络输出分布
lake_actions = np.random.uniform(-1, 1, size=(5, 100))  # 示例数据,实际中需要替换为模型输出
plt.figure(figsize=(12, 6))
for lake_index in range(lake_actions.shape[0]):plt.hist(lake_actions[lake_index], bins=20, alpha=0.5, label=f"Lake {lake_index + 1}")plt.title("Actor Network Output Distribution")
plt.xlabel("Action Value")
plt.ylabel("Frequency")
plt.legend()
plt.show()

在这里插入图片描述

问题三(敏感性分析)

在问题三中,我们的目标是了解湖泊水位调控模型对两个控制坝流出的敏感性。以下是更详细的思路:

方法:敏感性分析

  1. 定义输入参数:

    • 两个控制坝的流出分别作为输入参数。
    • 设定一组基准值作为模型的初始输入。
  2. 执行模型:

    • 使用基准值运行湖泊水位调控模型,记录模型输出(湖泊水位)。
  3. 改变输入参数:

    • 对两个控制坝的流出逐一进行扰动,观察对模型输出的影响。
    • 扰动的方式可以是逐步增加或减小流出量,也可以是随机扰动。
  4. 分析敏感性:

    • 观察模型输出的变化,分析不同流出变化对水位的影响。
    • 使用敏感性指标,如输出变化的标准差或相关性系数,量化模型对流出变化的敏感性。
  5. 重复分析:

    • 对其他可能影响模型输出的参数进行敏感性分析,包括环境变量、湖泊结构等。
    • 综合考虑各参数的敏感性,全面了解模型对输入变化的响应。
  6. 提出建议:

    • 根据敏感性分析的结果,提出可能的控制策略或调整建议,以优化水位调控效果。
    • 考虑是否存在一些流出值的范围,模型对其特别敏感,从而提供更具体的控制建议。

具体的思路:

步骤 1: 定义输入参数和基准值
baseline_flows = [baseline_flow1, baseline_flow2]
步骤 2: 执行模型
model_output_baseline = run_model(baseline_flows)
步骤 3: 改变输入参数并记录模型输出
perturbed_flows1 = perturb_flow(baseline_flow1)  # 可以根据实际情况定义扰动函数
model_output_perturbed1 = run_model([perturbed_flows1, baseline_flow2])perturbed_flows2 = perturb_flow(baseline_flow2)
model_output_perturbed2 = run_model([baseline_flow1, perturbed_flows2])
步骤 4: 分析敏感性
sensitivity_metric_flow1 = calculate_sensitivity(model_output_baseline, model_output_perturbed1)
sensitivity_metric_flow2 = calculate_sensitivity(model_output_baseline, model_output_perturbed2)print("Sensitivity Metric for Flow1:", sensitivity_metric_flow1)
print("Sensitivity Metric for Flow2:", sensitivity_metric_flow2)
步骤 5: 重复分析
# 可以对其他参数进行类似的敏感性分析
步骤 6: 提出建议

根据敏感性分析的结果,提出可能的控制建议,例如在某些流出范围内采取更谨慎的调控策略,或者针对特定条件进行即时调整。

可视化:
在湖泊水位调控问题的敏感性分析中,可以绘制多种图表来可视化模型输出的变化以及不同输入参数对模型的影响。以下是一些可能有用的图表类型:

  1. 水位变化曲线: 绘制不同流出条件下的湖泊水位变化曲线,以直观展示模型输出的变化。

  2. 敏感性指标柱状图: 用柱状图表示不同输入参数的敏感性指标,比较它们对模型输出的影响程度。

  3. 箱线图: 对不同流出条件下的湖泊水位进行箱线图绘制,以展示水位的分布范围和离群值情况。

  4. 散点图: 绘制不同流出条件下的湖泊水位散点图,有助于观察模型输出的分散情况。

  5. 模型输出比较图: 将基准情况和扰动后的两种流出条件下的湖泊水位进行比较,直观了解模型对流出变化的响应。

  6. 流出变化对水位的敏感性图: 以输入参数(两个控制坝的流出)为横轴,敏感性指标为纵轴,绘制敏感性曲线,显示模型对不同流出变化的敏感性。

  7. 扰动流出前后的水位对比图: 绘制基准情况和扰动后两种流出条件下的水位对比图,以直观呈现水位的变化。

在这里插入图片描述

问题四(PPO算法)

对于问题四,即了解算法对环境条件变化(如降水、冬季积雪、冰封)的敏感性,可以考虑使用强化学习中的模型无关(Model-Agnostic)方法。其中,Proximal Policy Optimization (PPO) 是一种常用的算法,因其在处理复杂环境和大规模数据上表现良好而备受青睐。
当使用Proximal Policy Optimization (PPO)算法来解决湖泊水位调控问题时,需要按照以下步骤展开思路:

步骤 1: 定义状态空间和动作空间

  1. 状态空间定义: 将湖泊系统的状态表示为环境条件的集合。例如,考虑降水量、冬季积雪深度、冰封程度等。确保状态空间能够充分描述影响湖泊水位的环境因素。

  2. 动作空间定义: 定义代理(水位调控系统)可以执行的动作。这可能包括调整两个控制坝的流出量,以及其他可能的水位调控策略。确保动作空间允许足够的灵活性以适应不同的环境条件。

步骤 2: 构建强化学习环境

  1. 定义强化学习环境: 创建一个自定义的强化学习环境,继承自gym.Env类。在该环境中,实现resetstep等方法,定义状态、动作、奖励和终止条件。

  2. 奖励函数设计: 设计奖励函数,以鼓励代理学会调整水位以满足各利益相关者的需求。考虑包含惩罚和奖励,使得代理能够在不同的环境条件下学到合适的水位调控策略。

步骤 3: 定义神经网络模型

  1. 神经网络结构: 定义一个神经网络模型,例如使用PyTorch或其他深度学习库。该模型的输入应为环境的状态,输出为动作的概率分布。可以选择多层感知机(MLP)或其他适用的神经网络结构。

步骤 4: 使用PPO算法进行训练

  1. 安装相关库: 确保已安装需要的库,如Stable Baselines3等。

  2. 初始化PPO模型: 使用定义的神经网络模型初始化PPO算法模型。选择适当的超参数,例如学习率、折扣因子等。

  3. 训练模型: 在环境中使用PPO算法对代理进行训练,通过迭代学习策略以最大化累积奖励。

from stable_baselines3 import PPO
from stable_baselines3.common.envs import DummyVecEnv# 初始化环境
env = LakeControlEnvironment()
env = DummyVecEnv([lambda: env])  # 将环境封装为向量环境# 初始化神经网络模型
policy_model = PolicyNetwork()# 初始化PPO模型
ppo_model = PPO(policy_model, env, verbose=1)# 训练模型
ppo_model.learn(total_timesteps=100000)

步骤 5: 评估模型性能

  1. 使用训练后的模型进行评估: 在独立的测试集上评估PPO模型的性能,观察其在不同环境条件下的水位调控表现。
# 评估模型性能
mean_reward, _ = evaluate_policy(ppo_model, env, n_eval_episodes=10)
print(f"Mean Reward: {mean_reward}")

在湖泊水位调控问题中,可以使用多种图表来可视化模型的输出、环境变化和算法的性能。以下是一些可能有用的图表类型:

  1. 水位变化曲线: 绘制不同流出条件下湖泊水位的变化曲线,以观察模型对水位的调控效果。

  2. 奖励曲线: 绘制训练过程中的奖励曲线,以了解模型在学习过程中的表现。

  3. 状态空间分布图: 使用散点图或箱线图显示不同状态变量的分布情况,以便观察环境条件的变化。

  4. 动作分布图: 使用柱状图显示模型输出的动作分布情况,以了解模型在不同状态下的行为。

  5. 敏感性分析图: 绘制敏感性分析图,显示不同环境变化对水位调控算法的影响。

  6. 环境变化曲线: 如果有多个环境变量(如降水、冬季积雪、冰封等),可以绘制它们随时间的变化曲线,以观察不同因素的影响。

  7. 水位对比图: 将模型预测的水位与实际水位进行对比,以评估模型的准确性。

  8. 流出控制策略图: 如果模型输出是流出控制策略,可以使用线图或面积图显示不同时间点上的流出量。

  9. 学习曲线: 显示模型训练过程中的学习曲线,包括奖励、损失等随时间的变化。

在这里插入图片描述

问题五(SNA分析)

对于问题五,即关注对影响安大略湖水位的利益相关者和因素进行广泛分析,你可以考虑使用社会网络分析(Social Network Analysis,SNA)来研究不同利益相关者之间的关系和影响。

方法:社会网络分析(Social Network Analysis)
社会网络分析是一种研究人际关系、组织结构和信息传播等社会现象的方法。在水位调控问题中,利益相关者可以被视为网络中的节点,而它们之间的关系和相互影响可以通过边来表示。通过分析这种网络结构,你可以更好地理解各利益相关者之间的关联,以及他们对水位调控决策的影响力。
理解和实施社会网络分析(Social Network Analysis,SNA)需要一系列详细的步骤。以下是对使用SNA来解决问题五的详细展开:

步骤 1: 确定利益相关者

首先,明确定义问题中的利益相关者。这可能包括政府机构、环保组织、当地居民、产业代表、旅游部门等。确保列出所有可能涉及到湖泊水位调控的主体。

步骤 2: 构建社会网络

2.1 定义节点

每个利益相关者被视为网络中的一个节点。创建一个节点列表,每个节点代表一个利益相关者。例如:

nodes = ["Government", "Environmental Organization", "Local Residents", "Industry", "Tourism Sector"]
2.2 定义边

边表示节点之间的关系。这可以是合作、冲突、信息交流等关系。创建一个边的列表,每个边包含两个节点之间的关系。例如:

edges = [("Government", "Environmental Organization"), ("Government", "Local Residents"), ("Industry", "Local Residents")]
2.3 创建网络图

使用 NetworkX 库创建一个图,并将节点和边添加到图中:

import networkx as nx# 创建网络图
G = nx.Graph()# 添加节点和边
G.add_nodes_from(nodes)
G.add_edges_from(edges)

步骤 3: 可视化网络图

使用 Matplotlib 或其他绘图库可视化网络图,以便更直观地了解节点之间的关系。这可以帮助你初步了解网络结构。

import matplotlib.pyplot as plt# 选择布局算法
pos = nx.spring_layout(G)# 绘制网络图
nx.draw(G, pos, with_labels=True, font_weight='bold', node_color='skyblue', node_size=1000, edge_color='gray')
plt.show()

步骤 4: 中心性分析

中心性度量帮助你识别在网络中具有重要影响力的节点。使用 NetworkX 计算各节点的中心性度量。

# 计算度中心性
degree_centrality = nx.degree_centrality(G)
print("Degree Centrality:", degree_centrality)

你还可以计算其他中心性度量,如介数中心性、接近中心性等。

步骤 5: 社群检测

社群检测有助于识别在网络中彼此紧密连接的子群。常用的社群检测算法包括 Louvain 算法。

import community# 使用 Louvain 算法进行社群检测
partition = community.best_partition(G)
print("Community Detection:", partition)

步骤 6: 影响力分析

结合中心性度量和社群检测结果,分析不同利益相关者的影响力。注意在决策过程中,拥有更高中心性的节点可能具有更大的影响力。
可视化:
在社会网络分析中,可以通过绘制不同类型的图表来更好地理解网络的结构和关系。以下是一些你可以绘制的图表:

  1. 节点关系图: 使用节点关系图可视化网络中各节点之间的连接关系。这是最基本的图表类型,可以用来展示网络的整体结构。

  2. 中心性分布图: 对各节点的中心性度量进行分布图可帮助你了解哪些节点在网络中更为中心。你可以使用直方图或箱线图表示度中心性、介数中心性等。

  3. 社群结构图: 如果进行了社群检测,你可以绘制社群结构图,显示网络中不同社群的分布和关系。

  4. 影响力图: 结合中心性度量和社群检测结果,绘制影响力图,显示网络中最具影响力的节点和它们的相互作用。

  5. 网络布局图: 不同的网络布局算法可以呈现不同的视觉效果。例如,Spring Layout、Circular Layout、Kamada-Kawai Layout等。选择适当的布局可更清晰地展示网络结构。

  6. 节点属性图: 如果节点具有其他属性(如权重、类别等),你可以绘制节点属性图,以观察这些属性在网络中的分布。

  7. 演化图: 如果有时间序列数据,可以绘制演化图,显示网络随时间的变化。这对于观察网络的演进过程很有帮助。

  8. 二维矩阵图: 对于较小的网络,你可以使用二维矩阵图,其中矩阵的行和列分别代表节点,矩阵元素表示它们之间的关系。

在这里插入图片描述

更多内容可以点击下方名片详细了解,让小鹿学长带你冲刺美赛夺奖之路!
敬请期待我们的努力所做出的工作!记得关注 鹿鹿学长呀!

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

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

相关文章

Unity C#高级特性 Partial 详细使用案例

文章目录 实例 1&#xff1a;分隔UI逻辑实例 2&#xff1a;Unity编辑器自动生成代码实例 3&#xff1a;数据模型分割实例 4&#xff1a;序列化扩展实例 5&#xff1a;多视图架构实例 6&#xff1a;Unity编辑器自定义 inspectors 在Unity中&#xff0c;部分类&#xff08;Partia…

jsp服装穿搭推荐系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

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

Elasticsearch-内存结构

ElasticSearch的内存从大的结构可以分堆内存&#xff08;On Heap&#xff09;和堆外内存&#xff08;Off Heap&#xff09;。Off Heap部分由Lucene进行管理。On Heap部分存在可GC部分和不可GC部分&#xff0c;可GC部分通过GC回收垃圾对象&#xff0c;从而释放内存。不可GC部分不…

第九节HarmonyOS 常用基础组件22-Marquee

1、描述 跑马灯组件&#xff0c;用于滚动展示一段单行文本&#xff0c;仅当文本内容宽度超过跑马灯组件宽度时滚动。 2、接口 Marquee(value:{start:boolean, step?:number, loop?:number, fromStart?: boolean ,src:string}) 3、参数 参数名 参数类型 必填 描述 st…

qt -chart控件设计器可拖拉

qt -chart控件设计器可拖拉 一、演示效果二、安装过程三、核心程序四、程序链接 一、演示效果 二、安装过程 三、核心程序 #include <QtGui> #include <QColor>#include <cstdlib> #include <cassert> #include <numeric>#include <chartwor…

【Java程序设计】【C00232】基于Springboot的抗疫物资管理系统(有论文)

基于Springboot的抗疫物资管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的抗疫物资管理系统 用户主要分为管理员和普通用户 管理员&#xff1a; 管理员可以对后台数据进行管理、拥有最高权限、具体权限有…

【LLM KBQA】FlexKBQA:一种结合LLM的KBQA框架

前言 大语言模型&#xff08;LLMs&#xff09;在知识库问答&#xff08;KBQA&#xff09;领域的应用主要集中在包括但不限于以下几个方面&#xff1a; 直接生成答案&#xff1a;一些方法直接利用LLMs生成答案&#xff0c;而不是生成中间的程序&#xff08;如SPARQL查询&#…

算法学习——华为机考题库3(HJ21 - HJ25)

算法学习——华为机考题库3&#xff08;HJ21 - HJ30&#xff09; HJ21 简单密码 描述 现在有一种密码变换算法。 九键手机键盘上的数字与字母的对应&#xff1a; 1–1&#xff0c; abc–2, def–3, ghi–4, jkl–5, mno–6, pqrs–7, tuv–8 wxyz–9, 0–0&#xff0c;把密码…

Vue3.0(一):Vue的引入-options api-模板语法

Vue的引入方式 CDN方式进行引入 将以下 script标签引入即可 <script src"https://unpkg.com/vue3/dist/vue.global.js"></script><!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><met…

Linux下tar命令详解

tar #归档命令 格式 • Tar -参数 [args]..... 参数&#xff1a; 必选参数&#xff1a; 辅助参数&#xff1a; 额外参数&#xff1a; # 打包时排除某个文件 tar cf 文件名.tar --exclude路径/文件 路径 注&#xff1a;此处的路径前后需要保持保持一致&#xff0c;统一…

使用 IDEA 开发一个简单易用的 SDK

目录 一、什么是 SDK 二、为什么要开发 SDK 三、开发 SDK 的详细步骤 四、导入 SDK 进行测试 附&#xff1a;ConfigurationProperties 注解的介绍及使用 一、什么是 SDK 1. 定义&#xff1a;软件开发工具包 Software Development Kit 2. 用于开发特定软件或应用程序的工…

Javascript | JS如何断点测试(WebStorm)

JavaScript的断点与之前所学到的Java和python在jetbrain系列编辑器中的断点debug不太一样&#xff0c;往常我们在编写python的时候用pycharm的时候是直接断点进入debug的&#xff0c;就像下面这样 只要直接在代码中断点&#xff0c;然后运行debug功能即可 但是在WebStorm中不是…

【Tomcat与网络3】Tomcat的整体架构

目录 1.演进1&#xff1a;将连接和处理服务分开 2演进2&#xff1a;Container的演进 3 再论Tomcat的容器结构 4 Tomcat处理请求的过程 5 请求的处理过程与Pipeline-Valve管道 在前面我们介绍了Servlet的基本原理&#xff0c;本文我们结合Tomcat来分析一下如何设计一个大型…

【tensorflow 版本 keras版本】

#. 安装tensorflow and keras&#xff0c; 总是遇到版本无法匹配的问题。 安装之前先查表 https://master--floydhub-docs.netlify.app/guides/environments/ 1.先确定你的python version 2.再根据下面表&#xff0c;确定安装的tesorflow, keras

如何用gpt快速做好数据分析?

由于技术限制&#xff0c;目前InfinitePaper AI仅支持上传1份文件&#xff0c;且大小不超过10M。但是&#xff0c;在强大的代码解释器面前&#xff0c;这都是小问题。我们只需要将可能用到的文件打包成压缩文件上传即可&#xff0c;之后要求GPT直接解压就能正常完成后续需求。 …

Unity 读取指定目录所占内存大小

public static class TxxTool{#region 读取文件大小private static List<string> DirList new List<string>();public static long GetFileSize(string path){DirList new List<string>();DirList.Add(path);GetAllDirecotries(path);long fileSize 0;for…

【深度学习】基于PyTorch架构神经网络学习总结(基础概念基本网络搭建)

神经网络整体架构 类似于人体的神经元 神经网络工作原来为层次结构&#xff0c;一层一层的变换数据。如上述示例有4层&#xff0c;1层输入层、2层隐藏层、1层输出层神经元&#xff1a;数据的量或矩阵的大小&#xff0c;如上述示例中输入层中有三个神经元代表输入数据有3个特征…

虚幻UE 特效-Niagara特效实战-魔法阵

回顾Niagara特效基础知识&#xff1a;虚幻UE 特效-Niagara特效初识 其他四篇实战&#xff1a;UE 特效-Niagara特效实战-烟雾、喷泉、 虚幻UE 特效-Niagara特效实战-火焰、烛火、 虚幻UE 特效-Niagara特效实战-雨天、 虚幻UE 特效-Niagara特效实战-眩晕。 本篇笔记记录了使用空模…

代码随想录算法训练营29期|day38 任务以及具体安排

第九章 动态规划part01 509. 斐波那契数 //非压缩状态的版本 class Solution {public int fib(int n) {if (n < 1) return n; int[] dp new int[n 1];dp[0] 0;dp[1] 1;for (int index 2; index < n; index){dp[index] dp[index - 1] dp[index - 2];}r…

二叉树(1)

1 树概念及结构 1.1树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。 把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有一个特殊的结点&a…