初始条件

  1. 智能体位置随机生成
  2. 所有智能体位置全局可知
  3. 目标多边形位置给定
  4. 所有个体运行相同算法,根据环境来决定自己动作。

目标:形成均匀多边形分布,所谓的  ‘均匀’ 效果如下图:即是多边形上间距相等

问题拆分

  1. 抵达均匀多边形
  2. 均匀化分布

1 .抵达均匀多边形:

'''code = 'utf-8'''
'''author = peng'''import copy
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation
import timeNUM = 10  #设置无人机数量
MOVE_DISTANCE = 0.3
JianCeError = 0.1
'''根据无人机数量NUM得出边界最大容量数量   :    MAXNUM'''
if ((NUM - 4)/4)%1==0:MAXNUM = (NUM - 4)/4
else:MAXNUM = int((NUM - 4)/4) +1
'''JIANJU是调整单位距离'''
JIANJU = 50 /(MAXNUM+1)
x = np.random.randint(1, 100, NUM)
y = np.random.randint(1, 100, NUM)
# x = [36,37,38,39]
# y = [36,37,38,39]
Point_list = []
for i in range(NUM):Point_list.append([x[i], y[i]])
DING_LIST = [[25, 25], [75, 25], [75, 75], [25, 75]]
DingX, DingY = [], []
for each in DING_LIST:DingX.append(each[0])DingY.append(each[1])
DingX.append(DING_LIST[0][0])
DingY.append(DING_LIST[0][1])
fig, ax = plt.subplots()
ax.set_xlim(0, 100)
ax.set_ylim(0, 100)
sc = ax.scatter(x, y, color='r', alpha=0.7,marker='1',linewidth = 10)
ax.plot(DingX, DingY, color = 'black',linestyle = ':')class Point():MOVE_DISTANCE = MOVE_DISTANCEJianCeError = JianCeErrorMAXNUM = MAXNUMJIANJU = JIANJUtiaozheng_aim = Nonedef __init__(self,id):self.id = iddef decide(self,list = copy.deepcopy(DING_LIST)):if self.tiaozheng_aim == None:   #调整目标定下来就不需要改变了nearest = self.detect_nearest(list) #检测最近顶点ID = self.occupy(nearest)    #检测占领者if ID == self.id :self.update(nearest)pass       #自己占领elif ID == None:self.update(nearest)  #无人占领,往该方向移动else:# self.update([50,50])self.tiaozheng_aim = self.adjust(ID)  #调整目标if self.tiaozheng_aim:     #调整成功self.update(self.tiaozheng_aim)else:                      #调整失败# print(list)list2 = copy.deepcopy(list) #深复制防出错list2.remove(nearest)# print(list)return self.decide(list2)else:self.update(self.tiaozheng_aim) #有调整目标,直接移往该方向def adjust(self,ID):order = obj_list[ID].send() #1,0if order == None:return Nonefor each in DING_LIST:d = self.distance_calculate(each, Point_list[ID])if d < self.JianCeError:identity = DING_LIST.index(each)aim = copy.deepcopy(DING_LIST[identity])count = self.MAXNUM - order  #1,2if count % 2 == 0:  # 偶数顺时针if identity == 3:aim[0] += self.JIANJU * (count / 2)return aimelif identity == 2:aim[1] -= self.JIANJU * (count / 2)return aimelif identity == 1:aim[0] -= self.JIANJU * (count / 2)return aimelse:aim[1] += self.JIANJU * (count / 2)return aimelif identity == 3:  # 奇数逆时针aim[1] -= self.JIANJU * (int((count / 2))+1)return aimelif identity == 2:aim[0] -= self.JIANJU * (int((count / 2))+1)return aimelif identity == 1:aim[1] += self.JIANJU * (int((count / 2))+1)return aimelse:aim[0] += self.JIANJU * (int((count / 2))+1)return aimdef detect_nearest(self,list):init_distance = self.distance_calculate(Point_list[self.id], list[0])count, i = 0, 0for each in list:D = self.distance_calculate(Point_list[self.id], each)if D < init_distance:init_distance = Dcount = ii += 1return list[count]def distance_calculate(self, A, B):  # [1,1],[2,2] 得1.4142135623730951return pow(pow(abs(A[0] - B[0]), 2) + pow(abs(A[1] - B[1]), 2), 0.5)def update(self,aim):self_pot = copy.deepcopy(Point_list[self.id])x = np.array([aim[0] - self_pot[0], aim[1] - self_pot[1]])  # 方向向量y = np.array([1, 0])  # x轴方向Lx = np.sqrt(x.dot(x))  # x.dot(x) 点乘自己,相当于向量模平方Ly = np.sqrt(y.dot(y))if Lx > self.MOVE_DISTANCE:cos_angle = x.dot(y) / (Lx * Ly)angle = np.arccos(cos_angle)  # 0.....piif x[0] >= 0 and x[1] >= 0:self_pot[0] = self_pot[0] + self.MOVE_DISTANCE * abs(np.cos(angle))self_pot[1] = self_pot[1] + self.MOVE_DISTANCE * np.sin(angle)elif x[0] <= 0 and x[1] >= 0:self_pot[0] = self_pot[0] - self.MOVE_DISTANCE * abs(np.cos(angle))self_pot[1] = self_pot[1] + self.MOVE_DISTANCE * np.sin(angle)elif x[0] <= 0 and x[1] <= 0:self_pot[0] = self_pot[0] - self.MOVE_DISTANCE * abs(np.cos(angle))self_pot[1] = self_pot[1] - self.MOVE_DISTANCE * np.sin(angle)else:self_pot[0] = self_pot[0] + self.MOVE_DISTANCE * abs(np.cos(angle))self_pot[1] = self_pot[1] - self.MOVE_DISTANCE * np.sin(angle)Point_list[self.id] = self_potelse:Point_list[self.id] = aimdef occupy(self,nearest):for each in Point_list :d = self.distance_calculate(each,nearest)if d < self.JianCeError:ID = Point_list.index(each)return IDreturn Nonedef send(self):'''self.MAXNUM = 2 ,则输出 1,0'''if self.MAXNUM <= 0:return None  # 告诉询问着索要失败else:self.MAXNUM -= 1return self.MAXNUMobj_list = [Point(i) for i in range(0, NUM)]  # 返回生成的NUM个对象的列表comp_li = None
def gen():  # 绘图函数里面用的数据来源global comp_liwhile True:li = []for i in range(NUM):obj_list[i].decide()for each in Point_list:li.append(each)if comp_li == li:print('抵达边界完成,停留3秒')time.sleep(3)exit()else:comp_li = copy.deepcopy(li)with open('set.py','w') as f:f.write('POINT_LIST = '+ str(li))yield lidef update(N_list):sx, sy = [], []for each in N_list:sx.append(each[0])sy.append(each[1])sc.set_offsets(np.c_[sx, sy])return scani = animation.FuncAnimation(fig, update, frames=gen, interval=1)
plt.show()

