原理

人工鱼群算法模拟的鱼群在觅食时的行为
寻找:在视野范围内随机游动寻找更好的食物
追尾:往视野范围内食物更好的鱼游去
聚集:往视野范围内鱼群中心靠近(认为,鱼越多的地方食物越好)
移动:在视野范围内随机移动

代码

步骤:

  1. 初始化种群
  2. 开始觅食
  3. 寻找:在视野范围内寻找更好的食物+避免拥挤
  4. 追尾:向视野范围内食物更好的鱼游去+避免拥挤
  5. 聚集:向视野范围内小鱼群中心游去+避免拥挤
  6. 移动:视野范围内随机移动+避免拥挤
  7. 达到截止条件(迭代次数,截止适应度)退出

代码:

import numpy as np
import matplotlib
import matplotlib.pyplot as pltmatplotlib.rcParams['font.family'] = 'STSong'
matplotlib.rcParams['font.size'] = 10def fitness_F1(x):"""适应度函数当作食物量,食物量越大越好:param x: 鱼所在位置:return:"""return -np.sum(x ** 2) + 900class Fish(object):"""鱼"""def __init__(self, x, fit=None):"""初始化函数:param x: 鱼当前位置:param fit: 当前位置食物量,适应度"""self.__x = xself.__fit = fitdef set_x(self, x):self.__x = xdef get_x(self):return self.__xdef set_fit(self, fit):self.__fit = fitdef get_fit(self):return self.__fitclass ArtificialFishSwarmsAlgorithm(object):"""鱼群算法"""def __init__(self, num_iter, fitness_end, x_min, x_max, NP, D, view, crow, times):"""初始化:param num_iter: 迭代次数:param fitness_end: 截止适应度:param x_min: 下界:param x_max: 上界:param NP: 种群鱼数量:param D(dimension): 位置向量维数:param view: 视野范围:param crow: 拥挤度,限制视野内鱼总数:param times: 尝试寻找食物次数"""# 截止条件self.num_iter = num_iterself.fitness_end = fitness_end# 解空间self.x_min = x_minself.x_max = x_max# 求解者self.NP = NPself.D = Dself.population()# 算法参数self.view = viewself.crow = crowself.times = timesdef population(self):"""初始化种群假设解空间内统一分布的鱼为一群鱼:return: 解空间内统一分布的鱼群"""self.fish_pop = []pop = np.random.uniform(self.x_min, self.x_max, (self.NP, self.D))for row in pop:fish = Fish(row, fitness_F1(row))self.fish_pop.append(fish)def frage(self):"""觅食寻找:在视野范围内寻找更好的食物+不挤追尾:向视野范围内食物更好的鱼游去+不挤聚集:向视野范围内小鱼群中心游去+不挤移动:视野范围内随机移动+不挤:return: 最优解,每次迭代的最佳适应度"""best_x = Nonebest_fit_list = []for it in range(self.num_iter):fitness_list = []# 每一条鱼进行觅食for fish in self.fish_pop:# 寻找self.find(fish)# 追尾self.follow(fish)# 聚集self.concentrate(fish)# 移动self.move(fish)# 记录fitness_list.append(fish.get_fit())# 记录best_fit = np.max(fitness_list)best_fit_list.append(best_fit)best_x = self.fish_pop[np.argmax(best_fit)].get_x()print('第', it + 1, '迭代', ',蜜源位置:', best_x, ',最佳适应度:', best_fit_list[-1])# 截止条件if self.fitness_end < best_fit:breakreturn best_x, best_fit_listdef find(self, fish):"""搜索在视野范围内寻找更好的食物+不挤:param: fish: 某条鱼:return:"""for i in range(self.times):# 视野内随机移动距离distance = np.random.uniform(-self.view, self.view, self.D)# 鱼新位置new_x = fish.get_x() + distance;# 新位置拥挤继续寻找if self.crowed(Fish(new_x)):continue# 新位置不拥挤且适应度更好 更新鱼的位置和食物适应度elif fitness_F1(new_x) > fitness_F1(fish.get_x()):fish.set_x(new_x)fish.set_fit(fitness_F1(new_x))def follow(self, fish):"""追尾向视野范围内食物更好的鱼游去+不挤:param: fish: 某条鱼:return:"""# 找到视野内适应度最好的鱼best_fish = Nonebest_fit = fitness_F1(fish.get_x())for o in self.fish_pop:if np.linalg.norm(fish.get_x() - o.get_x()) < self.view:fit = fitness_F1(o.get_x())if fit > best_fit:best_fish = obest_fit = fit# 视野内没有鱼if best_fish == None: return# 往视野内适应度最好的鱼随机移动for i in range(self.times):# 鱼新位置new_x = np.random.uniform(fish.get_x(), best_fish.get_x())# 新位置拥挤继续寻找if self.crowed(Fish(new_x)):continue# 新位置不拥挤更新鱼的位置和食物适应度else:fish.set_x(new_x)fish.set_fit(fitness_F1(new_x))def concentrate(self, fish):"""聚集向视野范围内小鱼群中心游去+不挤:param: fish: 某条鱼:return: 向视野范围内鱼群中心游去+不挤"""# 寻找视野范围内的鱼群view_fish_xs = [fish.get_x(), ]for o in self.fish_pop:if np.linalg.norm(fish.get_x() - o.get_x()) < self.view:view_fish_xs.append(o.get_x())# 视野范围内没有鱼if len(view_fish_xs) == 1: return# 计算中心点center_x = np.average(view_fish_xs)# 往鱼群中心移动for i in range(self.times):# 鱼新位置new_x = np.random.uniform(fish.get_x(), center_x)# 新位置拥挤继续寻找if self.crowed(Fish(new_x)):continue# 新位置不拥挤更新鱼的位置和食物适应度else:fish.set_x(new_x)fish.set_fit(fitness_F1(new_x))def move(self, fish):"""移动视野范围内随机移动+不挤:param: fish: 某条鱼:return:"""for i in range(self.times):# 鱼新位置 视野内随机移动位置new_x = fish.get_x() + np.random.uniform(-self.view, self.view, 2)# 新位置拥挤继续寻找if self.crowed(Fish(new_x)):continue# 新位置不拥挤更新鱼的位置和食物适应度else:fish.set_x(new_x)fish.set_fit(fitness_F1(new_x))def crowed(self, fish):"""是否拥挤:param fish: 某条鱼:return: True-拥挤,False-不拥挤"""# 在视野内鱼条数count = 0for other in self.fish_pop:# np.linalg.norm 求范数,默认一范数=欧式距离;linalg=line algebra线性代数if np.linalg.norm(fish.get_x() - other.get_x()) < self.view: count += 1# 视野内鱼条数大于限制条数self.crowif count <= self.crow:return Falseelse:return Truedef show(self, x_best, fitness_list):"""展示迭代过程:param x_best: 最优解:param fitness_list: 每次迭代适应度值:return:"""print("最优解:", str(x_best))print("最优适应度:", str(fitness_list[-1]))plt.title("迭代过程")plt.xlabel("迭代次数")plt.ylabel("适应度")x = range(1, len(fitness_list) + 1)y = fitness_listplt.plot(x, y, label="AFSA")plt.legend()plt.show()if __name__ == "__main__":afsa = ArtificialFishSwarmsAlgorithm(100, 900, -30, 30, 10, 2, 0.1, 5, 6)best_x, fitness_list = afsa.frage()afsa.show(best_x, fitness_list)

