洪水灾害多智能体分布式模拟示例代码

1. 环境定义:支持灾害动态、地理数据和分布式架构

import numpy as np
import random
import matplotlib.pyplot as plt# 新疆主要城市及邻接关系
XINJIANG_CITIES = {'Urumqi': ['Changji', 'Shihezi'],'Changji': ['Urumqi', 'Shihezi', 'Turpan'],'Shihezi': ['Urumqi', 'Changji', 'Karamay'],'Karamay': ['Shihezi'],'Turpan': ['Changji']
}CITY_COORDINATES = {'Urumqi': (43.8256, 87.6168),'Changji': (44.0169, 87.3082),'Shihezi': (44.3024, 86.0369),'Karamay': (45.5798, 84.8892),'Turpan': (42.9513, 89.1895)
}class XinjiangFloodEnvironment:def __init__(self, cities, max_steps=50, disaster_spread_prob=0.3):"""新疆多城市洪水灾害环境。参数:- cities: 城市及邻接关系字典。- max_steps: 每回合最大步数。- disaster_spread_prob: 灾害扩散概率。"""self.cities = citiesself.city_list = list(cities.keys())self.num_cities = len(self.city_list)self.max_steps = max_stepsself.disaster_spread_prob = disaster_spread_probself.reset()def reset(self):""" 重置环境,初始化灾害和资源分布。 """self.steps = 0self.disaster_status = {city: 0 for city in self.city_list}  # 灾害状态:0为无灾,1为灾害中self.resource_status = {city: 5 for city in self.city_list}  # 每城市初始资源disaster_city = random.choice(self.city_list)self.disaster_status[disaster_city] = 1  # 随机选择灾害城市return self._get_state()def _get_state(self):""" 获取当前状态,包含灾害和资源信息。 """return {'disaster_status': self.disaster_status,'resource_status': self.resource_status}def _spread_disaster(self):""" 模拟灾害扩散。 """new_disaster_status = self.disaster_status.copy()for city, status in self.disaster_status.items():if status == 1:  # 当前城市有灾害for neighbor in self.cities[city]:if random.random() < self.disaster_spread_prob:new_disaster_status[neighbor] = 1self.disaster_status = new_disaster_statusdef step(self, actions):"""执行动作。参数:- actions: 每个城市的动作字典 {city: allocated_resources}。返回:- 下一状态- 总奖励- 是否结束"""total_reward = 0for city, allocated_resources in actions.items():if self.disaster_status[city] == 1:  # 如果该城市有灾害if allocated_resources > 0:self.resource_status[city] -= allocated_resourcesif self.resource_status[city] < 0:  # 资源不能为负allocated_resources += self.resource_status[city]self.resource_status[city] = 0self.disaster_status[city] = 0  # 灾害解决total_reward += 10  # 成功解决灾害else:total_reward -= 5  # 未响应灾害的惩罚self.steps += 1if self.steps >= self.max_steps or sum(self.disaster_status.values()) == 0:return self._get_state(), total_reward, True  # 所有灾害解决或步数结束# 更新灾害状态(灾害扩散)self._spread_disaster()return self._get_state(), total_reward, False  # 继续运行def render(self):""" 可视化当前环境状态。 """disaster_cities = [city for city, status in self.disaster_status.items() if status == 1]print(f"Step {self.steps}:")print(f"Disaster Cities: {disaster_cities}")print(f"Resource Status: {self.resource_status}")plt.figure(figsize=(8, 8))for city, (lat, lon) in CITY_COORDINATES.items():plt.scatter(lon, lat, color='blue' if city in self.resource_status else 'red', s=100)plt.text(lon, lat, city, fontsize=10)plt.xlabel("Longitude")plt.ylabel("Latitude")plt.title("Xinjiang Flood Simulation")plt.show()

2. 分布式多智能体实现

class DistributedAgent:def __init__(self, city, action_size):"""分布式智能体。参数:- city: 智能体负责的城市。- action_size: 动作空间大小。"""self.city = cityself.action_size = action_sizeself.epsilon = 1.0  # 探索概率self.epsilon_decay = 0.995self.epsilon_min = 0.01def act(self, state, available_resources):""" 基于当前状态和资源选择动作。 """if np.random.rand() <= self.epsilon:return random.randint(0, available_resources)  # 随机分配资源return available_resources  # 简化决策:全分配def update_epsilon(self):""" 衰减探索概率。 """if self.epsilon > self.epsilon_min:self.epsilon *= self.epsilon_decay

3. 动态奖励函数

def calculate_reward(disaster_map, response_time, resources_used, weights):"""计算动态奖励。参数:- disaster_map: 当前灾害状态。- response_time: 当前响应时间。- resources_used: 当前使用的资源量。- weights: 奖励函数的权重 (dict)。返回:- reward: 总奖励值。"""covered_disasters = disaster_map.sum()  # 未解决的灾害数量return (weights['covered'] * (1 - covered_disasters) -weights['time'] * response_time -weights['resources'] * resources_used)

