資源簡介
解決的例子y=10*sin(5x)+7*cos(4x)
代碼用python3.6可以運行
代碼片段和文件信息
#?-*-?coding:?utf-8?-*-
“““
Created?on?Sat?Mar?30?17:01:13?2019
@author:?Administrator
“““
import?random
import?math
import?numpy?as?np
import?matplotlib.pyplot?as?plt
?
population_size?=?500??#?種群數量
generations?=?200??#?迭代次數
chrom_length?=?10???#?染色體長度
pc?=?0.6??#?交配概率
pm?=?0.01??#?變異概率
genetic_population?=?[]??#?種群的基因編碼(二進制)
population?=?[]??#?種群對應的十進制數值并標準化范圍到[0?10]
fitness?=?[]??#?適應度
fitness_mean?=?[]
optimum_solution?=?[]??#?每次迭代的所獲得的最優解
?
?
#?為染色體進行01編碼,生成初始種群
def?chrom_encoding():
????for?i?in?range(population_size):
????????population_i?=?[]
????????for?j?in?range(chrom_length):
????????????population_i.append(random.randint(0?1))
????????genetic_population.append(population_i)
?
?
#?對染色體進行解碼,將二進制轉化為十進制
def?chrom_decoding():
????population.clear()
????for?i?in?range(population_size):
????????value?=?0
????????for?j?in?range(chrom_length):
????????????value?+=?genetic_population[i][j]?*?(2?**?(chrom_length?-?1?-?j))
????????population.append(value?*?10?/?(2?**?(chrom_length)?-?1))
?
?
#?計算每個染色體的適應度
def?calculate_fitness():
????sum?=?0.0
????fitness.clear()
????for?i?in?range(population_size):
????????function_value?=?10?*?math.sin(5?*?population[i])?+?7?*?math.cos(4?*?population[i])
????????if?function_value?>?0.0:
????????????sum?+=?function_value
????????????fitness.append(function_value)
????????else:
????????????fitness.append(0.0)
????#?返回群體的平均適應度
????return?sum?/?population_size
?
?
#?獲取最大適應度的個體和對應的編號
def?best_value():
????max_fitness?=?fitness[0]
????max_chrom?=?0
????for?i?in?range(population_size):
????????if?fitness[i]?>?max_fitness:
????????????max_fitness?=?fitness[i]
????????????max_chrom?=?i
????return?max_chrom?max_fitness
?
?
#?采用輪盤賭算法進行選擇過程,重新選擇與種群數量相等的新種群
def?selection():
????fitness_proportion?=?[]
????fitness_sum?=?0
????for?i?in?range(population_size):
????????fitness_sum?+=?fitness[i]
????#?計算生存率
????for?i?in?range(population_size):
????????fitness_proportion.append(fitness[i]?/?fitness_sum)
????pie_fitness?=?[]
????cumsum?=?0.0
????for?i?in?range(population_size):
????????pie_fitness.append(cumsum?+?fitness_proportion[i])
????????cumsum?+=?fitness_proportion[i]
????pie_fitness[-1]?=?1
????#?生成隨機數在輪盤上選點[0?1)
????random_selection?=?[]
????for?i?in?range(population_size):
????????random_selection.append(random.random())
????random_selection.sort()
????#?選擇新種群
????new_genetic_population?=?[]
????random_sel
評論
共有 條評論