启发式算法/人工鱼群算法相关推荐

  1. 【机器学习】基于人工鱼群算法的多元非线性函数寻优

    基于人工鱼群算法的多元非线性函数寻优

  2. 【机器学习】基于人工鱼群算法的非线性函数寻优

    本微信图文介绍了人工鱼群算法的基本原理并对一元非线性函数进行极值寻优.

  3. matlab球落点的数学建模,MATLAB数学建模:智能优化算法-人工鱼群算法

    MATLAB 数学建模: 人工鱼群算法 1. 基本原理 人工鱼群算法是一种受鱼群聚集规律而启发的优化算法. 在人工鱼群算法中, 我们假定鱼群的活动行为分为: 觅食行为, 群聚行为, 追随行为和随机行为 ...

  4. MATLAB实战系列(十二)-如何用人工鱼群算法解决带时间窗车辆路径(CVRP)问题(附MATLAB代码)

    前言: 本文大体的思路是先对人工鱼进行编码,然后采用人工鱼群算法求解TSP问题中的觅食.聚群.追尾和随机行为对人工鱼群进行更新. 但是亟需需要解决的问题是:对于CVRP问题,如何对人工鱼进行编码.如果 ...

  5. matlab实战系列之人工鱼群算法求解TSP问题原理解析(下篇源码解析)

    从算法的名字中可以看出该算法是群体智能优化算法中的一种,人工鱼群算法通过模拟鱼群的觅食.聚群.追尾.随机等行为在搜索域中进行寻优. 人工鱼群算法有三个比较重要的概念:视野范围.k-距离邻域.多条鱼的中 ...

  6. pm模型matlab算法,18基于遗传算法(粒子群算法、人工鱼群算法等)的投影寻踪模型MATLAB源代码...

    基于遗传算法(粒子群算法.人工鱼群算法等)的投影寻踪模型 MATLAB源代码 投影寻踪是一种处理多因素复杂问题的统计方法,其基本思路是将高维数据向低维空间进行投影,通过低维投影数据的散布结构来研究高维 ...

  7. 人工鱼群算法python_人工鱼群算法简介及应用

    简介 定义 人工鱼群算法为山东大学副教授李晓磊2002年从鱼找寻食物的现象中表现的种种移动寻觅特点中得到启发而阐述的仿生学优化方案.在一片水域中,鱼往往能自行或尾随其他鱼找到营养物质多的地方,因而鱼生 ...

  8. 模拟鱼群的matlab算法,IFSA人工鱼群算法

    [实例简介]人工鱼群算法是李晓磊等人提出的一种基于动物行为的群体智能优化算法[8],通过模拟鱼类觅食.聚群.追尾随机等行为在搜索范围中寻优.在实际应用中,人工鱼群算法对目标函数的性质.优化参数的初值和 ...

  9. 基于人工鱼群算法的路径优化,鱼群算法的原理

    目录 摘要 参数优化的方法 鱼群算法的原理 基于人工鱼群算法的参数优化 基本参数 代码 效果图 结果分析 展望 摘要 详细介绍了人工鱼群算法的原理,并MATLAB编程实现基于人工鱼群算法的参数优化,对 ...

  10. 【BP数据预测】基于matlab人工鱼群算法优化BP神经网络数据预测【含Matlab源码 523期】

    一.人工鱼群算法简介 1 觅食行为   指鱼循着食物多的方向游动的一种行为,人工鱼X i X_iXi​在其视野内随机选择一个状态X j X_jXj​,分别计算它们的目标函数值进行比较,如果发现Y j ...

