我目前正在做一个学校项目,该项目包括在给定孔隙度的情况下,从多孔介质中找出最大可能的水(因此我们找到最佳孔隙分布)。我用遗传算法来解决这个问题,把介质建模成一个正方形矩阵,其中0代表空隙,1代表固体介质,2代表水。我在互联网上查找交叉率、变异率等的最佳值。问题是有时我达到了最大值,然后在几代人中开始下降,有时我在所有的世代中都被介质中的水困住了。我不知道我哪里做错了。如果你需要进化过程或交叉的代码,请随时在评论中告诉我。提前谢谢。在
交叉线: 这个功能跨越两种介质并保持孔隙率,孩子应该有和父母一样的孔隙率。在
def crossover(g,h,n,p,cp):#crossover(parent1,parent2,size of matrix, porosity,crossover rate)
b=n*n
k=int(b*p)
l=g
if cp>rnd.random():
l[n//3:2*n//3] = h[n//3:2*n//3]
count = 0
for i in range(n):
for j in range(n):
if l[i][j] == 1:
count +=1
diff = count-k
if diff>0:
while diff>0:
i=rnd.randint(0,n-1)
j=rnd.randint(0,n-1)
if l[i][j] == 1:
l[i][j] = 0
diff -=1
if diff<0:
while diff<0:
i=rnd.randint(0,n-1)
j=rnd.randint(0,n-1)
if l[i][j] == 0:
l[i][j] = 1
diff+=1
return l
这是一个两点交叉。在
进化代码:
^{pr2}$编辑: 在将突变率提高到0.05后,遗传算法给了我很好的结果,但这不意味着我失去了一些父母的基因吗? 另一个问题是,如果我选择第一次GA运行的结果,并在下一次GA运行中使用它,它会提高性能吗?在
我相信问题就在这里
这似乎是你从一个父母那里提取一些染色体并将它们分配给另一个,但你并不是随机这样做的。我认为如果您生成一个随机交叉点并将
^{pr2}$//3
替换为//k
,那么效果会更好。但你需要两个新的染色体,比如对下一个子染色体做相反的处理。在
在任何情况下,初始随机参数,如交叉概率和变异概率都应该进行实验,以确保鞍点不会到达。在
相关问题 更多 >
编程相关推荐