f(x) = x^2的最小值求解
参考
可以先根据框架自己尝试写一下。
#参数值
popSize=50 #种群规模
sigma = 1
L = 20
maxGen = 50 #最大代数
oldPop=initialzePop() #随机初始化产生popSize 个[-L,+L]之间的实数,列表oldPop
oldFit=fitnessFun(oldPop) #对每个个体x=oldPop[i],计算其适应度值oldFit[i]=x^2
# oldPop, oldFit, newPop, newFit为长度都是popSize的列表,popSize表示种群大小,每个种群就是popSize个实数
for i in range(1, maxGen): # maxGen 表示进化最大世代数, 比如30,50,
# 交叉
newPop=crossover(oldPop)
# i1,i2 在[1,popSize]内,x1= oldPop[i1], x2= oldPop[i2], 随机选择两个个体x1,x2,
# 令y[i]=(x1+x2)/2,重复popSize次,生成新种群,
# 相当于 for i in range(1, popSize): 逐个的得到y[i], 结束后return y
# 变异
newPop = mutation(newPop)
# 对交差后的每个个体x, 高斯扰动y[i]=x+N(0,sigma^2), 生成新种群,return y
# 选择
newFit = fitnessFun(newPop)
#对每个个体x= newPop [i],计算其适应度值newFit(i)=x^2
[oldPop, oldFit]=select(oldPop,newPop) # 将原种群和新种群的并集按适应度值排序,选择前面最好的popSize个作为下代, 函数体中直接调用排序函数,课本专门有一章可以有排序api函数调用的 sort
#输出最好的个体和适应度值,即为最优解和最优函数值
bestIndividual = oldPop[1]
bestFitness = oldFit[1]
简单实现
# 初始化
# 随机初始化产生popSize 个[-L,+L]之间的实数,列表oldPop
import random
def initialzePop(popSize, L):
oldPop = []
for i in range(0, popSize):
n = random.uniform(-L, L)
oldPop.append(n)
# print(oldPop)
return oldPop
# 适应函数
def fitnessFun(oldPop):
oldFit = []
for i in range(0, len(oldPop)):
oldFit.append(oldPop[i]**2)
return oldFit
# 交叉
# i1,i2 在[1,popSize]内,x1= oldPop[i1], x2= oldPop[i2], 随机选择两个个体x1,x2,
# 令y[i]=(x1+x2)/2,重复popSize次,生成新种群,
# 相当于 for i in range(1, popSize): 逐个的得到y[i], 结束后return y
def crossover(oldPop):
y = []
popSize = len(oldPop)
for i in range(0, popSize):
i1 = random.randint(0, popSize-1)
i2 = random.randint(0, popSize-1)
# print(i1)
# print("5555555555555555555")
# print(i2)
x1 = oldPop[i1]
x2 = oldPop[i2]
y.append((x1 + x2) / 2)
return y
# 将原种群和新种群的并集按适应度值排序,选择前面最好的popSize个作为下代,
# 函数体中直接调用排序函数,课本专门有一章可以有排序api函数调用的 sort
def xx(x):
a = x**2
return a
def sel(oldPop, newPop):
oldPop.extend(newPop)
oldPop.sort(key=xx, reverse=True)
a = []
for i in range(len(newPop)):
a.append(oldPop[i])
# b = fitnessFun(a)
return a
# 变异
# 对交差后的每个个体x, 高斯扰动y[i]=x+N(0,sigma^2), 生成新种群,return y
def mutation(newPop, sigma):
y = []
for i in range(0, len(newPop)):
y.append(newPop[i] + random.gauss(0, sigma))
return y
# 参数值
popSize = 50 # 种群规模
sigma = 1
L = 20
maxGen = 50 # 最大代数
oldPop = initialzePop(popSize, L) # 随机初始化产生popSize个[-L,+L]之间的实数,列表oldPop
# print(oldPop)
oldFit = fitnessFun(oldPop) # 对每个个体x=oldPop[i],计算其适应度值oldFit[i]=x^2
# print(oldFit)
# oldPop, oldFit, newPop, newFit为长度都是popSize的列表,popSize表示种群大小,每个种群就是popSize个实数
for i in range(1, maxGen): # maxGen 表示进化最大世代数, 比如30,50,
# 交叉
newPop = crossover(oldPop)
# i1,i2 在[1,popSize]内,x1= oldPop[i1], x2= oldPop[i2], 随机选择两个个体x1,x2,
# 令y[i]=(x1+x2)/2,重复popSize次,生成新种群,
# 相当于 for i in range(1, popSize): 逐个的得到y[i], 结束后return y
# 变异
newPop = mutation(newPop, sigma)
# 对交差后的每个个体x, 高斯扰动y[i]=x+N(0,sigma^2), 生成新种群,return y
# 选择
newFit = fitnessFun(newPop)
# 对每个个体x= newPop [i],计算其适应度值newFit(i)=x^2
oldPop = sel(oldPop, newPop)
oldFit = fitnessFun(oldPop)
# 将原种群和新种群的并集按适应度值排序,选择前面最好的popSize个作为下代,
# 函数体中直接调用排序函数,课本专门有一章可以有排序api函数调用的 sort
# 输出最好的个体和适应度值,即为最优解和最优函数值
bestIndividual = oldPop[0]
bestFitness = oldFit[0]
print("最优解:%s"%bestIndividual)
print("最优函数值:%s"%bestFitness)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律