数学建模——智能优化之遗传算法详解Python代码
生活随笔
收集整理的這篇文章主要介紹了
数学建模——智能优化之遗传算法详解Python代码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
數學建模——智能優化之遺傳算法詳解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 #減去最小的適應度是為了防止適應度出現負數,通過這一步fitness的范圍為[0, np.max(pred)-np.min(pred)],最后在加上一個很小的數防止出現為0的適應度def translateDNA(pop): #pop表示種群矩陣,一行表示一個二進制編碼表示的DNA,矩陣的行數為種群數目x_pop = pop[:,1::2]#奇數列表示Xy_pop = pop[:,::2] #偶數列表示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 #孩子先得到父親的全部基因(這里我把一串二進制串的那些0,1稱為基因)if np.random.rand() < CROSSOVER_RATE: #產生子代時不是必然發生交叉,而是以一定的概率發生交叉mother = pop[np.random.randint(POP_SIZE)] #再種群中選擇另一個個體,并將該個體作為母親cross_points = np.random.randint(low=0, high=DNA_SIZE*2) #隨機產生交叉的點child[cross_points:] = mother[cross_points:] #孩子得到位于交叉點后的母親的基因mutation(child) #每個后代有一定的機率發生變異new_pop.append(child)return new_popdef mutation(child, MUTATION_RATE=0.003):if np.random.rand() < MUTATION_RATE: #以MUTATION_RATE的概率進行變異mutate_point = np.random.randint(0, DNA_SIZE) #隨機產生一個實數,代表要變異基因的位置child[mutate_point] = child[mutate_point]^1 #將變異點的二進制為反轉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("最優的基因型:", 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不會暫停,而是繼續執行plot_3d(ax) 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)總結
以上是生活随笔為你收集整理的数学建模——智能优化之遗传算法详解Python代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数学建模——主成分分析算法详解Pytho
- 下一篇: 2021 华数杯全国大学生数学建模竞赛B