最新文章

  1. 实验:安装windows server 2008 R2
  2. BeanUtils.copyProperties VS PropertyUtils.copyProperties
  3. samba服务器详解
  4. python创建子进程_Python--- subprocess 创建子进程
  5. centos6.4 安装 mysql_CentOS6.4 安装MySQL
  6. Web前端 性能优化
  7. 计算机硬件组成 pdf,计算机硬件的组成..pdf
  8. Qt文档阅读笔记-DTLS server解析
  9. 【报告分享】中国“新基建”发展研究报告.pdf(附下载链接)
  10. Jquery中用offset().top和offsetTop的比较
  11. 旅行 jzoj 1281
  12. native method jvm
  13. java keytool 导出证书,keytool 导出证书
  14. 计算机上的字体怎么安装,电脑怎么安装字体
  15. IBM Rhapsody 报错找不到 VC11 目录的解决方法
  16. 乘风破浪,遇见未来元宇宙(Metaverse)之元宇宙重要基本元素之一,虚拟数字人行业洞察报告及未来趋势
  17. uniapp之安卓文件操作插件
  18. python长度转换代码尺和米_尺,寸,跟米,厘米的换算??
  19. spring使用之旅(二) ---- AOP的使用
  20. 电脑硬盘分区太多?如何合并分区?

热门文章

  1. COGS 2507. 零食店
  2. 通过自学可以搭建量化交易模型吗?
  3. Java内存模型JMM
  4. QQ登录超时,请检查您的网络或本机防火墙设置【00001】
  5. 手工打造迅雷9超精简版
  6. python实现通讯录代码
  7. 原生js获取cookie
  8. 系统编程之文件IO(一)——概述
  9. S7-1500系统内使用ET200S 1SI模块实现Modbus 从站通信
  10. 可行性研究报告——机房收费系统