當(dāng)前位置:
首頁 >
遗传算法及其应用实现
發(fā)布時間:2024/7/5
34
豆豆
生活随笔
收集整理的這篇文章主要介紹了
遗传算法及其应用实现
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
使用遺傳算法求解函數(shù)具有最大值的點(diǎn)X
""" Visualize Genetic Algorithm to find a maximum point in a function. """ import numpy as np import matplotlib.pyplot as pltDNA_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 # stop evolution rule X_BOUND = [0, 5] # x upper and lower bounds# to find the maximum of this function def F(x):return np.sin(10 * x) * x + np.cos(2 * x) * x# 適應(yīng)性函數(shù)(一個值域非負(fù)、與F有相同極值點(diǎn)的函數(shù)) def get_fitness(pred):return pred + 1e-3 - np.min(pred)# 選擇算子(適者生存,不適者遭淘汰) def select(pop, fitness):idx = np.random.choice(np.arange(POP_SIZE), size=POP_SIZE, replace=True, p=fitness / fitness.sum()) # 比例選擇規(guī)則(另外可用“模擬退火算子”)return pop[idx]# 雜交算子(促進(jìn)進(jìn)化的主要手段) def crossover(parent, pop):if np.random.rand() < CROSS_RATE: # 多點(diǎn)雜交(另外還有“單點(diǎn)雜交”、“兩點(diǎn)雜交”、“均勻雜交”)i_ = np.random.randint(0, POP_SIZE, size=1) # select another individual from popcross_points = np.random.randint(0, 2, size=DNA_SIZE).astype(np.bool) # choose crossover pointsparent[cross_points] = pop[i_, cross_points] # mating and produce one childreturn parent# 變異算子(使算法達(dá)到局部極值時有逃離局部極值“陷阱”的可能性) def mutate(child):for point in range(DNA_SIZE):if np.random.rand() < MUTATION_RATE:child[point] = 1 if child[point] == 0 else 0return child# 將二進(jìn)制的DNA轉(zhuǎn)換為實(shí)數(shù)并且標(biāo)準(zhǔn)化到[0, 5] def translateDNA(pop):return pop.dot(2 ** np.arange(DNA_SIZE)[::-1]) / float(2 ** DNA_SIZE - 1) * X_BOUND[1] # np.arange(5)[::-1] 逆序:[4 3 2 1 0] # 2 ** np.arange(5)[::-1] 冪次:[16 8 4 2 1] # pop.dot(2 ** np.arange(5)[::-1]) 進(jìn)制轉(zhuǎn)換:二進(jìn)制DNA轉(zhuǎn)換為十進(jìn)制數(shù) # float(2 ** DNA_SIZE - 1) 最大十進(jìn)制數(shù):31=[16+8+4+2+1] # pop.dot(2 ** np.arange(DNA_SIZE)[::-1]) / float(2 ** DNA_SIZE - 1) * X_BOUND[1] 將X范圍縮放到:[0, 5]pop = np.random.randint(2, size=(POP_SIZE, DNA_SIZE)) # 初始化DNA # [[1 0 1 1 0 0] # [0 1 1 1 0 0] # [1 0 0 1 1 1]] 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 plottingif '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 # 自然選擇(另外還有“父子混合選擇”策略)print("the X: ", translateDNA(pop[np.argmax(fitness), :])) # 具有最高點(diǎn)的X值plt.ioff(); plt.show()總結(jié)
以上是生活随笔為你收集整理的遗传算法及其应用实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android官方开发文档Trainin
- 下一篇: 技术思考:也谈知识图谱平台中的数据流程与