初始分布随机生成:

抵达多边形后分布:

均匀化后分布:

均匀化算法思路:

class Point()
    def __init__(id):
        self.id = id
    def decide(): 
        '''决策函数,执行后更改全局变量 POINT_LIST '''
        return None

obj_list = [Point(i) for i in range(0, len(Point_list))]  # 返回生成的NUM个对象的列表

while True:
    '''依次执行每个个体的决策函数,更改自身位置,迭代器返回全局变量 POINT_LIST'''
    for i in range(NUM):
        obj_list[i].decide()  
    yield POINT_LIST

###############################################################################################
关于决策函数:
def decide():
    """ mmid 指 前后邻点的中点 与 自己位置 相连的 中点 """
    找到前后邻点,计算出  mmid =((pre + next)/2 + my)/2  
    
    '''移到目标点'''
    move(mmid)
    
 ##################################################################################################
关于位置移动的处理 :

idea:为了解决在顶点处移动无人机算法表达难度过大的问题提出将均匀多边形链表化的设想,即是把多边形等距划分,将每一个点位置存入链表中,移动无人机只需考虑其在链表上索引变动即可。

具体实现代码:

'''重写 13 '''
'''基本ok 只差停下函数'''
'''哇 终于TM的停下来了'''import copy
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation
import time
from set import POINT_LIST
Move_Distance = 20   # 20 * 0.01 =0.2
Ting_Distance = 3
# POINT_LIST = [[41.66666666666667, 25], [25, 41.66666666666667], [41.66666666666667, 75], [75, 25], [25, 75], [75, 58.33333333333333], [75, 75], [58.33333333333333, 75], [25, 25], [75, 41.66666666666667], [25, 58.33333333333333], [58.33333333333333, 25]]
# Point_list = [[25, 50.0], [75, 43.75], [43.75, 25], [25, 75], [25, 43.75], [75, 68.75], [56.25, 25], [62.5, 75], [50.0, 25], [75, 62.5], [25, 68.75], [31.25, 75], [25, 25], [31.25, 25], [25, 31.25], [75, 50.0], [37.5, 25], [56.25, 75], [75, 25], [75, 75], [75, 31.25], [25, 62.5], [37.5, 75], [68.75, 25], [75, 37.5], [25, 37.5], [25, 56.25], [68.75, 75], [62.5, 25], [43.75, 75]]
# Point_list = [[25, 25], [75, 75], [25, 75], [75, 25], [50, 25]]
# Point_list = [[25, 43.75], [25, 56.25], [50.0, 25], [75, 37.5], [68.75, 75], [43.75, 75], [62.5, 25], [75, 43.75], [25, 75], [25, 25], [56.25, 25], [25, 68.75], [75, 50.0], [31.25, 75], [25, 62.5], [75, 68.75], [31.25, 25], [25, 31.25], [62.5, 75], [75, 62.5], [56.25, 75], [75, 56.25], [37.5, 25], [75, 25], [75, 31.25], [25, 37.5], [68.75, 25], [37.5, 75], [43.75, 25]]
Point_list = POINT_LIST
NUM = len(Point_list)
# print(NUM)
DING_LIST = [[25, 25], [75, 25], [75, 75], [25, 75]]
DingX, DingY, x, y = [], [], [], []
for each in DING_LIST:DingX.append(each[0])DingY.append(each[1])
for each in Point_list:x.append(each[0])y.append(each[1])
DingX.append(DING_LIST[0][0])
DingY.append(DING_LIST[0][1])
fig, ax = plt.subplots()
ax.set_xlim(0, 100)
ax.set_ylim(0, 100)
sc = ax.scatter(x, y, color='r', alpha=0.7,marker='1',linewidth = 10)
ax.plot(DingX, DingY, color = 'black',linestyle = ':')'''以间隔0.01生成齿轮链表'''def chain_make():Tooth_Chain = []Tooth_Chain.append([25, 25])for i in np.arange(25.01, 75, 0.01):Tooth_Chain.append([i, 25])Tooth_Chain.append([75, 25])for i in np.arange(25.01, 75, 0.01):Tooth_Chain.append([75, i])Tooth_Chain.append([75, 75])for i in np.arange(74.99, 25.0, -0.01):Tooth_Chain.append([round(i, 2), 75])Tooth_Chain.append([25, 75])for i in np.arange(74.99, 25, -0.01):Tooth_Chain.append([25, round(i, 2)])return Tooth_Chaindef distance_calculate(A, B):  # [1,1],[2,2] 得1.4142135623730951return pow(pow(abs(A[0] - B[0]), 2) + pow(abs(A[1] - B[1]), 2), 0.5)Tooth_Chain = chain_make()
Tooth_Len = len(Tooth_Chain)
Point_adindex = []
for a in Point_list:for b in Tooth_Chain:d = distance_calculate(a, b)if d <= 0.005:      # Point_list数据有问题a.append(Tooth_Chain.index(b))Point_adindex.append(a)
# print(len(Point_adindex))def takeThird(elem):return elem[2]Point_adindex_sort = copy.deepcopy(Point_adindex)
Point_adindex_sort.sort(key=takeThird)# print(len(Point_adindex_sort))class Point():next_dis = 200001def __init__(self, id):''' self.  pre_id    next_id     id  这三个是在Point_list中的位置'''self.id = idmy_id = Point_adindex_sort.index(Point_adindex[self.id])if my_id == 0:self.pre_id = Point_adindex.index(Point_adindex_sort[NUM - 1])self.next_id = Point_adindex.index(Point_adindex_sort[1])elif my_id == NUM - 1:self.next_id = Point_adindex.index(Point_adindex_sort[0])self.pre_id = Point_adindex.index(Point_adindex_sort[NUM - 2])else:self.pre_id = Point_adindex.index(Point_adindex_sort[my_id - 1])self.next_id = Point_adindex.index(Point_adindex_sort[my_id + 1])def decide(self):pre_chain_index = Point_adindex[self.pre_id][2]next_chain_index = Point_adindex[self.next_id][2]self_chain_index = Point_adindex[self.id][2]if pre_chain_index < next_chain_index:a = pre_chain_indexb = next_chain_indexelse:a = pre_chain_indexb = next_chain_index + 20000if abs(self_chain_index - (a+b)/2 ) < 100 : passelse:if pre_chain_index < next_chain_index:  # 正常情况self.next_dis = next_chain_index - self_chain_indexmmid = ((next_chain_index + pre_chain_index) / 2 + self_chain_index) / 2# print('pre:', pre_chain_index, ' ', 'self', self_chain_index, ' ', 'next:', next_chain_index)else:self.next_dis = next_chain_index - self_chain_index + 20000if self.next_dis>= 20000 :self.next_dis -= 20000mmid = ((next_chain_index + Tooth_Len + pre_chain_index) / 2 + self_chain_index) / 2# print('pre:', pre_chain_index, ' ', 'self', self_chain_index, ' ', 'next:', next_chain_index)if abs(mmid - self_chain_index) <= Ting_Distance:if mmid % 1 == 0:self.move(int(mmid))elif self_chain_index > mmid:  # 在目标顺市针方向self.move(int(mmid) + 1)else:self.move(int(mmid))elif mmid > self_chain_index:self.move(self_chain_index + Move_Distance)else:self.move(self_chain_index - Move_Distance)def move(self, aim):if aim >= Tooth_Len: aim -= Tooth_Lenli = copy.deepcopy(Tooth_Chain[aim])li.append(aim)Point_adindex[self.id] = lidef judge(list):d = 20000/NUMfor each in list :if abs(each - d) > 100:return Falsereturn Truedef gen():while True:# print('$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$')li = []# panduanls=[]# if vari > ? :for i in range(NUM):obj_list[i].decide()# panduanls.append(obj_list[i].next_dis)# else:continue# if judge(panduanls):#     print("均匀化分布算法执行完毕,停留3秒")#     time.sleep(3)#     exit()for each in Point_adindex: li.append(each[:-1])yield lidef update(N_list):sx, sy = [], []for each in N_list:sx.append(each[0])sy.append(each[1])sc.set_offsets(np.c_[sx, sy])return scobj_list = [Point(i) for i in range(0, len(Point_list))]  # 返回生成的NUM个对象的列表
ani = animation.FuncAnimation(fig, update, frames=gen, interval=2)plt.show()###均匀化代码需要数据POINT_LIST,可以用代码中注释掉的数据看效果。

