python蚁群算法 路径规划_蚁群算法(1) - Python实现

1 importnumpy as np2 importmatplotlib.pyplot as plt3

4

5 #建立“蚂蚁”类

6 classAnt(object):7 def __init__(self, path):8 self.path = path #蚂蚁当前迭代整体路径

9 self.length = self.calc_length(path) #蚂蚁当前迭代整体路径长度

10

11 def calc_length(self, path_): #path=[A, B, C, D, A]注意路径闭环

12 length_ =013 for i in range(len(path_)-1):14 delta = (path_[i].x - path_[i+1].x, path_[i].y - path_[i+1].y)15 length_ +=np.linalg.norm(delta)16 returnlength_17

18 @staticmethod19 def calc_len(A, B): #静态方法,计算城市A与城市B之间的距离

20 return np.linalg.norm((A.x - B.x, A.y -B.y))21

22

23 #建立“城市”类

24 classCity(object):25 def __init__(self, x, y):26 self.x =x27 self.y =y28

29

30 #建立“路径”类

31 classPath(object):32 def __init__(self, A): #A为起始城市

33 self.path =[A, A]34

35 def add_path(self, B): #追加路径信息,方便计算整体路径长度

36 self.path.append(B)37 self.path[-1], self.path[-2] = self.path[-2], self.path[-1]38

39

40 #构建“蚁群算法”的主体

41 classACO(object):42 def __init__(self, ant_num=50, maxIter=300, alpha=1, beta=5, rho=0.1, Q=1):43 self.ants_num = ant_num #蚂蚁个数

44 self.maxIter = maxIter #蚁群最大迭代次数

45 self.alpha = alpha #信息启发式因子

46 self.beta = beta #期望启发式因子

47 self.rho = rho #信息素挥发速度

48 self.Q = Q #信息素强度

49 ###########################

50 self.deal_data('coordinates.dat') #提取所有城市的坐标信息

51 ###########################

52 self.path_seed = np.zeros(self.ants_num).astype(int) #记录一次迭代过程中每个蚂蚁的初始城市下标

53 self.ants_info = np.zeros((self.maxIter, self.ants_num)) #记录每次迭代后所有蚂蚁的路径长度信息

54 self.best_path = np.zeros(self.maxIter) #记录每次迭代后整个蚁群的“历史”最短路径长度

55 ###########################

56 self.solve() #完成算法的迭代更新

57 self.display() #数据可视化展示

58

59 defdeal_data(self, filename):60 with open(filename, 'rt') as f:61 temp_list = list(line.split() for line in f) #临时存储提取出来的坐标信息

62 self.cities_num = len(temp_list) #1. 获取城市个数

63 self.cities = list(City(float(item[0]), float(item[1])) for item in temp_list) #2. 构建城市列表

64 self.city_dist_mat = np.zeros((self.cities_num, self.cities_num)) #3. 构建城市距离矩阵

65 for i inrange(self.cities_num):66 A =self.cities[i]67 for j inrange(i, self.cities_num):68 B =self.cities[j]69 self.city_dist_mat[i][j] = self.city_dist_mat[j][i] =Ant.calc_len(A, B)70 self.phero_mat = np.ones((self.cities_num, self.cities_num)) #4. 初始化信息素矩阵

71 #self.phero_upper_bound = self.phero_mat.max() * 1.2 ###信息素浓度上限

72 self.eta_mat = 1/(self.city_dist_mat + np.diag([np.inf]*self.cities_num)) #5. 初始化启发函数矩阵

73

74 defsolve(self):75 iterNum = 0 #当前迭代次数

76 while iterNum <77 self.random_seed>

78 delta_phero_mat = np.zeros((self.cities_num, self.cities_num)) #初始化每次迭代后信息素矩阵的增量

79 ##########################################################################

80 for i inrange(self.ants_num):81 city_index1 = self.path_seed[i] #每只蚂蚁访问的第一个城市下标

