本算法是参照李晓磊博士的论文实现的,详细的算法原理可阅读《一种新型的智能优化方法_人工鱼群算法_李晓磊》

算法基于鱼群的生存行为:在一片水域中,鱼存在的数目最多的地方就是本水域中富含营养物质最多的地方,依据这一特点来模仿鱼群的觅食,聚群,追尾等行为,从而实现全局最优,这就是鱼群算法的基本思想。

鱼类的活动中,觅食行为,聚群行为,追尾行为和随机行为与寻优命题的解决有较密切的关系,如何利用简单有效的方式来构造实现这些行为将是算法实现的主要问题。

行为模式

觅食行为(AF-prey):指鱼循着食物多的方向游动的一种行为,人工鱼Xi在其视野内随机选择一个状态Xj,分别计算它们的目标函数值进行比较,如果发现Yj比Yi优,则Xi向Xj的方向移动一步;否则,Xi继续在其视野内选择状态Xj,判断是否满足前进条件,反复尝试trynumber次后,仍没有满足前进条件,则随机移动一步使Xi到达一个新的状态。

聚群行为(AF-swarm):鱼在游动过程中为了保证自身的生存和躲避危害会自然地聚集成群 。鱼聚群时所遵守的规则有三条:分隔规则:尽量避免与临近伙伴过于拥挤;对准规则:尽量与临近伙伴的平均方向一致;内聚规则:尽量朝临近伙伴的中心移动。 人工鱼Xi搜索其视野内的伙伴数目nf及中心位置Xc,若Yc/ nf > δYi,表明伙伴中心位置状态较优且不太拥挤,则Xi朝伙伴的中心位置移动一步,否则执行觅食行为。

追尾行为(AF-follow):指鱼向其可视区域内的最优方向移动的一种行为。人工鱼Xi搜索其视野内所有伙伴中的函数最优伙伴Xj,如果Yj/nf> δYi,表明最优伙伴的周围不太拥挤,则Xi朝Xj移动一步,否则执行觅食行为。

PS:公告板,是记录最优人工鱼个体状态的地方。每条人工鱼在执行完一次迭代后将自身当前状态与公告板中记录的状态进行比较,如果优于公告板中的状态则用自身状态更新公告板中的状态,否则公告板的状态不变。当整个算法的迭代结束后,输出公告板的值,就是我们所求的最优值。

模拟仿真:

参数设定:

初始鱼群数量N=20,移动步长AF_step=2.5,感知距离AF_visual=0.3 ,最大尝试次数try_number=50 ,拥挤度因子delta=0.618

(食物浓度)目标函数: sin(x)*sin(y)/(x*y)

编程语言:Python

绘图工具:matplotlib

AF.py

from __future__ import division

from random import uniform,random

from math import pi,sin,cos,sqrt

def Y(fish_pos):

return sin(fish_pos[0])*sin(fish_pos[1])/(fish_pos[0]*fish_pos[1])

def distance(x , y):

return sqrt((x[0]-y[0])**2+(x[1]-y[1])**2)

class AF():

def __init__(self, AF_X, AF_step, AF_visual, try_number,delta):

self.AF_step = AF_step

self.AF_visual = AF_visual

self.try_number = try_number

self.AF_X = AF_X

self.delta = delta

self.forumboard = None #定义公告板

#定义觅食行为

def AF_prey(self, fish_pos):

for i in range(self.try_number):

randangle = uniform(0, 2 * pi)

randlength = uniform(0, self.AF_visual)

tempa, tempb = fish_pos[0] + cos(randangle) * randlength, fish_pos[1] + sin(randangle) * randlength

if Y((fish_pos[0], fish_pos[1])) < Y((tempa, tempb)):

r = random()

fish_pos = (fish_pos[0] + r * cos(randangle) * self.AF_step,

fish_pos[1] + r * sin(randangle) * self.AF_step)

return fish_pos

else:

fish_pos = self.AF_move(fish_pos)

return fish_pos

#定义聚群行为

def AF_swarm(self, fish_pos):

nf = 0

AF_XC = (0, 0)

for j in range(len(self.AF_X)):

if distance(fish_pos, self.AF_X[j]) < self.AF_visual:

nf += 1

AF_XC = (AF_XC[0] + self.AF_X[j][0], AF_XC[1] + self.AF_X[j][1])

AF_XC = (AF_XC[0] / nf, AF_XC[1] / nf)

if distance(fish_pos, AF_XC) != 0 and (Y(AF_XC) / nf) > (self.delta * Y(fish_pos)):

r = random()

fish_pos = ((AF_XC[0] + fish_pos[0]) * (r * self.AF_step / distance(fish_pos, AF_XC)),

(AF_XC[1] + fish_pos[1]) * (r * self.AF_step / distance(fish_pos, AF_XC)))