编队过程中碰撞问题解决办法:高度错开

三维效果演示:

三维演示代码已上传。

  1. 多智能体均匀多边形编队_哔哩哔哩_bilibili
  2. https://www.bilibili.com/video/BV1PE41117DG
  3. GitHub - ColaForced/AgentsMotionSimulation: 多智能体均匀多边形编队、追逐与合围。

多智能体系统编队算法仿真--python3实现相关推荐

  1. matlab 多智能体系统编队控制仿真,非线性,一致性

    matlab 多智能体系统编队控制仿真,非线性,一致性,领导跟随控制,有限时间控制等 ID:61599637624085488 在自然界中,人们经常可以观察到一种迷人的现象,大量的鸟.鱼.昆虫等生物会 ...

  2. 【Paper】2021_多智能体系统编队跟踪控制_张晓广

    [多智能体系统编队跟踪控制] 文章目录 3 基于输出调节的多智能体二维队形跟踪控制 3.1 引言 3.2 多智能体模型 3.2.1 基于PDE的多智能体系统 3.2.2 外部信号系统 3.6 仿真实验 ...

  3. 【Paper】2022_离散时间多智能体系统编队-包围控制研究_李博凡

    离散时间多智能体系统编队-包围控制研究_李博凡 文章目录 第四章 基于间歇控制的离散时间多智能体系统编队-包围控制 4.1 引言 4.2 基于状态反馈的离散时间间歇多智能体系统编队-包围控制 4.2. ...

  4. 智源研究院发布“智能体系架构与芯片”重大研究方向,打造通用智能处理器,突破“算法共性特征”难题...

    9 月 18 日上午,北京智源人工智能研究院(以下简称"智源研究院")在北大科技园举行"智能体系架构与芯片"重大研究方向发布会,智源研究院院长黄铁军以及北京人工 ...

  5. 第5章 - 二阶多智能体系统的协同控制 --> 连续时间系统编队控制

    第5章 - 二阶多智能体系统的协同控制 --> 领航跟随系统一致性[程序代码] 回到目录 第5章 - 二阶多智能体系统的协同控制 --> 连续时间系统编队控制[程序代码] 连续时间系统编队 ...

  6. 第5章 - 二阶多智能体系统的协同控制 --> 连续时间系统编队控制【程序代码】

    第5章 - 二阶多智能体系统的协同控制 --> 连续时间系统编队控制 回到目录 第6章 - 多无人车系统的协同控制 --> 无人车运动原理 文章目录 % 多智能体系统一致性的控制基础及其应 ...

  7. 快手智能处理与编码算法产品化之路

    视频转码过程中涉及方方面面的视频图像算法,如何将算法有机地结合起来,打造成为行业领先的视频转码算法产品?通过多年的业务场景打磨和积累,快手音视频走出了一条自己的产品化之路.LiveVideoStack ...

  8. 论坛报名 | 智能体系架构与芯片的下一个十年

    与6位图灵奖得主和100多位专家 共同探讨人工智能的下一个十年 长按图片或点击阅读原文,内行盛会,首次免费注册 2020年6月21-24日,第二届北京智源大会(官网:https://2020.baai ...

  9. 中国“芯”的突破攻略——智源大会“智能体系架构与芯片”论坛发布

    报名请点击「阅读原文」 北京·国家会议中心 2019年10月31日-11月1日 www.baai.ac.cn/2019 BAAI 北京智源大会倒计时:8天 智能体系架构与芯片专题论坛 本次大会&quo ...

最新文章

  1. 【Qt】QWidget对样式表设置边框无效的解决方法
  2. 修改MySql默认存储引擎为InnoDB,启动报错
  3. 如何使用ADLab搭建活动目录实验环境来练习渗透测试技术
  4. OpenGL窗口属性
  5. 【渝粤题库】陕西师范大学400011 思想政治教育学科教学论 作业(专升本)
  6. Inject Dll 过程
  7. 设计模式---状态模式
  8. 30种图像动画特效算法(C#多线程版)(上)
  9. linux驱动怎么判断定时器正在运行,Linux设备驱动编程之定时器
  10. Unity3d设置成中文版
  11. 以WBS模板和PBS自动生成WBS计划任务
  12. 使用sql语句直接修改数据库密码的解决方案
  13. 【C语言】pow函数的模拟实现(递归)
  14. 《计算之魂》Task3:关于排序的讨论
  15. c语言 按键切换显示屏,51单片机lcd1602按键切屏
  16. google protobuf源码分析1
  17. 业务应用系统的业务操作日志设计
  18. 6、数据库表的关系、Java对象的关系、关联查询(一对多)、延迟加载访问
  19. 全球及中国物流中心产业运营价值与投资可行性研究报告2022版
  20. 国信证券学习系列(6)

热门文章

  1. babel-plugin-transform-remove-consol插件的安装及使用(作用是移除代码里的所有console.log())
  2. 长短视频平台内卷自制剧,网剧制作商耐看娱乐能“耐看”吗?
  3. 云端服务器跑python代码,断开后台运行
  4. [Boston Legal][S02E02]Allan Shore在Kelly Nolan被控杀夫一案中的结案陈词
  5. 数字金融企业绿色专利匹配数据(2011-2019)
  6. STM32基础10--实时时钟(RTC)
  7. 苹果企业账号发布APP详解——通过自己网站分发应用
  8. 力扣 python刷题
  9. 产品狗观世界:谈装修
  10. 基于微信小程序游泳馆管理系统(微信小程序毕业设计)