写一个初始位置为[-10, -10],[0, -10],[10, -10]的三个智能体追踪和合围一个动态目标的python程序,其中三个智能体的x.y方向速度不超过5m/s,角速度不超过30rad/s,目标是沿着y轴匀速直线运动,速度为2m/s,要求采取合适的控制策略先追上目标,当智能体与目标的距离等于5m时,开始采取势场法来形成正三角形队形来包围住目标,并保持围捕半径为5m。显示出每个智能体的走过的路径。

时间: 2023-06-18 19:08:17 浏览: 46
以下是一个基于Python的程序,用于模拟三个智能体追踪和合围一个动态目标: ```python import numpy as np import matplotlib.pyplot as plt # 目标的初始位置和速度 target_pos = np.array([0, -10]) target_vel = np.array([0, 2]) # 智能体的初始位置和速度 agent1_pos = np.array([-10, -10]) agent1_vel = np.array([5, 0]) agent2_pos = np.array([0, -10]) agent2_vel = np.array([0, 5]) agent3_pos = np.array([10, -10]) agent3_vel = np.array([-5, 0]) # 控制参数 k_att = 0.1 # 引力系数 k_rep = 0.5 # 斥力系数 r_rep = 5 # 斥力范围 r_f = 5 # 形成队形的半径 # 迭代次数 num_iters = 1000 # 记录智能体的轨迹 agent1_path = [agent1_pos.copy()] agent2_path = [agent2_pos.copy()] agent3_path = [agent3_pos.copy()] # 开始迭代 for i in range(num_iters): # 计算每个智能体的位置和速度 agent1_acc = np.zeros(2) agent2_acc = np.zeros(2) agent3_acc = np.zeros(2) # 计算每个智能体与目标之间的距离和方向 d1 = np.linalg.norm(agent1_pos - target_pos) d2 = np.linalg.norm(agent2_pos - target_pos) d3 = np.linalg.norm(agent3_pos - target_pos) dir1 = (target_pos - agent1_pos) / d1 if d1 > 0 else np.zeros(2) dir2 = (target_pos - agent2_pos) / d2 if d2 > 0 else np.zeros(2) dir3 = (target_pos - agent3_pos) / d3 if d3 > 0 else np.zeros(2) # 如果距离小于5m,开始形成队形 if d1 <= r_f and d2 <= r_f and d3 <= r_f: # 计算正三角形的三个顶点 p1 = target_pos + np.array([0, r_f]) p2 = target_pos + np.array([np.sqrt(3) / 2 * r_f, -0.5 * r_f]) p3 = target_pos + np.array([-np.sqrt(3) / 2 * r_f, -0.5 * r_f]) # 计算每个智能体与顶点之间的距离和方向 d1p1 = np.linalg.norm(agent1_pos - p1) d1p2 = np.linalg.norm(agent1_pos - p2) d1p3 = np.linalg.norm(agent1_pos - p3) dir1p1 = (p1 - agent1_pos) / d1p1 if d1p1 > 0 else np.zeros(2) dir1p2 = (p2 - agent1_pos) / d1p2 if d1p2 > 0 else np.zeros(2) dir1p3 = (p3 - agent1_pos) / d1p3 if d1p3 > 0 else np.zeros(2) d2p1 = np.linalg.norm(agent2_pos - p1) d2p2 = np.linalg.norm(agent2_pos - p2) d2p3 = np.linalg.norm(agent2_pos - p3) dir2p1 = (p1 - agent2_pos) / d2p1 if d2p1 > 0 else np.zeros(2) dir2p2 = (p2 - agent2_pos) / d2p2 if d2p2 > 0 else np.zeros(2) dir2p3 = (p3 - agent2_pos) / d2p3 if d2p3 > 0 else np.zeros(2) d3p1 = np.linalg.norm(agent3_pos - p1) d3p2 = np.linalg.norm(agent3_pos - p2) d3p3 = np.linalg.norm(agent3_pos - p3) dir3p1 = (p1 - agent3_pos) / d3p1 if d3p1 > 0 else np.zeros(2) dir3p2 = (p2 - agent3_pos) / d3p2 if d3p2 > 0 else np.zeros(2) dir3p3 = (p3 - agent3_pos) / d3p3 if d3p3 > 0 else np.zeros(2) # 计算每个智能体的合力 agent1_force = k_att * dir1 + k_rep * (1 / d1p1**2 * dir1p1 + 1 / d1p2**2 * dir1p2 + 1 / d1p3**2 * dir1p3) agent2_force = k_att * dir2 + k_rep * (1 / d2p1**2 * dir2p1 + 1 / d2p2**2 * dir2p2 + 1 / d2p3**2 * dir2p3) agent3_force = k_att * dir3 + k_rep * (1 / d3p1**2 * dir3p1 + 1 / d3p2**2 * dir3p2 + 1 / d3p3**2 * dir3p3) # 计算每个智能体的加速度 agent1_acc = agent1_force / np.linalg.norm(agent1_force) if np.linalg.norm(agent1_force) > 0 else np.zeros(2) agent2_acc = agent2_force / np.linalg.norm(agent2_force) if np.linalg.norm(agent2_force) > 0 else np.zeros(2) agent3_acc = agent3_force / np.linalg.norm(agent3_force) if np.linalg.norm(agent3_force) > 0 else np.zeros(2) # 如果距离大于5m,继续追踪目标 else: # 计算每个智能体的合力 agent1_force = k_att * dir1 + k_rep * (1 / (d1 - r_rep)**2 * (dir1 - dir1 * (d1 - r_rep) / d1)) agent2_force = k_att * dir2 + k_rep * (1 / (d2 - r_rep)**2 * (dir2 - dir2 * (d2 - r_rep) / d2)) agent3_force = k_att * dir3 + k_rep * (1 / (d3 - r_rep)**2 * (dir3 - dir3 * (d3 - r_rep) / d3)) # 计算每个智能体的加速度 agent1_acc = agent1_force / np.linalg.norm(agent1_force) if np.linalg.norm(agent1_force) > 0 else np.zeros(2) agent2_acc = agent2_force / np.linalg.norm(agent2_force) if np.linalg.norm(agent2_force) > 0 else np.zeros(2) agent3_acc = agent3_force / np.linalg.norm(agent3_force) if np.linalg.norm(agent3_force) > 0 else np.zeros(2) # 更新每个智能体的速度和位置 agent1_vel += agent1_acc agent2_vel += agent2_acc agent3_vel += agent3_acc agent1_pos += agent1_vel agent2_pos += agent2_vel agent3_pos += agent3_vel # 记录每个智能体的轨迹 agent1_path.append(agent1_pos.copy()) agent2_path.append(agent2_pos.copy()) agent3_path.append(agent3_pos.copy()) # 绘制轨迹 agent1_path = np.array(agent1_path) agent2_path = np.array(agent2_path) agent3_path = np.array(agent3_path) plt.plot(agent1_path[:, 0], agent1_path[:, 1], label='Agent 1') plt.plot(agent2_path[:, 0], agent2_path[:, 1], label='Agent 2') plt.plot(agent3_path[:, 0], agent3_path[:, 1], label='Agent 3') plt.plot(target_pos[0], target_pos[1], 'ro', label='Target') plt.legend() plt.show() ``` 在上面的程序中,我们引入了势场法来形成三个智能体的正三角形队形,以便包围住目标。当三个智能体与目标的距离小于5m时,它们将采取这种形式。在其他情况下,它们将继续追踪目标。 在程序运行后,你将会看到三个智能体的路径,以及目标的初始位置和最终位置。

