#染色体的类
class Chrom:
chrom = []
fitness = 0
def showChrom(self):
print(self.chrom)
def showFitness(self):
print(self.fitness) #基础参数
N = 200 #种群内个体数目
mut = 0.2 #突变概率
acr = 0.2 #交叉概率
pop = {} #存储染色体的字典
for i in range(N):
pop['chrom'+str(i)] = Chrom()
chromNodes = 2 #染色体节点数(变量个数)
iterNum = 10000 #迭代次数
chromRange = [[0, 10], [0, 10]] #染色体范围
aveFitnessList = [] #平均适应度
bestFitnessList = [] #最优适应度 #初始染色体 pop = Genetic.initialize(pop, chromNodes, chromRange) pop = Fitness.calFitness(pop) #计算适应度 bestChrom = Genetic.findBest(pop) #寻找最优染色体 bestFitnessList.append(bestChrom[1]) #将当前最优适应度压入列表中 aveFitnessList.append(Genetic.calAveFitness(pop, N)) #计算并存储平均适应度
#开始迭代 for t in range(iterNum): #染色体突变 pop = Genetic.mutChrom(pop, mut, chromNodes, bestChrom, chromRange) #染色体交换 pop = Genetic.acrChrom(pop, acr, chromNodes) #寻找最优 nowBestChrom = Genetic.findBest(pop) #比较前一个时间的最优和现在的最优 bestChrom = Genetic测试数据pareChrom(nowBestChrom, bestChrom) #寻找与替换最劣 worseChrom = Genetic.findWorse(pop) pop[worseChrom[0]].chrom = pop[bestChrom[0]].chrom.copy() pop[worseChrom[0]].fitness = pop[bestChrom[0]].fitness #存储最优与平均 bestFitnessList.append(bestChrom[1]) aveFitnessList.append(Genetic.calAveFitness(pop, N))
plt.figure(1) plt.plot(x, aveFitnessList) plt.plot(x, bestFitnessList) plt.show()
import Genetic import Fitness import matplotlib.pyplot as plt import numpy as np
import random
#寻找最优染色体
def findBest(pop):
best = ['1', 0.0000001]
for i in pop:
if best[1] < pop[i].fitness:
best = [i, pop[i].fitness]
return best
#寻找最劣染色体
def findWorse(pop):
worse = ['1', 999999]
for i in pop:
if worse[1] > pop[i].fitness:
worse = [i, pop[i].fitness]
return worse
#赋初始值
def initialize(pop, chromNodes, chromRange):
for i in pop:
chromList = []
for j in range(chromNodes):
chromList.append(random.uniform(chromRange[j][0], chromRange[j][1]+1))
pop[i].chrom = chromList.copy()
return pop
#计算平均适应度
def calAveFitness(pop, N):
sumFitness = 0
for i in pop:
sumFitness = sumFitness + pop[i].fitness
aveFitness = sumFitness / N
return aveFitness
#进行突变
def mutChrom(pop, mut, chromNodes, bestChrom, chromRange):
for i in pop:
#如果随机数小于变异概率(即可以变异)
if mut > random.random():
mutNode = random.randrange(0,chromNodes)
mutRange = random.random() * (1-pop[i].fitness/bestChrom[1])**2
pop[i].chrom[mutNode] = pop[i].chrom[mutNode] * (1+mutRange)
#判断变异后的范围是否在要求范围内
pop[i].chrom[mutNode] = inRange(pop[i].chrom[mutNode], chromRange[mutNode])
return pop
#检验便宜范围是否在要求范围内
def inRange(mutNode, chromRange):
if chromRange[0] < mutNode < chromRange[1]:
return mutNode
elif mutNode-chromRange[0] > mutNode-chromRange[1]:
return chromRange[1]
else:
return chromRange[0]
#进行交叉
def acrChrom(pop, acr, chromNodes):
for i in pop:
for j in pop:
if acr > random.random():
acrNode = random.randrange(0, chromNodes)
#两个染色体节点进行交换
pop[i].chrom[acrNode], pop[j].chrom[acrNode] = pop[j].chrom[acrNode], pop[i].chrom[acrNode]
return pop
#进行比较
def compareChrom(nowbestChrom, bestChrom):
if bestChrom[1] > nowbestChrom[1]:
return bestChrom
else:
return nowbestChrom import math
def calFitness(pop):
for i in pop:
#计算每个染色体的适应度
pop[i].fitness = funcFitness(pop[i].chrom)
return pop
def funcFitness(chrom):
#适应度函数
fitness = math.sin(chrom[0])+math.cos(chrom[1])+0.1*(chrom[0]+chrom[1]) 以上就是Python实现遗传算法的代码的详细内容,更多请关注Gxl网其它相关文章!
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did84396