return fish_pos

else:

fish_pos = self.AF_prey(fish_pos)

return fish_pos

#定义追尾行为

def AF_follow(self,fish_pos):

dis_dic= {}

nf = 0

dis_dic[fish_pos] = Y(fish_pos)

for j in range(len(self.AF_X)):

if distance(fish_pos, self.AF_X[j]) < self.AF_visual:

dis_dic[self.AF_X[j]] = Y(self.AF_X[j])

nf += 1

max_Element = max(dis_dic.items(), key=lambda x: x[1])

max_X = max_Element[0]

#更新公告板

if self.forumboard == None:

self.forumboard = max_Element[1]

self.forumboard = self.forumboard if self.forumboard > max_Element[1] else max_Element[1]

print(self.forumboard)

if Y(max_X) / nf > self.delta * Y(fish_pos) and distance(fish_pos, max_X) != 0:

r = random()

fish_pos = ((max_X[0] + fish_pos[0]) * (r * self.AF_step / distance(fish_pos, max_X)),

(max_X[1] + fish_pos[1]) * (r * self.AF_step / distance(fish_pos, max_X)))

return fish_pos

else:

fish_pos = self.AF_prey(fish_pos)

return fish_pos

#定义随机行为

def AF_move(self, fish_pos):

randangle = uniform(0,2*pi)

fish_pos = (fish_pos[0] + cos(randangle)*self.AF_step, fish_pos[1] + sin(randangle)*self.AF_step)

return fish_pos

主函数

import random

from AF import AF

import numpy as np

import matplotlib.pyplot as plt

#定义随机生成number个点

def randpoint(number):

init = []

for i in range(number):

a = random.uniform(-10, 10)

b = random.uniform(-10, 10)

init.append((a, b))

return init

init1 = randpoint(20)

init2 = init1[:]

init3 = init1[:]

af1 = AF(init1,AF_step=2.5, AF_visual=0.3, try_number=50, delta=0.618)

af2 = AF(init2,AF_step=2.5, AF_visual=0.3, try_number=50, delta=0.618)

af3 = AF(init3,AF_step=2.5, AF_visual=0.3, try_number=50, delta=0.618)

optimum = []

iteration = []

for i in range(20):

for j in range(len(init1)):

init1[j]=af1.AF_swarm(init1[j])

init1[j]=af1.AF_follow(init1[j])

for i in range(50):

for j in range(len(init2)):

init2[j]=af2.AF_swarm(init2[j])

init2[j]=af2.AF_follow(init2[j])

for i in range(100):

for j in range(len(init3)):

init3[j]=af3.AF_swarm(init3[j])

init3[j]=af3.AF_follow(init3[j])

optimum.append(af3.forumboard)

iteration.append(i)

x1 = [i[0] for i in init1]

y1 = [i[1] for i in init1]

x2 = [i[0] for i in init2]

y2 = [i[1] for i in init2]

x3 = [i[0] for i in init3]

y3 = [i[1] for i in init3]

fig = plt.figure()

ax1 = fig.add_subplot(221)

ax1.scatter(x1,y1)

ax1.set_xlabel("迭代20次")

ax2 = fig.add_subplot(222)

ax2.scatter(x2,y2)

ax2.set_xlabel("迭代50次")

ax3 = fig.add_subplot(223)

ax3.scatter(x3, y3)

ax3.set_xlabel("迭代100次")

ax4 = fig.add_subplot(224)

ax4.plot(iteration, optimum)

ax4.set_xlabel("迭代100次时的最优解")

plt.show()

分别迭代20次,50次,100次的情况:

以上结果表明:在(0,0)时目标函数取得最大值为1

