Python自定义:粒子群优化算法
生活随笔
收集整理的這篇文章主要介紹了
Python自定义:粒子群优化算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Python中的粒子群算法
例子算法又被稱作飛鳥覓食算法,是一種常見的現代啟發式優化算法。在Python中,處于不同的情況考慮,我們都可能使用到該算法。在這里我給出三種情況下的解決方案或者替代方案。
編程練習-用Python自己實現粒子群算法
#!usr/bin/env python #-*- coding:utf-8 _*- """ @author:fonttian @file: 粒子群優化算法.py @time: 2017/10/15 """# References from : http://blog.csdn.net/kunshanyuz/article/details/63683145import numpy as np import random import matplotlib.pyplot as plt #----------------------PSO參數設置--------------------------------- class PSO():def __init__(self,pN,dim,max_iter,min_bl = True):self.w = 0.8self.c1 = 2 self.c2 = 2 self.r1= 0.6self.r2=0.3self.pN = pN #粒子數量self.dim = dim #搜索維度self.max_iter = max_iter #迭代次數self.min_bl = min #是否為最小化適應度函數self.X = np.zeros((self.pN,self.dim)) #所有粒子的位置和速度self.V = np.zeros((self.pN,self.dim))self.pbest = np.zeros((self.pN,self.dim)) #個體經歷的最佳位置和全局最佳位置self.gbest = np.zeros((1,self.dim))self.p_fit = np.zeros(self.pN) #每個個體的歷史最佳適應值self.fit = 1e10 #全局最佳適應值self.init_Population() # 初始化種群#---------------------目標函數Sphere函數-----------------------------def function(self,x):sum = 0length = len(x)x = x**2for i in range(length):sum += x[i]if self.min_bl == True:return sumelse:return -sum #---------------------初始化種群----------------------------------def init_Population(self):for i in range(self.pN):for j in range(self.dim):self.X[i][j] = random.uniform(0,1)self.V[i][j] = random.uniform(0,1)self.pbest[i] = self.X[i]tmp = self.function(self.X[i])self.p_fit[i] = tmpif(tmp < self.fit):self.fit = tmpself.gbest = self.X[i]#----------------------更新粒子位置----------------------------------def iterator(self):fitness = []for t in range(self.max_iter):for i in range(self.pN): #更新gbest\pbesttemp = self.function(self.X[i])if(temp<self.p_fit[i]): #更新個體最優self.p_fit[i] = tempself.pbest[i] = self.X[i]if(self.p_fit[i] < self.fit): #更新全局最優self.gbest = self.X[i]self.fit = self.p_fit[i]for i in range(self.pN):self.V[i] = self.w*self.V[i] + self.c1*self.r1*(self.pbest[i] - self.X[i])\+ self.c2*self.r2*(self.gbest - self.X[i])self.X[i] = self.X[i] + self.V[i]fitness.append(self.fit)# print("輸出當前最優值",self.fit) #輸出最優值return fitness#----------------------繪圖----------------------------------def ShowData(self,pltarg,line=["b",3]):plt.figure(1)plt.title(pltarg[0])plt.xlabel("iterators", size=pltarg[1][0])plt.ylabel("fitness", size=pltarg[1][1])t = np.array([t for t in range(pltarg[2][0],pltarg[2][1])])fitness = np.array(self.iterator())plt.plot(t, self.iterator(), color=line[0], linewidth=line[1])plt.show()return self.fit#----------------------獲取數據----------------------------------def GetResult(self,pltarg = ["Figure1",[14,14],[0,100]] ,line = ["b",3],show_bl = True,):if show_bl == True:return self.ShowData(pltarg,line=["b",3])else:return self.iterator()#----------------------定義參數-----------------------pltarg = ["Figure1",[14,14],[0,100]] line = ["b",3]#----------------------程序執行---輸出結果----------------------------------print("全局最優值 : ",PSO(pN=30,dim=5,max_iter=100).GetResult(pltarg,line,True))#----------------------程序執行-----------------------# my_pso = PSO(pN=30,dim=5,max_iter=100) # fitness = my_pso.GetResult(pltarg)#----------------------輸出結果----------------------------------# print("全局最優值 : ",fitness)# 原來的程序 #----------------------程序執行----------------------- # my_pso = PSO(pN=30,dim=5,max_iter=100) # fitness = my_pso.GetResult(pltarg) # my_pso.init_Population() # fitness = my_pso.iterator()# -------------------畫圖-------------------- # plt.figure(1) # plt.title("Figure1") # plt.xlabel("iterators", size=14) # plt.ylabel("fitness", size=14) # t = np.array([t for t in range(0,100)]) # fitness = np.array(fitness) # plt.plot(t,fitness, color='b',linewidth=3) # plt.show()總結
以上是生活随笔為你收集整理的Python自定义:粒子群优化算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: deap实战_2017中国数学建模大赛_
- 下一篇: 9.1 mnist_softmax 交叉