4. 主训练循环

if __name__ == "__main__":env = XinjiangFloodEnvironment(XINJIANG_CITIES)  # 初始化环境agents = {city: DistributedAgent(city, 5) for city in XINJIANG_CITIES.keys()}  # 每城市一个智能体episodes = 100  # 训练轮次for e in range(episodes):state = env.reset()  # 重置环境total_reward = 0while True:actions = {}for city, agent in agents.items():available_resources = state['resource_status'][city]actions[city] = agent.act(state, available_resources)  # 每个智能体选择动作next_state, reward, done = env.step(actions)  # 执行动作total_reward += rewardif done:print(f"Episode {e+1}/{episodes}, Total Reward: {total_reward}")env.render()breakstate = next_state# 更新每个智能体的探索概率for agent in agents.values():agent.update_epsilon()

功能扩展与总结

  1. 灾害动态扩展

    • 灾害通过邻接城市扩散。
    • 动态更新灾害状态,提升模拟真实性。
  2. 多智能体分布式协作

    • 每个智能体管理自己城市的资源。
    • 集中式奖励计算与全局决策评估。
  3. 动态奖励函数

    • 同时优化响应时间、资源成本和覆盖范围。
  4. 新疆地理数据支持

    • 模拟新疆主要城市及其邻接关系。
    • 地理坐标可视化,帮助分析决策动态。

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

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

相关文章

华为麦芒5(安卓6)termux记录 使用ddns-go,alist

下载0.119bate1版,不能换源,其他源似乎都用不了,如果root可以直接用面具模块 https://github.com/termux/termux-app/releases/download/v0.119.0-beta.1/termux-app_v0.119.0-beta.1apt-android-5-github-debug_arm64-v8a.apk 安装ssh(非必要) pkg install openssh开启ssh …

FPC在蓝牙耳机中有哪些应用?【新立电子】

随着科技的进步和消费者需求的提升&#xff0c;耳机已经从传统的有线连接转变为现在的无线蓝牙耳机&#xff0c;真正做到了便捷出行与极佳的用户体验。而FPC在蓝牙耳机中的应用主要体现在优化耳机的设计与性能上。 蓝牙耳机&#xff0c;主要使用方式是与手机、电脑等移动设备通…

《计算机组成及汇编语言原理》阅读笔记:p121-p122

《计算机组成及汇编语言原理》学习第 8 天&#xff0c;p121-p122 总结&#xff0c;总计 2 页。 一、技术总结 1.memory优化 (1)cache memory remove blank from “Most computers support two different kinds (levels) of cache: level one (L1) cache is built into the …

ffmpeg: stream_loop报错 Error while filtering: Operation not permitted

问题描述 执行ffmpeg命令的时候&#xff0c;报错&#xff1a;Error while filtering: Operation not permitted 我得命令如下 ffmpeg -framerate 25 -y -i /data/workerspace/mtk/work_home/mtk_202406111543-l9CSU91H1f1b3/tmp/%08d.png -stream_loop -1 -i /data/workerspa…

【微信小程序】1|底部图标 | 我的咖啡店-综合实训

底部图标 引言 在微信小程序开发中&#xff0c;底部导航栏&#xff08;tabBar&#xff09;是用户界面的重要组成部分&#xff0c;它为用户提供了快速切换不同页面的功能。今天&#xff0c;我们将通过一个实际案例——“我的咖啡店”小程序&#xff0c;来详细解析如何配置底部图…

c++编译过程初识

编译过程 预处理&#xff1a;主要是执行一些预处理指令&#xff0c;主要是#开头的代码&#xff0c;如#include 的头文件、#define 定义的宏常量、#ifdef #ifndef #endif等条件编译的代码&#xff0c;具体包括查找头文件、进行宏替换、根据条件编译等操作。 g -E example.cpp -…

Springboot高并发乐观锁

Spring Boot分布式锁的主要缺点包括但不限于以下几点&#xff1a; 性能开销&#xff1a;使用分布式锁通常涉及到网络通信&#xff0c;这会引入额外的延迟和性能开销。例如&#xff0c;当使用Redis或Zookeeper实现分布式锁时&#xff0c;每次获取或释放锁都需要与这些服务进行交…

揭秘 Fluss 架构组件

这是 Fluss 系列的第四篇文章了&#xff0c;我们先回顾一下前面三篇文章主要说了哪些内容。 Fluss 部署&#xff0c;带领大家部署Fluss 环境&#xff0c;体验一下 Fluss 的功能Fluss 整合数据湖的操作&#xff0c;体验Fluss 与数据湖的结合讲解了 Fluss、Kafka、Paimon 之间的…