82 ant_path = Path(self.cities[city_index1]) #记录每只蚂蚁访问过的城市

83 tabu = [city_index1] #记录每只蚂蚁访问过的城市下标,禁忌城市下标列表

84 non_tabu = list(set(range(self.cities_num)) -set(tabu))85 for j in range(self.cities_num-1): #对余下的城市进行访问

86 up_proba = np.zeros(self.cities_num-len(tabu)) #初始化状态迁移概率的分子

87 for k in range(self.cities_num-len(tabu)):88 up_proba[k] = np.power(self.phero_mat[city_index1][non_tabu[k]], self.alpha) *\89 np.power(self.eta_mat[city_index1][non_tabu[k]], self.beta)90 proba = up_proba/sum(up_proba) #每条可能子路径上的状态迁移概率

91 while True: #提取出下一个城市的下标

92 random_num =np.random.rand()93 index_need = np.where(proba >random_num)[0]94 if len(index_need) >0:95 city_index2 =non_tabu[index_need[0]]96 break

97 ant_path.add_path(self.cities[city_index2])98 tabu.append(city_index2)99 non_tabu = list(set(range(self.cities_num)) -set(tabu))100 city_index1 =city_index2101 self.ants_info[iterNum][i] =Ant(ant_path.path).length102 if iterNum == 0 and i == 0: #完成对最佳路径城市的记录

103 self.best_cities =ant_path.path104 else:105 if self.ants_info[iterNum][i] < Ant(self.best_cities).length: self.best_cities =ant_path.path106 tabu.append(tabu[0]) #每次迭代完成后,使禁忌城市下标列表形成完整闭环

107 for l inrange(self.cities_num):108 delta_phero_mat[tabu[l]][tabu[l+1]] += self.Q/self.ants_info[iterNum][i]109

110 self.best_path[iterNum] =Ant(self.best_cities).length111

112 self.update_phero_mat(delta_phero_mat) #更新信息素矩阵

113 iterNum += 1

114

115 defupdate_phero_mat(self, delta):116 self.phero_mat = (1 - self.rho) * self.phero_mat +delta117 #self.phero_mat = np.where(self.phero_mat > self.phero_upper_bound, self.phero_upper_bound, self.phero_mat) # 判断是否超过浓度上限

118

119 def random_seed(self): #产生随机的起始点下表,尽量保证所有蚂蚁的起始点不同

120 if self.ants_num <= self.cities_num: #蚂蚁数 <= 城市数

121 self.path_seed[:] =np.random.permutation(range(self.cities_num))[:self.ants_num]122 else: #蚂蚁数 > 城市数

123 self.path_seed[:self.cities_num] =np.random.permutation(range(self.cities_num))124 temp_index =self.cities_num125 while temp_index + self.cities_num <=self.ants_num:126 self.path_seed[temp_index:temp_index + self.cities_num] =np.random.permutation(range(self.cities_num))127 temp_index +=self.cities_num128 temp_left = self.ants_num %self.cities_num129 if temp_left !=0:130 self.path_seed[temp_index:] =np.random.permutation(range(self.cities_num))[:temp_left]131

132 def display(self): #数据可视化展示

133 plt.figure(figsize=(6, 10))134 plt.subplot(211)135 plt.plot(self.ants_info, 'g.')136 plt.plot(self.best_path, 'r-', label='history_best')137 plt.xlabel('Iteration')138 plt.ylabel('length')139 plt.legend()140 plt.subplot(212)141 plt.plot(list(city.x for city in self.best_cities), list(city.y for city in self.best_cities), 'g-')142 plt.plot(list(city.x for city in self.best_cities), list(city.y for city in self.best_cities), 'r.')143 plt.xlabel('x')144 plt.ylabel('y')145 plt.savefig('ACO.png', dpi=500)146 plt.show()147 plt.close()148

149

150 ACO()

77>

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

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

相关文章

win10-PC端无法输入中文

