Python-遺傳演算法君主交叉程式碼實現

專注的阿熊發表於2021-08-12

import numpy as np

import matplotlib.pyplot as plt

# import math as mt

import seaborn as sns

sns.set_style('darkgrid')

def funcl(x):

     y=0

     for i in range(len(x)):

         y=y+x[i]**2

     return y

#%%

NP=100   # 初始化種群數

D=10    # 單條染色體基因數目 10

Pc=0.8  # 交叉率

Pm=0.1  # 變異率

G=200   # 最大遺傳代數

Xs=20   # 上限

Xx=-20    # 下限

jiyi=np.random.rand(NP,D)

f=jiyi*(Xs-Xx)+Xx                              # 隨機獲得初始種群

FIT=[]

sortf=[]

trace=[]

xtrace=[]

xtracemin=[]

test=[]

for i in range(NP):

     FIT.append(funcl(f[i]))    # 適應度函式

sortFIT=np.sort(FIT)           # 升序排序

index= np.argsort(FIT)         # 升序對應索引

for i in range(len(f)):

     sortf.append(f[index[i]])  # 得到升序順序對應的種群

#%% 遺傳演算法迴圈

for i in range(G):

     print(i)

     Emper=sortf[0]             # 產生君主

     nf=sortf                   # 出新的種群,在其基礎上進行交叉、變異

     for M in range(0,NP,2):

         p=np.random.rand()     # 君主交叉

         if p<Pc:

             for j in range(D):

                 nf[M][j]=Emper[j]  # 將君主的染色體給偶數索引的染色體,

# 我覺得這一步好像談不上交叉,外匯跟單gendan5.com只是單純地將君主染色體所佔整體比重加大了

# 人為再加一手傳統的交叉過程,到時候將這個過程刪除,看看影響結果不   

     for M in range(0,NP,2):

         p=np.random.rand()     # 交叉

         if p<Pc:

             q=np.random.randint(0,high=2,size=(1,D))[0].tolist()

             for j in range(D):

                 if q[j]==1:

                     temp=nf[M+1][j]

                     nf[M+1][j]=nf[M][j]

                     nf[M][j]=temp

                    

     for M in range(NP):        # 變異

         for n in range(D):

             p=np.random.rand()

             if p<Pm:

                 nf[M][n]=np.random.rand()*(Xs-Xx)+Xx

     # 交叉變異結束之後,新一代 nf 加上前代 f 2*NP 個個體進行篩選

     newf=np.vstack((sortf,nf))         # 垂直方向累加兩個 f

     newFIT=[]

     for j in range(len(newf)):

         newFIT.append(funcl(newf[j]))    # 適應度函式

     sortFIT=np.sort(newFIT)           # 升序排序

     index= np.argsort(newFIT)         # 升序對應索引

     maxfit=max(newFIT)

     minfit=min(newFIT)

     sortf=[]

     for j in range(len(f)):

         sortf.append(newf[index[j]])  # 得到升序順序對應的種群

     trace.append(minfit)

     st=sortf[0].tolist()

     xtrace.append(st)

xvalue=[]

for i in range(len(xtrace)):

     xvalue.append(xtrace[i][0])

plt.plot(trace,color='green', marker='o',linewidth=2, markersize=3)

plt.xlabel('Number of iterations',fontsize = 10)

plt.ylabel('minyvalue',fontsize = 10)

plt.savefig('pic4',bbox_inches = 'tight',pad_inches = 0,dpi =350)

plt.close()

plt.scatter(list(range(0,200)),xvalue,color='red',s=3)  #s 引數設定點的大小

plt.xlabel('Number of iterations',fontsize = 10)

plt.ylabel('x',fontsize = 10)

plt.savefig('pic5',bbox_inches = 'tight',pad_inches = 0,dpi =350)

plt.close()


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946337/viewspace-2786690/,如需轉載,請註明出處,否則將追究法律責任。

相關文章