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

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 = cities
        self.city_list = list(cities.keys())
        self.num_cities = len(self.city_list)
        self.max_steps = max_steps
        self.disaster_spread_prob = disaster_spread_prob
        self.reset()

    def reset(self):
        """ 重置环境,初始化灾害和资源分布。 """
        self.steps = 0
        self.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] = 1
        self.disaster_status = new_disaster_status

    def step(self, actions):
        """
        执行动作。
        参数:
        - actions: 每个城市的动作字典 {city: allocated_resources}。
        返回:
        - 下一状态
        - 总奖励
        - 是否结束
        """
        total_reward = 0

        for city, allocated_resources in actions.items():
            if self.disaster_status[city] == 1:  # 如果该城市有灾害
                if allocated_resources > 0:
                    self.resource_status[city] -= allocated_resources
                    if self.resource_status[city] < 0:  # 资源不能为负
                        allocated_resources += self.resource_status[city]
                        self.resource_status[city] = 0
                    self.disaster_status[city] = 0  # 灾害解决
                    total_reward += 10  # 成功解决灾害
                else:
                    total_reward -= 5  # 未响应灾害的惩罚

        self.steps += 1
        if 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 = city
        self.action_size = action_size
        self.epsilon = 1.0  # 探索概率
        self.epsilon_decay = 0.995
        self.epsilon_min = 0.01

    def 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 = 0

        while 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 += reward

            if done:
                print(f"Episode {e+1}/{episodes}, Total Reward: {total_reward}")
                env.render()
                break

            state = next_state

        # 更新每个智能体的探索概率
        for agent in agents.values():
            agent.update_epsilon()

功能扩展与总结

  1. 灾害动态扩展

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Tauri2+Leptos开发桌面应用--Sqlite数据库操作

在之前工作&#xff08;使用Tauri Leptos开发带系统托盘桌面应用-CSDN博客&#xff09;的基础上&#xff0c;继续尝试对本地Sqlite数据库进行读、写、删除操作&#xff0c;开发环境还是VS CodeRust-analyzer。 最终程序界面如下&#xff1a; 主要参考文章&#xff1a;Building…

设计模式之状态模式:自动售货机的喜怒哀乐

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 一、状态模式概述 \quad 在我们的日常生活中&#xff0c;很多事物都具有不同的状态。比如我们经常使用的自动售货机&#xff0c;它就具有多种状态…

4.银河麒麟V10(ARM) 离线安装 MySQL

1. 系统版本 [rootga-sit-cssjgj-db-01u ~]# nkvers ############## Kylin Linux Version ################# Release: Kylin Linux Advanced Server release V10 (Lance)Kernel: 4.19.90-52.39.v2207.ky10.aarch64Build: Kylin Linux Advanced Server release V10 (SP3) /(La…

多模态论文笔记——LLaVA

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍多模态模型&#xff1a;LLaVA。处理包含图像和文本的多模态数据&#xff0c;并生成合理准确的回答。 文章目录 论文模型架构视觉编码器语言模型多模态融…

【Sentinel】初识Sentinel

目录 1.1.雪崩问题及解决方案 1.1.1.雪崩问题 1.1.2.超时处理 1.1.3.仓壁模式 1.1.4.断路器 1.1.5.限流 1.1.6.总结 1.2.服务保护技术对比 1.3.Sentinel介绍和安装 1.3.1.初识Sentinel 1.3.2.安装Sentinel 1.4.微服务整合Sentinel 1.1.雪崩问题及解决方案 1.1.1.…

[A-24][V-09]ARMv8/v9-SMMU工作场景与SMMU的虚拟化架构

ver0.1 [看前序文章有惊喜,关注W\X\G=Z+H=“浩瀚架构师”,可以解锁全部文章] 前言 我们在介绍ARM的内存体系的时候,行文中经常讲MMU比作PE-Cores的带刀护卫。按照这个逻辑,那么SMMU也可以称之为总线上各个Master(设备)的带刀护卫,利刃出鞘之后,任何驱动送过来的地址都…

WebRTC服务质量(10)- Pacer机制(02) RoundRobinPacketQueue

WebRTC服务质量&#xff08;01&#xff09;- Qos概述 WebRTC服务质量&#xff08;02&#xff09;- RTP协议 WebRTC服务质量&#xff08;03&#xff09;- RTCP协议 WebRTC服务质量&#xff08;04&#xff09;- 重传机制&#xff08;01) RTX NACK概述 WebRTC服务质量&#xff08;…

硬件设计-时钟振荡器

目录 摘要 壳式晶振 正常工作条件 摘要 本章主要介绍了晶振的分类、各项参数的意义、特点&#xff0c;同时也介绍了时钟抖动的成因、测量 方法、消除措施和典型滤波电路&#xff0c;使得我们可以正确地选择和使用晶振。 壳式晶振 如图 所示&#xff0c;壳式晶振的名字来源于…

Redis基础知识分享(含5种数据类型介绍+增删改查操作)

