資源簡(jiǎn)介
python遺傳算法求函數(shù)極值
代碼片段和文件信息
from?math?import?e
from?math?import?pi
import?numpy?as?np
import?random
k?=?pow(213)-1#每個(gè)基因的二進(jìn)制序列種類數(shù)
def?f(x):#目標(biāo)函數(shù)
????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):#將二進(jìn)制編碼還原為變量
????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?#數(shù)據(jù)維度
????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)#總適應(yīng)度
????for?i?in?range(len(fit)):
????????fit[i]?/=?total
????return?fit
def?choose(popular):#進(jìn)行自然選擇
????popular_len?=?len(popular)#個(gè)體個(gè)數(shù)
????survival_rate?=?[]
????for?i?in?range(popular_len):
????????survival_rate.append(random.random())
????
????fit?=?fitness(popular)#每個(gè)個(gè)體的存活率
????best_individual?=?popular[fit.index(max(fit))]#保存下當(dāng)前種群最優(yōu)個(gè)體(其實(shí)寫這里不太會(huì))
????survival_rate.sort()
????fitin?=?0
????newin?=?0
????newpopular?=?popular
????#?開始輪盤賭
????#?結(jié)束之后,適應(yīng)度更高的個(gè)體在新種群中應(yīng)該更多
????while?newin?????????if?survival_rate[newin]?????????????newpopular[newin]?=?popular[fitin]
????????????newin?+=?1#旋轉(zhuǎn)輪盤
????????else:
????????????fitin?+=?1#旋轉(zhuǎn)輪盤
????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]))#隨機(jī)生成交叉點(diǎn)
????????
評(píng)論
共有 條評(píng)論