我写了一段代码,实现了一个简单的遗传算法来最大化:
f(x) = 15x - x^2
该函数在7.5时达到最大值,因此代码输出应该是7或8,因为总体是整数。当我运行代码10次时,我得到了大约7或8次,其中3次10次。我应该做什么修改来进一步改进算法,以及不同类型的遗传算法是什么?
代码如下:
from random import *
import numpy as np
#fitness function
def fit(x):
return 15*x -x**2
#covert binary list to decimal number
def to_dec(x):
return int("".join(str(e) for e in x), 2)
#picks pairs from the original population
def gen_pairs(populationl, prob):
pairsl = []
test = [0, 1, 2, 3, 4, 5]
for i in range(3):
pair = []
for j in range(2):
temp = np.random.choice(test, p=prob)
pair.append(populationl[temp].copy())
pairsl.append(pair)
return pairsl
#mating function
def cross_over(prs, mp):
new = []
for pr in prs:
if mp[prs.index(pr)] == 1:
index = np.random.choice([1,2,3], p=[1/3, 1/3, 1/3])
pr[0][:index], pr[1][:index] = pr[1][:index], pr[0][:index]
for pr in prs:
new.append(pr[0])
new.append(pr[1])
return new
#mutation
def mutation(x):
for chromosome in x:
for gene in chromosome:
mutation_prob = np.random.choice([0, 1], p=[0.999, .001])
if mutation_prob == 1:
#m_index = np.random.choice([0,1,2,3])
if gene == 0:
gene = 1
else:
gene = 0
#generate initial population
randlist = lambda n:[randint(0,1) for b in range(1, n+1)]
for j in range(10):
population = [randlist(4) for i in range(6)]
for _ in range(20):
fittness = [fit(to_dec(y)) for y in population]
s = sum(fittness)
prob = [e/s for e in fittness]
pairsg = gen_pairs(population.copy(), prob)
mating_prob = []
for i in pairsg:
mating_prob.append(np.random.choice([0,1], p=[0.4,0.6]))
new_population = cross_over(pairsg, mating_prob)
mutated = mutation(new_population)
decimal_p = [to_dec(i)for i in population]
decimal_new = [to_dec(i)for i in new_population]
# print(decimal_p)
# print(decimal_new)
population = new_population
print(decimal_new)
发布于 2018-06-02 05:20:47
这是进化算法的一个非常典型的情况。成功率是一个非常常见的指标,30%是一个不错的结果。
举个例子,最近我为Santa Fe Trail problem实现了一个GP/GE solver,它展示了30%或更少的成功率。
如何提高成功率
基于有限的经验,对这个问题的个人解释如下。
当进化算法收敛于局部最优解或陷入大平台时,它无法找到接近全局最优解,并且其种群中没有足够的多样性来通过找到更好的区域来摆脱这种陷阱。
您可以尝试通过增加种群大小来为您的算法提供更多的多样性。或者你可以研究像novelty search和quality diversity这样的技术。
顺便说一句,这里有一个非常好的新奇搜索与健身搜索的交互式演示:http://eplex.cs.ucf.edu/noveltysearch/userspage/demo.html
https://stackoverflow.com/questions/50634857
复制相似问题