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)

 

posted @   阿Qi早起了吗  阅读(125)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示