启发式算法/人工鱼群算法
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                启发式算法/人工鱼群算法
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.                        
                                原理
人工魚群算法模擬的魚群在覓食時的行為
 尋找:在視野范圍內(nèi)隨機游動尋找更好的食物
 追尾:往視野范圍內(nèi)食物更好的魚游去
 聚集:往視野范圍內(nèi)魚群中心靠近(認為,魚越多的地方食物越好)
 移動:在視野范圍內(nèi)隨機移動
代碼
步驟:
代碼:
import numpy as np import matplotlib import matplotlib.pyplot as pltmatplotlib.rcParams['font.family'] = 'STSong' matplotlib.rcParams['font.size'] = 10def fitness_F1(x):"""適應(yīng)度函數(shù)當作食物量,食物量越大越好:param x: 魚所在位置:return:"""return -np.sum(x ** 2) + 900class Fish(object):"""魚"""def __init__(self, x, fit=None):"""初始化函數(shù):param x: 魚當前位置:param fit: 當前位置食物量,適應(yīng)度"""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: 迭代次數(shù):param fitness_end: 截止適應(yīng)度:param x_min: 下界:param x_max: 上界:param NP: 種群魚數(shù)量:param D(dimension): 位置向量維數(shù):param view: 視野范圍:param crow: 擁擠度,限制視野內(nèi)魚總數(shù):param times: 嘗試尋找食物次數(shù)"""# 截止條件self.num_iter = num_iterself.fitness_end = fitness_end# 解空間self.x_min = x_minself.x_max = x_max# 求解者self.NP = NPself.D = Dself.population()# 算法參數(shù)self.view = viewself.crow = crowself.times = timesdef population(self):"""初始化種群假設(shè)解空間內(nèi)統(tǒng)一分布的魚為一群魚:return: 解空間內(nèi)統(tǒng)一分布的魚群"""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):"""覓食尋找:在視野范圍內(nèi)尋找更好的食物+不擠追尾:向視野范圍內(nèi)食物更好的魚游去+不擠聚集:向視野范圍內(nèi)小魚群中心游去+不擠移動:視野范圍內(nèi)隨機移動+不擠:return: 最優(yōu)解,每次迭代的最佳適應(yīng)度"""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, ',最佳適應(yīng)度:', best_fit_list[-1])# 截止條件if self.fitness_end < best_fit:breakreturn best_x, best_fit_listdef find(self, fish):"""搜索在視野范圍內(nèi)尋找更好的食物+不擠:param: fish: 某條魚:return:"""for i in range(self.times):# 視野內(nèi)隨機移動距離distance = np.random.uniform(-self.view, self.view, self.D)# 魚新位置new_x = fish.get_x() + distance;# 新位置擁擠繼續(xù)尋找if self.crowed(Fish(new_x)):continue# 新位置不擁擠且適應(yīng)度更好 更新魚的位置和食物適應(yīng)度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):"""追尾向視野范圍內(nèi)食物更好的魚游去+不擠:param: fish: 某條魚:return:"""# 找到視野內(nèi)適應(yīng)度最好的魚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# 視野內(nèi)沒有魚if best_fish == None: return# 往視野內(nèi)適應(yīng)度最好的魚隨機移動for i in range(self.times):# 魚新位置new_x = np.random.uniform(fish.get_x(), best_fish.get_x())# 新位置擁擠繼續(xù)尋找if self.crowed(Fish(new_x)):continue# 新位置不擁擠更新魚的位置和食物適應(yīng)度else:fish.set_x(new_x)fish.set_fit(fitness_F1(new_x))def concentrate(self, fish):"""聚集向視野范圍內(nèi)小魚群中心游去+不擠:param: fish: 某條魚:return: 向視野范圍內(nèi)魚群中心游去+不擠"""# 尋找視野范圍內(nèi)的魚群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())# 視野范圍內(nèi)沒有魚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)# 新位置擁擠繼續(xù)尋找if self.crowed(Fish(new_x)):continue# 新位置不擁擠更新魚的位置和食物適應(yīng)度else:fish.set_x(new_x)fish.set_fit(fitness_F1(new_x))def move(self, fish):"""移動視野范圍內(nèi)隨機移動+不擠:param: fish: 某條魚:return:"""for i in range(self.times):# 魚新位置 視野內(nèi)隨機移動位置new_x = fish.get_x() + np.random.uniform(-self.view, self.view, 2)# 新位置擁擠繼續(xù)尋找if self.crowed(Fish(new_x)):continue# 新位置不擁擠更新魚的位置和食物適應(yīng)度else:fish.set_x(new_x)fish.set_fit(fitness_F1(new_x))def crowed(self, fish):"""是否擁擠:param fish: 某條魚:return: True-擁擠,False-不擁擠"""# 在視野內(nèi)魚條數(shù)count = 0for other in self.fish_pop:# np.linalg.norm 求范數(shù),默認一范數(shù)=歐式距離;linalg=line algebra線性代數(shù)if np.linalg.norm(fish.get_x() - other.get_x()) < self.view: count += 1# 視野內(nèi)魚條數(shù)大于限制條數(shù)self.crowif count <= self.crow:return Falseelse:return Truedef show(self, x_best, fitness_list):"""展示迭代過程:param x_best: 最優(yōu)解:param fitness_list: 每次迭代適應(yīng)度值:return:"""print("最優(yōu)解:", str(x_best))print("最優(yōu)適應(yīng)度:", str(fitness_list[-1]))plt.title("迭代過程")plt.xlabel("迭代次數(shù)")plt.ylabel("適應(yīng)度")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)總結(jié)
以上是生活随笔為你收集整理的启发式算法/人工鱼群算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: [转]揭开正则表达式的神秘面纱
- 下一篇: centos+bond+bridge+d