相关推荐

最新推荐

recommend-type

k-means 聚类算法与Python实现代码

首先随机选择集合里的一个元素作为第一个聚类中心放入容器,选择距离第一个聚类中心最远的一个元素作为第二个聚类中心放入容器,第三、四、、、N个同理,为了优化可以选择距离开方做为评判标准 二、迭代聚类 依次把...
recommend-type

基于springboot+vue+MySQL实现的在线考试系统+源代码+文档

web期末作业设计网页 基于springboot+vue+MySQL实现的在线考试系统+源代码+文档
recommend-type

318_面向物联网机器视觉的目标跟踪方法设计与实现的详细信息-源码.zip

提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB柱状图在信号处理中的应用:可视化信号特征和频谱分析

![matlab画柱状图](https://img-blog.csdnimg.cn/3f32348f1c9c4481a6f5931993732f97.png) # 1. MATLAB柱状图概述** MATLAB柱状图是一种图形化工具,用于可视化数据中不同类别或组的分布情况。它通过绘制垂直条形来表示每个类别或组中的数据值。柱状图在信号处理中广泛用于可视化信号特征和进行频谱分析。 柱状图的优点在于其简单易懂,能够直观地展示数据分布。在信号处理中,柱状图可以帮助工程师识别信号中的模式、趋势和异常情况,从而为信号分析和处理提供有价值的见解。 # 2. 柱状图在信号处理中的应用 柱状图在信号处理
recommend-type

hive中 的Metastore

Hive中的Metastore是一个关键的组件,它用于存储和管理Hive中的元数据。这些元数据包括表名、列名、表的数据类型、分区信息、表的存储位置等信息。Hive的查询和分析都需要Metastore来管理和访问这些元数据。 Metastore可以使用不同的后端存储来存储元数据,例如MySQL、PostgreSQL、Oracle等关系型数据库,或者Hadoop分布式文件系统中的HDFS。Metastore还提供了API,使得开发人员可以通过编程方式访问元数据。 Metastore的另一个重要功能是跟踪表的版本和历史。当用户对表进行更改时,Metastore会记录这些更改,并且可以让用户回滚到
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依
recommend-type

MATLAB柱状图在数据分析中的作用:从可视化到洞察

![MATLAB柱状图在数据分析中的作用:从可视化到洞察](https://img-blog.csdnimg.cn/img_convert/1a36558cefc0339f7836cca7680c0aef.png) # 1. MATLAB柱状图概述** 柱状图是一种广泛用于数据可视化的图表类型,它使用垂直条形来表示数据中不同类别或组别的值。在MATLAB中,柱状图通过`bar`函数创建,该函数接受数据向量或矩阵作为输入,并生成相应的高度条形。 柱状图的优点在于其简单性和易于理解性。它们可以快速有效地传达数据分布和组别之间的比较。此外,MATLAB提供了广泛的定制选项,允许用户调整条形颜色、