leetcode82:删除链表中的重复元素II

原题地址&#xff1a;82. 删除排序链表中的重复元素 II - 力扣&#xff08;LeetCode&#xff09; 题目描述 给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 示例 1&#xff1a; 输入&…

【面试经典】多数元素

链接&#xff1a;169. 多数元素 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 在本文中&#xff0c;“数组中出现次数超过一半的数字” 被称为 “众数” 。 需要注意的是&#xff0c;数学中众数的定义为 “数组中出现次数最多的数字” &#xff0c;与本文定…

AT24C02学习笔记

看手册&#xff1a; AT24Cxx xx代表能写入xxK bit(xx K)/8 byte 内部写周期很关键&#xff0c;代表每一次页写或字节写结束后时间要大于5ms&#xff08;延时5ms确保完成写周期&#xff09;&#xff0c;否则时序会出错。 页写&#xff1a;型不同号每一页可能写入不同大小的…

蓝牙BLE开发——解决iOS设备获取MAC方式

解决iOS设备获取MAC方式 uniapp 解决 iOS 获取 MAC地址&#xff0c;在Android、iOS不同端中互通&#xff0c;根据MAC 地址处理相关的业务场景&#xff1b; 文章目录 解决iOS设备获取MAC方式监听寻找到新设备的事件BLE工具效果图APP监听设备返回数据解决方式ArrayBuffer转16进制…

01 Oracle 基本操作

Oracle 基本操作 初使用步骤 1.创建表空间 2.创建用户、设置密码、指定表空间 3.给用户授权 4.切换用户登录 5.创建表 注意点&#xff1a;oracle中管理表的基本单位是用户 文章目录 了解Oracle体系结构 1.创建表空间**2.删除表空间**3.创建用户4.给用户授权5.切换用户登录6.表操…

独一无二,万字详谈——Linux之文件管理

Linux文件部分的学习&#xff0c;有这一篇的博客足矣! 目录 一、文件的命名规则 1、可以使用哪些字符&#xff1f; 2、文件名的长度 3、Linux文件名的大小写 4、Linux文件扩展名 二、文件管理命令 1、目录的创建/删除 &#xff08;1&#xff09;、目录的创建 ① mkdir…

rust windwos 两个edit框

use winapi::shared::minwindef::LOWORD; use windows::{core::*,Win32::{Foundation::*,Graphics::Gdi::{BeginPaint, EndPaint, PAINTSTRUCT},System::LibraryLoader::GetModuleHandleA,UI::WindowsAndMessaging::*,}, };// 两个全局静态变量&#xff0c;用于保存 Edit 控件的…

解锁成长密码:探寻刻意练习之道

刻意练习&#xff0c;真有那么神&#xff1f; 在生活中&#xff0c;你是否有过这样的困惑&#xff1a;每天苦练英语口语&#xff0c;可一到交流时还是支支吾吾&#xff1b;埋头苦学吉他&#xff0c;却总是卡在几个和弦转换上&#xff1b;工作多年&#xff0c;业务能力却似乎陷入…

WPS中如何为指定区域的表格添加行或者列,同时不影响其它表格?

大家好&#xff0c;我是小鱼。 日常工作中会遇到这种情况&#xff1a;在一个Excel工作表中有多个表格&#xff0c;因为后期数据量增加就需要为指定区域的表格添加行或者列&#xff0c;但是不能影响其它表格。这种情况下我们应该怎么操作呢&#xff1f; 为指定区域的表格添加行…

Gitlab17.7+Jenkins2.4.91实现Fastapi项目持续发布版本详细操作(亲测可用)

一、gitlab设置&#xff1a; 1、进入gitlab选择主页在左侧菜单的下面点击管理员按钮。 2、选择左侧菜单的设置&#xff0c;选择网络&#xff0c;在右侧选择出站请求后选择允许来自webhooks和集成对本地网络的请求 3、webhook设置 进入你自己的项目选择左侧菜单的设置&#xff…

模型工作流:自动化的模型内部三角面剔除

1. 关于自动减面 1.1 自动减面的重要性及现状 三维模型是游戏、三维家居设计、数字孪生、VR/AR等几乎所有三维软件的核心资产&#xff0c;模型的质量和性能从根本上决定了三维软件的画面效果和渲染性能。其中&#xff0c;模型减面工作是同时关乎质量和性能这两个要素的重要工…

Unity微信小游戏接入开放数据域

demo地址&#xff1a;https://github.com/wechat-miniprogram/minigame-unity-webgl-transform/tree/main/Demo/Ranking 官方说明&#xff1a; https://github.com/wechat-miniprogram/minigame-unity-webgl-transform/blob/main/Design/OpenData.md 准备一个Canvas&#xff0c…