试过 任务管理器中&#xff0c;的 MscCtfMonitor任务&#xff0c;先选择结束&#xff0c;然后再选择运行。关闭后输入法就可重新使用了---不行 当出现Win10无法输入中文汉字时&#xff0c;首先我们需要重启一下“输入法”程序&#xff1a; 右击桌面“Windows”图标&#xff0c…

python变量和数据类型_python的变量和数据类型

1.Python的变量不用定义类型,每个语句后面也不用使用分号结束语句(不像java,C,C#要在变量声明后加上分号)如:message"hello python world"print(message)-----------------------------------age19print(age)2.字符串(1).在Python中用引号括起来的都是字符串, 其中的…

函数声明是形参类型省略

如果参数类型省略&#xff0c;默认为int类型。&#xff08;此为古老写法&#xff09; #include<stdio.h>float average(a,n) int a[]; {int j;float s0;float aver;for(j0;j<0;j){sa[j];}avers/n;return aver; }main() {int a[12]{10,4,2,7,3,12,5,34,5,9,6,8};print…

因果图中的约束关系

E:互斥&#xff0c;exclude&#xff0c;表示abc最多只能有一个1&#xff0c;即abc000&#xff0c;100&#xff0c;010&#xff0c;001&#xff0c;只能有1个1或者全0&#xff08;可不选&#xff0c;要选最多选一个&#xff09;。I:包含&#xff0c;include&#xff0c;表示abc不…

如何销毁一个实例化对象_JAVA中如何创建和销毁对象

第1条 考虑用静态方法代替构造器类可以通过静态工厂方法来提供它的客户端&#xff0c;而不是通过构造器。提供静态工厂方法而不是公有构造器&#xff0c;这样做具有几大优势。1.静态工厂方法与构造器不同的第一大优势在于&#xff0c;它们有名称。例如&#xff0c;构造器BigInt…

因果图-交通一卡通自动充值软件系统-实例分析

因果图法测试用例的设计步骤 &#xff08;1&#xff09;确定软件规格(需求)中的原因和结果 &#xff08;2&#xff09;确定原因和结果之间的逻辑关系 &#xff08;3&#xff09;确定因果图中的各个约束(constraints) &#xff08;4&#xff09;画出因果图并转换为决策表 &…

如何区分电梯卡为id卡ic卡_电梯刷卡系统基本属性

电梯刷卡控制系统的发展是十分迅速的&#xff0c;在这点上相信大家都有所体会。但是为了节约成本费用&#xff0c;很多地产商都是安装的基本常见的电梯刷卡控制系统&#xff0c;这种常见的电梯&#xff0c;能够满足基本上的用户需求&#xff0c;在零件上面也是能够与大多数的零…

python应用体系_python-大型django应用程序体系结构

如何适当地构建一个较大的Django网站,以保持可测试性和可维护性&#xff1f;本着最好的django精神(我希望),我们开始时不太关心网站不同部分之间的去耦.我们确实将其分为不同的应用程序,但是通过共同使用模型类和直接方法调用,它们直接相互依赖.这变得越来越纠结.例如,我们的一…

Postman入门到精通01

1、什么是接口&#xff1f; 电脑&#xff1a;USB&#xff0c;投影仪 作用&#xff1a;数据传输 软件&#xff1a;API&#xff08;application Program Interface&#xff09;&#xff0c;微信提现和充值接口&#xff0c;支付宝支付&#xff0c;银联支付接口&#xff08;鉴权…

python oracle orm_Python ORM

本章内容ORM介绍如果写程序用pymysql和程序交互&#xff0c;那是不是要写原生sql语句。如果进行复杂的查询&#xff0c;那sql语句就要进行一点一点拼接&#xff0c;而且不太有重用性&#xff0c;扩展不方便。而且写的sql语句可能不高效&#xff0c;导致程序运行也变慢。为了避免…

前端校验和后端校验区别

前台验证数据格式 后台验证的是数据的正确性 当下流行的系统架构方案中&#xff0c;前端和后端都是分离开的。 目的&#xff1a;① 为了方便前端开发人员和后端开发人员可以同时开发&#xff1b;② 前后端分离也使得前后端的代码可以分开进行管理&#xff0c;方便了各自的版…

unittest-ddt报错AttributeError: type object ‘forTestDDT‘ has no attribute ‘test_2‘

unittest 添加多个ddt数据驱动后&#xff0c;报错&#xff1a; FAILED (errors1)Error Traceback (most recent call last):File "D:\Anaconda3\lib\unittest\case.py", line 60, in testPartExecutoryieldFile "D:\Anaconda3\lib\unittest\case.py", lin…

socket timeout是什么引起的_MySQL C API 参数 MYSQL_OPT_READ_TIMEOUT 的一些行为分析

作者&#xff1a;戴岳兵MYSQL_OPT_READ_TIMEOUT 是 MySQL c api 客户端中用来设置读取超时时间的参数。在 MySQL 的官方文档中&#xff0c;该参数的描述是这样的&#xff1a;MYSQL_OPT_READ_TIMEOUT (argument type: unsigned int *)The timeout in seconds for each attempt t…

python动态爬取知乎_python爬虫从小白到高手 Day2 动态页面的爬取

今天我们说说动态页面的抓取&#xff0c;动态页面的概念不是说网页上的内容是活动的&#xff0c;而是刷新的内容由Ajax加载&#xff0c;页面的URL没有变化&#xff0c;具体概念问度娘。就以男人都喜欢的美女街拍为例&#xff0c;对象为今日头条。chrome打开今日头条 ->搜索开…

Python操作文件,报FileNotFoundError: [Error 2] No such file or directory错误

python操作文件时&#xff0c;报No such file or directory错误。 多次检查目录、文件名、语法都是对的。 折腾一番后&#xff0c;打开文件所在文件夹&#xff0c;并显示所有文件后缀名&#xff0c;才发现此文件并没有txt后缀名 解决方法&#xff1a; 添加文件的.txt后缀名&a…

python多标签分类_如何通过sklearn实现多标签分类?

sklearn支持多类别(Multiclass)分类和多标签(Multilabel)分类&#xff1a;多类别分类&#xff1a;超过两个类别的分类任务。多类别分类假设每个样本属于且仅属于一个标签&#xff0c;类如一个水果可以是苹果或者是桔子但是不能同时属于两者。多标签分类&#xff1a;给每个样本分…

练习ddt-file_data时,报错UnboundLocalError local variable ‘value‘ referenced before assignment

错误原因就是&#xff0c;在xx.yml中的内容无效 更改之前&#xff1a; 更改之后&#xff1a; 注意冒号后面要有空格 改完之后运行就能正确读取到了

python筛选数据求均值_Python Pandas实现数据分组求平均值并填充nan的示例

Python实现按某一列关键字分组&#xff0c;并计算各列的平均值&#xff0c;并用该值填充该分类该列的nan值。DataFrame数据格式fillna方式实现groupby方式实现DataFrame数据格式以下是数据存储形式&#xff1a;fillna方式实现1、按照industryName1列&#xff0c;筛选出业绩2、筛…

HTMLTestRunner.py内容

HTMLTesstRunner.py 修改后内容如下&#xff1a; """ A TestRunner for use with the Python unit testing framework. It generates a HTML report to show the result at a glance.The simplest way to use this is to invoke its main method. E.g.import u…

卷积神经网络原理_人脸识别背后,卷积神经网络的数学原理原来是这样的

在自动驾驶、医疗以及零售这些领域&#xff0c;计算机视觉让我们完成了一些直到最近都被认为是不可能的事情。卷积神经网络可能是这一巨大成功背后的关键组成模块。这次&#xff0c;我们将要使用卷积神经网络的思想来拓宽我们对神经网络工作原理的理解。简介过去我们接触到了密…