python人工智能遺傳算法示例解析
一、實(shí)驗(yàn)?zāi)康?/h2>
熟悉和掌握遺傳算法的原理、流程和編碼策略,并利用遺傳求解函數(shù)優(yōu)化問題,理解求解流程并測(cè)試主要參數(shù)對(duì)結(jié)果的影響。
二、實(shí)驗(yàn)原理
遺傳算法的基本思想正是基于模仿生物界遺傳學(xué)的遺傳過程。它把問題的參數(shù)用基因代表,把問題的解用染色體代表(在計(jì)算機(jī)里用二進(jìn)制碼表示),從而得到一個(gè)由具有不同染色體的個(gè)體組成的群體。這個(gè)群體在問題特定的環(huán)境里生存競(jìng)爭(zhēng),適者有最好的機(jī)會(huì)生存和個(gè)體組成的群體。后代隨機(jī)化地繼承了父代的最好特征,并也在生存環(huán)境的控制支配下繼續(xù)這一過程,群體的染色體都將逐漸適應(yīng)環(huán)境,不斷進(jìn)化,最后收斂到一族最適應(yīng)環(huán)境的類似個(gè)體,即得到問題最優(yōu)的解。
三、實(shí)驗(yàn)條件
Python3,Anaconda3,PyCharm
四、實(shí)驗(yàn)內(nèi)容
import matplotlib.pyplot as plt import random import math #計(jì)算函數(shù) def f(args): return f2(args) def f1(args): return (3 - (math.sin(2*args[0]))**2 - (math.sin(2*args[1]))**2) def f2(args): x = 1 for i in range(len(args)): z = 0 for j in range(5): z += (j+1) * math.cos(((j+1)+1)*args[i]+(j+1)) x *= z return x #適應(yīng)函數(shù) def s(x): return s2(x) def s1(x): return math.exp(-abs(x-1)) def s2(x): return math.exp(-abs(x+187)) # 計(jì)算2進(jìn)制序列代表的數(shù)值 ''' 解碼并計(jì)算值 group 染色體 chrom_length 染色體長(zhǎng)度 max_value, min_value 上下限 div 分界點(diǎn) ''' def b2d(b, chrom_length, max_value, min_value, div): rwno = [] #因?yàn)槿旧w里面有多個(gè)變量,所以需要div來分割 for i in range(len(div)): if i == 0: star = 0 end = div[i] else: star = div[i-1] + 1 end = div[i] t = 0 for j in range(star, end): # 分隔參數(shù)[1,2,3||4,5,6] t += b[j] * (math.pow(2, j - star)) t = t * max_value / (math.pow(2, end - star + 1) - 1) - min_value rwno.append(t) return rwno # 這是一個(gè)list ''' 計(jì)算當(dāng)前函數(shù)值 group 染色體 chrom_length 染色體長(zhǎng)度 max_value,min_value 最大最小值 divid 分割 ''' def calobjValue(group, chrom_length, max_value, min_value, divid): obj_value = [] for i in range(len(group)): x = b2d(group[i], chrom_length, max_value, min_value, divid)#這里面可能是多個(gè)變量 obj_value.append(f(x)) return obj_value # 獲取適應(yīng)值 def calfitValue(obj_value): fit_value = [] for i in range(len(obj_value)): temp = s(obj_value[i]) # 調(diào)用適應(yīng)函數(shù)計(jì)算 fit_value.append(temp) return fit_value #累計(jì)適應(yīng)值方便計(jì)算平均 def sum_fit(fit_value): total = 0 for i in range(len(fit_value)): total += fit_value[i] return total # 轉(zhuǎn)輪盤選擇法 def selection(group, fit_value): newfit_value = [] #[ [[染色體], [錨點(diǎn)]],... ] newgroup = [] #[ [父], [母], [父], [母],....] # 適應(yīng)度總和 total_fit = sum_fit(fit_value) # 設(shè)置各個(gè)的錨點(diǎn) t = 0 for i in range(len(group)): t += fit_value[i]/total_fit newfit_value.append([group[i], t]) # 轉(zhuǎn)輪盤選擇法 for i in range(len(newfit_value)): parents = len(newfit_value) # 初始化指針 r = random.random() #指針 for j in range(len(newfit_value)):#看看指針指到睡了 if newfit_value[j][1] > r: parents = j break newgroup.append(newfit_value[parents][0]) return newgroup # 交配 def crossover(group, fit_value, pc): parents_group = selection(group, fit_value) #[ [[父], [母]],....] group_len = len(parents_group) for i in range(0, group_len, 2): if(random.random() < pc): # 看看是否要交配 cpoint = random.randint(0, len(parents_group[0])) # 隨機(jī)交叉點(diǎn) temp1 = [] temp2 = [] temp1.extend(parents_group[i][0:cpoint]) temp1.extend(parents_group[i+1][cpoint:len(parents_group[i])]) temp2.extend(parents_group[i+1][0:cpoint]) temp2.extend(parents_group[i][cpoint:len(parents_group[i])]) group[i] = temp1 group[i+1] = temp2 # 基因突變 def mutation(group, pm): px = len(group) py = len(group[0]) for i in range(px): # 遍歷 if(random.random() < pm): mpoint = random.randint(0, py-1) # 取要變異哪個(gè) if(group[i][mpoint] == 1): group[i][mpoint] = 0 else: group[i][mpoint] = 1 ''' 找出最優(yōu)解和最優(yōu)解的基因編碼 group 種群染色去 fit_value 種群適應(yīng) ''' def best(group, fit_value): px = len(group) best_in = group[0] best_fit = fit_value[0] for i in range(1, px): if(fit_value[i] > best_fit): best_fit = fit_value[i] best_in = group[i] #print(best_in) return [best_in, best_fit] ''' 創(chuàng)建初代種群 group_size 種群大小 chrom_length 染色體長(zhǎng)度 ''' def getFisrtGroup(group_size, chrom_length): #print('初代種群:') group = [] for i in range(group_size): temp = [] for j in range(chrom_length): temp.append(random.randint(0, 1)) group.append(temp) #print(group) return group generation = 50 # 繁衍代數(shù)(數(shù)量越小,出結(jié)果膾,迭代次數(shù)越少) group_size = 400 # 染色體數(shù)量,偶數(shù) max_value = 20 # 范圍 min_value = 10 # 偏移修正 chrom_length = 800 # 染色體長(zhǎng)度 divid = [399, chrom_length-1] # 輸入值分界點(diǎn), 最后一位必須是染色體長(zhǎng)度 pc = 0.7 # 交配概率 pm = 0.1 # 變異概率 results = [] # 存儲(chǔ)每一代的最優(yōu)解 fit_value = [] # 個(gè)體適應(yīng)度 points = [] #多個(gè)最優(yōu)解 #生成初代 group = getFisrtGroup(group_size, chrom_length) for i in range(generation): if i > 100: pm = 0.01 if i > 1000: pm = 0.001 obj_value = calobjValue(group, chrom_length, max_value, min_value, divid) # 個(gè)體評(píng)價(jià) fit_value = calfitValue(obj_value) # 獲取群體適應(yīng)值 best_individual, best_fit = best(group, fit_value) # 返回最優(yōu)基因, 最優(yōu)適應(yīng)值 xx = b2d(best_individual, chrom_length, max_value, min_value, divid) if( abs(f(xx)+186.730909) < 0.000001):#找到最優(yōu)解 flag = False for p in points: if( (abs(xx[0]-p[0]) < 0.1) and (abs(xx[1]-p[1]) < 0.1) ):#剔除重復(fù)解 flag = True break if flag == False: print(xx) points.append(xx) results.append([i, best_fit, b2d(best_individual, chrom_length, max_value, min_value, divid), best_individual]) #加進(jìn)坐標(biāo)里 crossover(group, fit_value, pc) # 交配 mutation(group, pm) # 變異 #results.sort(key=lambda x:x[1]) rank = sorted(results, key=lambda x:x[1]) #print('\n', rank[-1]) #print(results) x = b2d(rank[-1][3], chrom_length, max_value, min_value, divid) #最終結(jié)果 print("f(x) = " , f(x) , "x = " , x , " 染色體 = ", rank[-1][3], " 適應(yīng)值 = ", rank[-1][1], "代數(shù):", rank[-1][0]) #輸出適應(yīng)圖 X = [] Y = [] for i in range(generation): X.append(i) Y.append(results[i][1]) plt.plot(X, Y) plt.show()
五、實(shí)驗(yàn)結(jié)果
以上就是python人工智能遺傳算法示例解析的詳細(xì)內(nèi)容,更多關(guān)于python人工智能遺傳算法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python2與Python3關(guān)于字符串編碼處理的差別總結(jié)
這篇文章主要給大家介紹了Python2與Python3關(guān)于字符串編碼處理差別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09一個(gè)非常簡(jiǎn)單好用的Python圖形界面庫(kù)(PysimpleGUI)
這篇文章主要介紹了一個(gè)非常簡(jiǎn)單好用的Python圖形界面庫(kù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12基于Python實(shí)現(xiàn)千圖成像工具的示例代碼
千圖成像也就是用N張圖片組成一張圖片的效果。這篇文章將利用Python語(yǔ)言編寫一個(gè)簡(jiǎn)單的千圖成像工具,感興趣的小伙伴可以了解一下2022-07-07Python?pandas庫(kù)中isnull函數(shù)使用方法
這篇文章主要介紹了Python?pandas庫(kù)中isnull函數(shù)使用方法,python的pandas庫(kù)中有?個(gè)?分便利的isnull()函數(shù),它可以?來判斷缺失值,具體介紹需要的小伙伴可以參考一下2022-06-06