繁体   English   中英

如何为遗传算法编写交叉 function

[英]how to write a crossover function for genetic algorithm

def crossover(parents):
    result = copy.deepcopy(parents[0].brain)
    for param in result.parameters():
        print((param.shape[0] / 2))
        if len(param.shape) == 2:  # weights of linear layer
            for i0 in range(param.shape[0]):
                for i1 in range(param.shape[1]):
                    if i0 < (param.shape[0] / 2) and i1 < (param.shape[1]):
                        param[i0][i1] = [param[i0][i1] for param in parents[0].brain.parameters() if
                                         len(param.shape) == 2]
                        # print("x is", x)
                        # print(f"param{i0}{i1}", param[i0][i1])
                        # param[i0][i1] = 2
                    else:
                        param[i0][i1] = [param[i0][i1] for param in parents[1].brain.parameters() if
                                         len(param.shape) == 2]

我正在使用 pytorch 库并尝试为我的项目编写交叉 function。 最初为了交叉结果,我只是为了方便而复制了其中一位父母的大脑。 然后我将它从中间切开,并将父母双方的大脑融合在其中。 问题是这个“param [i0] [i1] for param in parents[1].brain.parameters()”的output是一个不应该的3个张量的列表。 output

x is [tensor(0.0775), tensor(0.0372), tensor(0.2628)]
param07 tensor(0.0775)

我该如何解决?

我试图在那里使用的列表理解有问题,我认为我仍然不完全理解。 所以我为它写了一个适当的循环并且它起作用了。

def crossover(parents):
    result = copy.deepcopy(parents[0].brain)
    for param in result.parameters():
        if len(param.shape) == 2:  # weights of linear layer
            for i0 in range(param.shape[0]):
                for i1 in range(param.shape[1]):
                    if i0 < (param.shape[0] / 2) and i1 < (param.shape[1]):
                        for p in parents[0].brain.parameters():
                            if len(p.shape) == 2 and param.shape == p.shape:
                                param[i0][i1] = p[i0][i1]
                    else:
                        for p in parents[1].brain.parameters():
                            if len(p.shape) == 2 and param.shape == p.shape:
                                param[i0][i1] = p[i0][i1]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM