我有一个简单的遗传算法,它必须达到陷阱函数的最佳点,定义如下:
def R(x):
n = len(x)
m = int(math.ceil(n/3))
s = sum(x)
if (s==n):
return 2*n*n,
elif (s<(n-m)):
return n*s-B(x),
else:
return 0,
def B(x):
i = 0
n = len(x)
mbs = 0
# loops over all the variables
while (i<n):
k = i
while (k<n and x[k]==0):
k = k + 1
#print("k="+str(k))
j = k
while (j<n and x[j]==1):
j = j + 1
if (j-k>mbs):
mbs = j-k
#print("j="+str(j))
i = j
return mbs
我考虑过大幅增加pop的大小,并“希望”使用random.seed()
生成第一代中的最佳个体,然后传播它。为此,我只会考虑一个具有“大”锦标赛窗口的锦标赛选择。
此解决方案仅适用于 5 和 10 个属性,但不适用于 30 个属性。关键是我不知道如何解决 30 个属性的情况。 希望有人能够帮助我。
最佳答案
I can use only a simple GA with some elitism...
鉴于此限制,您可以在不使用精英主义的情况下增加人口规模,但它不会很好地扩展。
zegkljan 使用新颖性搜索的想法似乎更好,并且可以在不改变搜索引擎的情况下遵循。
只需更改适应度函数:
score(i) = (1 − ρ) · fit(i) + ρ · nov(i)
fit(i)
是标准化的 R
函数:
fit(i) = (R(i) - Rmin) / (Rmax - Rmin)
和 nov(i)
是标准化的新颖性函数(您必须保留已经见过的个体的文件,但这不需要对“引擎”进行修改)。
ρ ∈ [0,1]
控制适应性和新颖性的相对重要性。
有关此技术的更多详细信息:When Novelty is not Enough (朱塞佩·库库、福斯蒂诺·戈麦斯)
关于algorithm - 遗传算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36023259/