人工鱼群算法python代码_人工鱼群算法python_鱼群算法 - Brillou的个人空间 - OSCHINA - 中文开源技术交流社区......相关推荐

  1. 人工鱼群算法python_鱼群算法 - Brillou的个人空间 - OSCHINA - 中文开源技术交流社区...

    本算法是参照李晓磊博士的论文实现的,详细的算法原理可阅读<一种新型的智能优化方法_人工鱼群算法_李晓磊> 算法基于鱼群的生存行为:在一片水域中,鱼存在的数目最多的地方就是本水域中富含营养物 ...

  2. python写等腰三角形的性质_杨辉三角—知识点详解 - osc_8cfq8uoa的个人空间 - OSCHINA - 中文开源技术交流社区...

    杨辉三角 杨辉三角(欧洲叫帕斯卡三角)是一个很奇妙的东西,它是我国数学家杨辉在1261年发现的,欧洲的帕斯卡于1654年发现,比我国的巨佬数学家杨辉晚了393年.(在此show一下我的爱国情怀) 铺垫 ...

  3. python蓝牙上位机开发_python做上位机 - osc_2frv0wjp的个人空间 - OSCHINA - 中文开源技术交流社区...

    参考文章: https://blog.csdn.net/dgut_guangdian/article/details/78391270 https://www.cnblogs.com/lanceyu/ ...

  4. java完成九宫格数独_数独(简易九宫格) - 小黑202的个人空间 - OSCHINA - 中文开源技术交流社区...

    一.ViewController.h中代码 // //  ViewController.h //  ThirdSignleView // //  Created by on 15/6/10. //   ...

  5. java 车站分级_做题中的错误总结 - osc_p4wgjz7p的个人空间 - OSCHINA - 中文开源技术交流社区...

    马上NOIP2018啦,突然发现自己比去年还菜,写水题时出现了很多错误,记录一下. 2018.7.8 luoguP2016 战略游戏 节点从0编号. 所以以i为根时不能设i的根为0,应设为-1 for ...

  6. mac电脑投屏到小米盒子_电脑投屏到小米盒子 - thomas_more的个人空间 - OSCHINA - 中文开源技术交流社区...

    无线显示技术 WiDi,需要英特尔Centrino Advanced-N 6200/6300/1000的无线网卡支持和显示适配器支持,在没有wifi网络的环境下可实现无限显示技术 无线投屏技术 Air ...

  7. Java做诗_搞IT,抽空写写诗 - mellen的个人空间 - OSCHINA - 中文开源技术交流社区...

    搞IT也可换换思路. 下面献丑一个本人的诗 <很长很长的一朵朵> -------(比较长)-------- 雨随着月夜纷飞, 错过的是树下的积水 眼前熟悉的影像, 却忽然变得很陌生, 心深 ...

  8. scaling之旅_机器学习算法之旅 - lwaif的个人空间 - OSCHINA - 中文开源技术交流社区...

    机器学习领域有很多算法,然后每种算法又有很多延伸,所以对于一个特定问题,如何确定一个正确的算法是很困难的.本文中我想给你们两种方法来归纳在现实中会遇到的算法. 学习方式 根据如何处理经验.环境或者任何 ...

  9. python sqlite3加密_sqlite3加密 - kjpioo的个人空间 - OSCHINA - 中文开源技术交流社区...

    SQLite 3 开源版不带加密功能,对于一个保存在本地的数据库来说没有加密功能让人难以接受,只要用记事本打开数据库就可以看到数据库内保存的数据,对安全多多少少有一点影响.有一个办法是把内容加密后保存 ...

最新文章

  1. Android 常见异常及解决办法
  2. 【转】我们今年二十三四岁。。。
  3. ECharts - 嵌套环形图
  4. java并发中的延迟初始化
  5. python特殊函数__str__、__repr__和__len__
  6. ping 不通 华为三层交换机vlan_华为三层交换机如何让VLAN间不能互通配置精编版...
  7. [Matlab] 无插件导入公式到 Word 中的方法:由 Matlab 导出 MathML 公式,复制到 Word 公式中
  8. 百度SEO Keyword Surfer v0.3.7(关键词优化)
  9. c#读蓝牙数据_C#读取BWT901CL蓝牙传感器的数据
  10. Unity上的Oculus Quest2开发(1) ——首先要空工程能在Quest上跑起来吧
  11. Springboot+Mysql企业员工绩效工资管理系统
  12. ssh 隧道 mysql_利用SSH隧道方式连接远程MySQL服务器
  13. Android OpenSL ES 开发:Android OpenSL 录制 PCM 音频数据
  14. logback为日志配置颜色
  15. AAAI-22 预征稿通知
  16. C语言编译器哪个好用,常用C语言编译器有哪些
  17. 计算机mc代表什么意思6,我的世界:萌新无法理解的6个老梗,唯老MC才懂!你能看懂几个?...
  18. Sling CMS 学习:环境搭建(一)
  19. (一)使用 Sliced Sprite 制作 UI 图像
  20. Matlab中产生门函数----Heaviside函数的调用方法

热门文章

  1. 晟元协议指纹头,单片机开发踩坑指南
  2. 企业多维要素综合评分
  3. 网页在图片上画长方形和直线,并且能控制和编辑
  4. 管易云和网易互客接口打通对接实战
  5. python手机区块链,初学者用Python搭建区块链
  6. 从零开始制作一辆小单车
  7. Solidworks如何显示装饰螺纹线
  8. 如何完美实现Paxos算法成员组变更
  9. 【ERP软件实施顾问】【面经】
  10. 手机端调起支付宝支付