日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

遗传算法python实现_Python遗传算法代码实例讲解

發布時間:2025/3/12 python 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 遗传算法python实现_Python遗传算法代码实例讲解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

實例:

求解函數的最大值y=xsin(10x)+xsin(2x),自變量取值:0--5,用Python畫出的圖像如下

(注:此代碼好像有一些感覺不對的地方,首先:沒有保留那些適應度低的個體

pop = select(pop, fitness) '''這一行代碼,壓根就是把適應度低的個體給干沒了。'''

for parent in pop:

child = crossover(parent, pop_copy)

child = mutate(child)

parent[:] = child '''這個for循環,沒有對交叉變異后的個體進行適應度篩選啊'''

)

代碼講解:

'''

1初始化種群:返回一個元素為 二進制的矩陣,每一行代表一個個體,每個個體由二進制數字表示x值

2:代表二進制,POP_SIZE:矩陣行數,DNA_SIZE:矩陣列數。

'''

pop = np.random.randint(2, size=(POP_SIZE, DNA_SIZE))

'''

2,計算適應度并且原則優良種群,(有放回的抽取),循環很多代

pop:代表二進制種群,translateDNA(pop):將其轉化十進制,在計算適應度,在select選擇優良種群

'''

F_values = F(translateDNA(pop)) #求函數值

fitness = get_fitness(F_values) #得到使用度,這里例子函數值就是適應度

pop = select(pop, fitness)

#此時的pop是經過篩選的好的總群,也是一個二進制表現方式,里面有很多一樣的個體,因為使用放回抓取

'''

3,經過一波篩選后,接下來該交叉變異了,為了得到更好的x值,因為初始化的x值使得個體分布不均勻

'''

pop_copy = pop.copy() #復制一份優良種群,用于交叉變異

for parent in pop:

child = crossover(parent, pop_copy) #交叉

child = mutate(child) #交叉后的種群在進行變異

parent[:] = child

#將child賦值給parent

難度較大的代碼:

crossover() mutate() parent[:] = child

'''

crossover

交叉:parent:表示每一個二進制個體,pop:優良的種群,如100個個體

返回交叉后的一個個體,也是二進制表示方式

這個函數的功能就是

parent[cross_points] = pop[i_, cross_points]

'''

def crossover(parent, pop): # mating process (genes crossover)

if np.random.rand() < CROSS_RATE:

i_ = np.random.randint(0, POP_SIZE, size=1) # select another individual from pop

# 從0-POP_SIZE,隨機選擇一個數字,

cross_points = np.random.randint(0, 2, size=DNA_SIZE).astype(np.bool)

#array([ True, False, False, True, True, False, False, True, True,

#True])

#隨機生成一個10個元素的數組,元素為0和1,在轉化成bool型

# choose crossover points

parent[cross_points] = pop[i_, cross_points]

#這個語句有難度:

'''

將parent為True的元素,將被改變,False的元素不變.將被改變的元素改變成 pop矩陣第 i_ 行里面被選擇為true的元素,

注意,parent的是cross_points, pop 也是cross_points,必須保持一致,才可以實現交叉生成一個新的個體,這個個體是父母基因的交叉結果

'''

# mating and produce one child

return parent #將新個體返回出去

'''

變異:將交叉后得到的個體,(這個個體不一定就是好的個體,很可能是不好的適應度不高的個體)

進行變異,

核心代碼:

child[point] = 1 if child[point] == 0 else 0

'''

def mutate(child):

for point in range(DNA_SIZE):

if np.random.rand() < MUTATION_RATE:

child[point] = 1 if child[point] == 0 else 0

'''

point是把child這個個體基因遍歷一遍,按照幾率進行將0變成1,

注意:并不是將所有的0變成1,而是有幾率的 if np.random.rand() < MUTATION_RATE:

'''

return child

全部代碼:

"""

Visualize Genetic Algorithm to find a maximum point in a function.

Visit my tutorial website for more: https://morvanzhou.github.io/tutorials/

"""

import numpy as np

import matplotlib.pyplot as plt

DNA_SIZE = 10 # DNA length

POP_SIZE = 100 # population size

CROSS_RATE = 0.8 # mating probability (DNA crossover)

MUTATION_RATE = 0.003 # mutation probability

N_GENERATIONS = 200

X_BOUND = [0, 5] # x upper and lower bounds

def F(x): return np.sin(10*x)*x + np.cos(2*x)*x # to find the maximum of this function

# find non-zero fitness for selection

def get_fitness(pred): return pred + 1e-3 - np.min(pred)

# convert binary DNA to decimal and normalize it to a range(0, 5)

def translateDNA(pop): return pop.dot(2 ** np.arange(DNA_SIZE)[::-1]) / float(2**DNA_SIZE-1) * X_BOUND[1]

def select(pop, fitness): # nature selection wrt pop's fitness

idx = np.random.choice(np.arange(POP_SIZE), size=POP_SIZE, replace=True,

p=fitness/fitness.sum())

return pop[idx]

def crossover(parent, pop): # mating process (genes crossover)

if np.random.rand() < CROSS_RATE:

i_ = np.random.randint(0, POP_SIZE, size=1) # select another individual from pop

cross_points = np.random.randint(0, 2, size=DNA_SIZE).astype(np.bool) # choose crossover points

parent[cross_points] = pop[i_, cross_points] # mating and produce one child

return parent

def mutate(child):

for point in range(DNA_SIZE):

if np.random.rand() < MUTATION_RATE:

child[point] = 1 if child[point] == 0 else 0

return child

pop = np.random.randint(2, size=(POP_SIZE, DNA_SIZE)) # initialize the pop DNA

plt.ion() # something about plotting

x = np.linspace(*X_BOUND, 200)

plt.plot(x, F(x))

for _ in range(N_GENERATIONS):

F_values = F(translateDNA(pop)) # compute function value by extracting DNA

# something about plotting

if 'sca' in globals(): sca.remove()

sca = plt.scatter(translateDNA(pop), F_values, s=200, lw=0, c='red', alpha=0.5); plt.pause(0.05)

# GA part (evolution)

fitness = get_fitness(F_values)

print("Most fitted DNA: ", pop[np.argmax(fitness), :])

pop = select(pop, fitness)

pop_copy = pop.copy()

for parent in pop:

child = crossover(parent, pop_copy)

child = mutate(child)

parent[:] = child # parent is replaced by its child

plt.ioff(); plt.show()

總結

以上是生活随笔為你收集整理的遗传算法python实现_Python遗传算法代码实例讲解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。