一、redis基本介绍 1.redis的启动 服务端启动 pythonubuntu:~$ redis-server客户端启动 pythonubuntu:~$ redis-cli <127.0.0.1:6379> exit pythonubuntu:~$ redis-cli --raw //(支持中文的启动方式) <127.0.0.1:6379> exit2.redis基本操作 ping发送给服务器…

sql字段值转字段

表alertlabel中记录变字段 如何用alertlabel表得到下面数据 实现的sql语句 select a.AlertID, (select Value from alertlabel where AlertIDa.AlertID and Labelhost) as host, (select Value from alertlabel where AlertIDa.AlertID and Labeljob) as job from (select …

llamafactory报错:双卡4090GPU,训练qwen2.5:7B、14B时报错GPU显存不足(out of memory),轻松搞定~~~

实际问题场景&#xff1a; 使用llamafactory进行微调qwen2.5 7B和14B的大模型时&#xff0c;会出现out of memory的报错。尝试使用降低batch_size&#xff08;原本是2&#xff0c;现在降到1&#xff09;的方式&#xff0c;可以让qwen2.5:7B跑起来&#xff0c;但时不时会不稳定…

【hackmyvm】hacked靶机wp

tags: HMVrootkitDiamorphine Type: wp 1. 基本信息^toc 文章目录 1. 基本信息^toc2. 信息收集2.1. 端口扫描2.2. 目录扫描2.3. 获取参数 3. 提权 靶机链接 https://hackmyvm.eu/machines/machine.php?vmHacked 作者 sml 难度 ⭐️⭐️⭐️⭐️️ 2. 信息收集 2.1. 端口扫描…

.NET平台用C#通过字节流动态操作Excel文件

在.NET开发中&#xff0c;通过字节流动态操作Excel文件提供了一种高效且灵活的方式处理数据。这种方法允许开发者直接在内存中创建、修改和保存Excel文档&#xff0c;无需依赖直接的文件储存、读取操作&#xff0c;从而提高了程序的性能和安全性。使用流技术处理Excel不仅简化了…

应用层1——C/S、P2P、DNS域名系统

目录 一、网络应用模型 1、C/S 2、p2p模型 二、域名解析系统DNS 1、为什么有DNS系统&#xff1f; 2、域名的特点 3、DNS域名系统原理 4、递归查询、迭代查询 5、常用的根域名与顶级域名 一、网络应用模型 1、C/S 客户/服务器模型 客户请求服务&#xff0c;服务器提供…

【疑难杂症】 HarmonyOS NEXT中Axios库的响应拦截器无法拦截424状态码怎么办?

今天在开发一个HarmonyOS NEXT的应用的时候&#xff0c;发现http接口如果返回的状态码是424时&#xff0c;我在axios中定义的拦截器失效了。直接走到了业务调用的catch中。 问题表现&#xff1a; 我的拦截器代码如下&#xff1a; 解决办法&#xff1a; 先说解决办法&#xff…

在Windows上读写Linux磁盘镜像的一种方法

背景 嵌入式开发中&#xff0c;经常会把系统的Linux磁盘镜像保存到Windows上&#xff0c;以便上传到网盘备份或发送给工厂&#xff0c;但是如果想读取/修改镜像中的某个文件&#xff0c;一般有2种方案&#xff1a; 直接访问 就是用虚拟磁盘软件将镜像文件挂载成磁盘&#xf…

ffmpeg之显示一个yuv照片

显示YUV图片的步骤 1.初始化SDL库 目的&#xff1a;确保SDL库正确初始化&#xff0c;以便可以使用其窗口、渲染和事件处理功能。操作&#xff1a;调用 SDL_Init(SDL_INIT_VIDEO) 来初始化SDL的视频子系统。 2.创建窗口用于显示YUV图像&#xff1a; 目的&#xff1a;创建一个…

Windows下播放文件作为麦克风声源的一种方式

近期测试一种外语的ASR识别成功率&#xff0c;样本素材是懂这门语言的同事录制的mp3文件。测试client端原本是从麦克风拾音生成媒体流的。 这样&#xff0c;就需要想办法把mp3文件转换为测试client的输入声音。物理方式上&#xff0c;可以用一根音频线&#xff0c;把电…

如何在网页端使用 IDE 高效地阅读 GitHub 源码?

如何在网页端使用 IDE 高效地阅读 GitHub 源码&#xff1f; 前言什么是 GitHub1s&#xff1f;使用 GitHub1s 阅读 browser-use 项目源码步骤 1: 打开 GitHub 项目页面步骤 2: 修改 URL 使用 GitHub1s步骤 3: 浏览文件结构步骤 4: 使用代码高亮和智能补全功能步骤 5: 快速跳转和…

Microsoft word@【标题样式】应用不生效(主要表现为在导航窗格不显示)

背景 随笔。Microsoft word 2013基础使用&#xff0c;仅做参考和积累。 问题 Microsoft word 2013&#xff0c;对段落标题文字应用【标题样式】不生效&#xff08;主要表现为在导航窗格不显示&#xff09;。 图1 图2 观察图1和图2&#xff0c;发现图1的文字在应用【标题一】样…