Python:遗传算法弱性能

2024-06-16 14:53:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在做一个学校项目,该项目包括在给定孔隙度的情况下,从多孔介质中找出最大可能的水(因此我们找到最佳孔隙分布)。我用遗传算法来解决这个问题,把介质建模成一个正方形矩阵,其中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运行中使用它,它会提高性能吗?在


Tags: 项目代码ifcountdiff代表cp交叉
1条回答
网友
1楼 · 发布于 2024-06-16 14:53:38

我相信问题就在这里

l[n//3:2*n//3] = h[n//3:2*n//3]

这似乎是你从一个父母那里提取一些染色体并将它们分配给另一个,但你并不是随机这样做的。我认为如果您生成一个随机交叉点并将//3替换为//k,那么效果会更好。但你需要两个新的染色体,比如

^{pr2}$

对下一个子染色体做相反的处理。在

在任何情况下,初始随机参数,如交叉概率和变异概率都应该进行实验,以确保鞍点不会到达。在

相关问题 更多 >