資源簡介
python遺傳算法求函數極值
代碼片段和文件信息
from?math?import?e
from?math?import?pi
import?numpy?as?np
import?random
k?=?pow(213)-1#每個基因的二進制序列種類數
def?f(x):#目標函數
????n?=?len(x)
????return?-20*np.exp(-0.2*np.sqrt(1/n*sum(np.power(x2))))\
????????-np.exp(1/n*sum(np.cos(2*pi*x)))?+?20
def?translation(L):#將二進制編碼還原為變量
????n?=?0
????for?i?in?range(13):
????????n?+=?L[i]*pow(2i)
????
????return?-32.77?+?n?*?(65.54/k)
def?fitness(popular):
????fit?=?[0]?*?len(popular)
????n?=?len(popular[0])//13?#數據維度
????maxfit?=?-1e5
????for?i?in?range(popular):
????????x?=?[]
????????for?j?in?range(n):
????????????x.append(translation(i[13*j:13*j+13]))
????????fit[i]?=?f(np.array(x))
????????if?fit[i]?>?maxfit:
????????????maxfit?=?fit[i]
????for?i?in?range(len(fit)):
????????fit[i]?=?maxfit?-?fit[i]
????total?=?sum(fit)#總適應度
????for?i?in?range(len(fit)):
????????fit[i]?/=?total
????return?fit
def?choose(popular):#進行自然選擇
????popular_len?=?len(popular)#個體個數
????survival_rate?=?[]
????for?i?in?range(popular_len):
????????survival_rate.append(random.random())
????
????fit?=?fitness(popular)#每個個體的存活率
????best_individual?=?popular[fit.index(max(fit))]#保存下當前種群最優個體(其實寫這里不太會)
????survival_rate.sort()
????fitin?=?0
????newin?=?0
????newpopular?=?popular
????#?開始輪盤賭
????#?結束之后,適應度更高的個體在新種群中應該更多
????while?newin?????????if?survival_rate[newin]?????????????newpopular[newin]?=?popular[fitin]
????????????newin?+=?1#旋轉輪盤
????????else:
????????????fitin?+=?1#旋轉輪盤
????popular?=?newpopular
????return?best_individual
def?crossover(popularpc):#pc為交叉率
????popular_len=len(popular)
????for?i?in?range(popular_len-1):
????????crosspoint?=?random.randint(0len(popular[0]))#隨機生成交叉點
????????
評論
共有 條評論