python人工智能遺傳算法示例解析
一、實驗目的
熟悉和掌握遺傳算法的原理、流程和編碼策略,并利用遺傳求解函數(shù)優(yōu)化問題,理解求解流程并測試主要參數(shù)對結(jié)果的影響。
二、實驗原理
遺傳算法的基本思想正是基于模仿生物界遺傳學的遺傳過程。它把問題的參數(shù)用基因代表,把問題的解用染色體代表(在計算機里用二進制碼表示),從而得到一個由具有不同染色體的個體組成的群體。這個群體在問題特定的環(huán)境里生存競爭,適者有最好的機會生存和個體組成的群體。后代隨機化地繼承了父代的最好特征,并也在生存環(huán)境的控制支配下繼續(xù)這一過程,群體的染色體都將逐漸適應環(huán)境,不斷進化,最后收斂到一族最適應環(huán)境的類似個體,即得到問題最優(yōu)的解。
三、實驗條件
Python3,Anaconda3,PyCharm
四、實驗內(nèi)容
import matplotlib.pyplot as plt
import random
import math
#計算函數(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
#適應函數(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))
# 計算2進制序列代表的數(shù)值
'''
解碼并計算值
group 染色體
chrom_length 染色體長度
max_value, min_value 上下限
div 分界點
'''
def b2d(b, chrom_length, max_value, min_value, div):
rwno = []
#因為染色體里面有多個變量,所以需要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 # 這是一個list
'''
計算當前函數(shù)值
group 染色體
chrom_length 染色體長度
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)#這里面可能是多個變量
obj_value.append(f(x))
return obj_value
# 獲取適應值
def calfitValue(obj_value):
fit_value = []
for i in range(len(obj_value)):
temp = s(obj_value[i]) # 調(diào)用適應函數(shù)計算
fit_value.append(temp)
return fit_value
#累計適應值方便計算平均
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 = [] #[ [[染色體], [錨點]],... ]
newgroup = [] #[ [父], [母], [父], [母],....]
# 適應度總和
total_fit = sum_fit(fit_value)
# 設置各個的錨點
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])) # 隨機交叉點
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) # 取要變異哪個
if(group[i][mpoint] == 1):
group[i][mpoint] = 0
else:
group[i][mpoint] = 1
'''
找出最優(yōu)解和最優(yōu)解的基因編碼
group 種群染色去
fit_value 種群適應
'''
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 染色體長度
'''
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 # 染色體長度
divid = [399, chrom_length-1] # 輸入值分界點, 最后一位必須是染色體長度
pc = 0.7 # 交配概率
pm = 0.1 # 變異概率
results = [] # 存儲每一代的最優(yōu)解
fit_value = [] # 個體適應度
points = [] #多個最優(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) # 個體評價
fit_value = calfitValue(obj_value) # 獲取群體適應值
best_individual, best_fit = best(group, fit_value) # 返回最優(yōu)基因, 最優(yōu)適應值
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) ):#剔除重復解
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]) #加進坐標里
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], " 適應值 = ", rank[-1][1], "代數(shù):", rank[-1][0])
#輸出適應圖
X = []
Y = []
for i in range(generation):
X.append(i)
Y.append(results[i][1])
plt.plot(X, Y)
plt.show()
五、實驗結(jié)果

以上就是python人工智能遺傳算法示例解析的詳細內(nèi)容,更多關于python人工智能遺傳算法的資料請關注腳本之家其它相關文章!
相關文章
Python2與Python3關于字符串編碼處理的差別總結(jié)
這篇文章主要給大家介紹了Python2與Python3關于字符串編碼處理差別的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-09-09
一個非常簡單好用的Python圖形界面庫(PysimpleGUI)
這篇文章主要介紹了一個非常簡單好用的Python圖形界面庫,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-12-12
Python?pandas庫中isnull函數(shù)使用方法
這篇文章主要介紹了Python?pandas庫中isnull函數(shù)使用方法,python的pandas庫中有?個?分便利的isnull()函數(shù),它可以?來判斷缺失值,具體介紹需要的小伙伴可以參考一下2022-06-06

