当前位置: 首页 > article >正文

探索城市空中交通的未来:基于Python的仿真与优化

随着城市空中交通(Urban Air Mobility, UAM)逐渐从科幻走向现实,如何有效管理空域资源和优化无人机调度成为一个极具挑战性的研究方向。本篇博客将带您深入探索如何使用Python构建一个简化版的城市空中交通管理系统仿真环境,通过自定义环境、实现调度策略并评估系统性能,为未来UAM系统的设计提供思路。

1. 为什么选择Python和Gym?

Python 是科学计算和机器学习领域的首选语言,而 OpenAI Gym 则是强化学习研究的标准工具。Gym 提供了灵活的接口设计,允许用户轻松定义自定义环境并进行策略测试。

通过本示例代码,您将学会如何:

  • 使用 Gym 构建一个二维网格化的城市空中交通模拟环境;

  • 实现简单的随机和启发式调度策略;

  • 绘制无人机轨迹和性能统计结果。

2. 仿真环境设计

在仿真环境 CityAirTrafficEnv 中,我们将城市空域离散化为一个 $\text{grid_size} \times \text{grid_size}$ 的网格。无人机通过移动到不同网格点完成从起点到目的地的任务,同时需避免碰撞和延误。

环境核心逻辑

状态空间

每个无人机的状态由以下变量描述:

  • $x, y$:当前位置的坐标;

  • $\text{dest_x, dest_y}$:目标位置的坐标;

  • $\text{done_flag}$:是否已到达目标。

状态空间为一个 $\text{num_drones} \times 5$ 的数组,记录所有无人机的状态信息。

动作空间

每个无人机可以选择以下动作:

  • 0:停留;

  • 1:向上移动;

  • 2:向下移动;

  • 3:向右移动;

  • 4:向左移动。

奖励函数

奖励函数综合考虑了以下因素:

  • 每一步的时间/能量消耗(负奖励);

  • 碰撞(较大负奖励);

  • 成功到达目标点(正奖励)。

核心代码

以下是环境初始化和步进逻辑的部分代码:

class CityAirTrafficEnv(gym.Env):
    def __init__(self, grid_size=20, num_drones=5, ...):
        self.grid_size = grid_size
        self.num_drones = num_drones
        self.observation_space = spaces.Box(low, high, dtype=np.float32)
        self.action_space = spaces.MultiDiscrete([5] * num_drones)

    def step(self, action):
        for i in range(self.num_drones):
            if not self.done_flags[i]:
                if action[i] == 1:  # up
                    self.drones_info[i, 1] = min(self.drones_info[i, 1] + 1, self.grid_size - 1)
                elif action[i] == 2:  # down
                    ...
        ...
        return self._get_observation(), reward, done, {}

3. 调度策略

我们实现了两种简单的调度策略:

随机策略

随机为每架无人机分配动作,无需考虑目标位置。这是一种基线策略,用于对比其他策略的优劣。

def simple_random_policy(observation, env):
    actions = [random.randint(0, 4) for _ in range(env.num_drones)]
    return np.array(actions, dtype=np.int32)

启发式策略

根据无人机与目标点的相对位置,选择向目标方向移动的动作。

def heuristic_policy(observation, env):
    actions = []
    for i in range(env.num_drones):
        x, y, dx, dy, done_flag = observation[i * 5:(i + 1) * 5]
        if abs(dx - x) > abs(dy - y):
            actions.append(3 if dx > x else 4)
        else:
            actions.append(1 if dy > y else 2)
    return np.array(actions, dtype=np.int32)

4. 仿真结果

运行仿真

我们通过多次仿真对比随机策略和启发式策略的性能,结果包括:

  • 碰撞次数;

  • 平均延误;

  • 无人机平均抵达时间。

以下是部分运行结果:

策略平均碰撞次数平均延误平均抵达时间
随机策略12.3320.4572.18
启发式策略4.0010.5050.22

可视化

我们使用 matplotlib 绘制无人机的移动轨迹,帮助直观分析不同策略的行为。

def plot_trajectories(env, episode_idx):
    plt.figure(figsize=(6, 6))
    for i in range(env.num_drones):
        xs = [p[0] for p in env.trajectories[i]]
        ys = [p[1] for p in env.trajectories[i]]
        plt.plot(xs, ys, marker='o', linestyle='-', label=f'Drone {i}')
    plt.show()


http://www.kler.cn/a/457789.html

相关文章:

  • GRU-PFG:利用图神经网络从股票因子中提取股票间相关性
  • 项目优化之策略模式
  • 金融租赁系统的创新与发展推动行业效率提升
  • 46. Three.js案例-创建颜色不断变化的立方体模型
  • OFDM学习-(二)长短序列和PPDU整体数据处理流程
  • Linux Shell 脚本编程基础知识篇—awk的条件判断(3)
  • Zookeeper JavaAPI操作(Curator API常用操作)
  • 探索 JavaBean(实体类)的奇妙世界
  • VSCode outline显示异常的解决方法——清除VSCode的配置和用户文件
  • AI生成PPT,效率革命的新时代
  • 数据的简单处理——pandas模块——查看数据
  • RedisDesktopManager新版本不再支持SSH连接远程redis后
  • PCIe和DMA:数据传输的“双子星“
  • 集成学习(模型融合)
  • 解锁仓颉编程语言的奥秘:枚举类型、模式匹配与类接口全解析
  • xss csrf怎么预防?
  • 大厂开发规范-如何规范的提交Git
  • winserver搭建域环境
  • 前端实现图片压缩插件(image-compressorionjs)
  • mybatis-plus 用法总结
  • [modern c++] shared_from_this 可以多次使用,不用担心double free
  • pnpm monorepo 联调方案
  • Presence:Colyseus用于管理实时分布式数据的工具
  • docker-compose搭建sfpt服务器
  • Go语言高并发实战案例分析
  • 【LeetCode】547、省份数量