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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

数学建模——智能优化之遗传算法详解Python代码

發(fā)布時間:2025/3/21 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数学建模——智能优化之遗传算法详解Python代码 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

數(shù)學(xué)建模——智能優(yōu)化之遺傳算法詳解Python代碼

import numpy as np import matplotlib.pyplot as plt from matplotlib import cm from mpl_toolkits.mplot3d import Axes3DDNA_SIZE = 24 POP_SIZE = 200 CROSSOVER_RATE = 0.8 MUTATION_RATE = 0.005 N_GENERATIONS = 50 X_BOUND = [-3, 3] Y_BOUND = [-3, 3]def F(x, y):return 3*(1-x)**2*np.exp(-(x**2)-(y+1)**2)- 10*(x/5 - x**3 - y**5)*np.exp(-x**2-y**2)- 1/3**np.exp(-(x+1)**2 - y**2)def plot_3d(ax):X = np.linspace(*X_BOUND, 100)Y = np.linspace(*Y_BOUND, 100)X,Y = np.meshgrid(X, Y)Z = F(X, Y)ax.plot_surface(X,Y,Z,rstride=1,cstride=1,cmap=cm.coolwarm)ax.set_zlim(-10,10)ax.set_xlabel('x')ax.set_ylabel('y')ax.set_zlabel('z')plt.pause(3)plt.show()def get_fitness(pop): x,y = translateDNA(pop)pred = F(x, y)return (pred - np.min(pred)) + 1e-3 #減去最小的適應(yīng)度是為了防止適應(yīng)度出現(xiàn)負(fù)數(shù),通過這一步fitness的范圍為[0, np.max(pred)-np.min(pred)],最后在加上一個很小的數(shù)防止出現(xiàn)為0的適應(yīng)度def translateDNA(pop): #pop表示種群矩陣,一行表示一個二進(jìn)制編碼表示的DNA,矩陣的行數(shù)為種群數(shù)目x_pop = pop[:,1::2]#奇數(shù)列表示Xy_pop = pop[:,::2] #偶數(shù)列表示y#pop:(POP_SIZE,DNA_SIZE)*(DNA_SIZE,1) --> (POP_SIZE,1)x = x_pop.dot(2**np.arange(DNA_SIZE)[::-1])/float(2**DNA_SIZE-1)*(X_BOUND[1]-X_BOUND[0])+X_BOUND[0]y = y_pop.dot(2**np.arange(DNA_SIZE)[::-1])/float(2**DNA_SIZE-1)*(Y_BOUND[1]-Y_BOUND[0])+Y_BOUND[0]return x,ydef crossover_and_mutation(pop, CROSSOVER_RATE = 0.8):new_pop = []for father in pop: #遍歷種群中的每一個個體,將該個體作為父親child = father #孩子先得到父親的全部基因(這里我把一串二進(jìn)制串的那些0,1稱為基因)if np.random.rand() < CROSSOVER_RATE: #產(chǎn)生子代時不是必然發(fā)生交叉,而是以一定的概率發(fā)生交叉mother = pop[np.random.randint(POP_SIZE)] #再種群中選擇另一個個體,并將該個體作為母親cross_points = np.random.randint(low=0, high=DNA_SIZE*2) #隨機(jī)產(chǎn)生交叉的點child[cross_points:] = mother[cross_points:] #孩子得到位于交叉點后的母親的基因mutation(child) #每個后代有一定的機(jī)率發(fā)生變異new_pop.append(child)return new_popdef mutation(child, MUTATION_RATE=0.003):if np.random.rand() < MUTATION_RATE: #以MUTATION_RATE的概率進(jìn)行變異mutate_point = np.random.randint(0, DNA_SIZE) #隨機(jī)產(chǎn)生一個實數(shù),代表要變異基因的位置child[mutate_point] = child[mutate_point]^1 #將變異點的二進(jìn)制為反轉(zhuǎn)def select(pop, fitness): # nature selection wrt pop's fitnessidx = np.random.choice(np.arange(POP_SIZE), size=POP_SIZE, replace=True,p=(fitness)/(fitness.sum()) )return pop[idx]def print_info(pop):fitness = get_fitness(pop)max_fitness_index = np.argmax(fitness)print("max_fitness:", fitness[max_fitness_index])x,y = translateDNA(pop)print("最優(yōu)的基因型:", pop[max_fitness_index])print("(x, y):", (x[max_fitness_index], y[max_fitness_index]))if __name__ == "__main__":fig = plt.figure()ax = Axes3D(fig) plt.ion()#將畫圖模式改為交互模式,程序遇到plt.show不會暫停,而是繼續(xù)執(zhí)行plot_3d(ax) ![請?zhí)砑訄D片描述](https://img-blog.csdnimg.cn/e6fd6d3dc132411c9d531415d2b6c545.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1OTM0NTIx,size_16,color_FFFFFF,t_70)pop = np.random.randint(2, size=(POP_SIZE, DNA_SIZE*2)) #matrix (POP_SIZE, DNA_SIZE)for _ in range(N_GENERATIONS):#迭代N代x,y = translateDNA(pop)if 'sca' in locals(): sca.remove()sca = ax.scatter(x, y, F(x,y), c='black', marker='o');plt.show();plt.pause(0.1)pop = np.array(crossover_and_mutation(pop, CROSSOVER_RATE))#F_values = F(translateDNA(pop)[0], translateDNA(pop)[1])#x, y --> Z matrixfitness = get_fitness(pop)pop = select(pop, fitness) #選擇生成新的種群print_info(pop)plt.ioff()plot_3d(ax)

總結(jié)

以上是生活随笔為你收集整理的数学建模——智能优化之遗传算法详解Python代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。