8皇后puzz的遗传算法

2024-09-28 05:28:28 发布

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

我正在尝试应用遗传算法来解决8皇后难题。我已经编码了整个算法,但它总是被卡住,当它找到解决方案与6个unhit皇后,无法克服它。我觉得有一些多样性的问题,但我不知道该怎么办。我的问题是,这种认识有什么问题,为什么它总是卡在6个不健康的皇后身上,不能做出最后的行动?我已经检查了所有的代码,我认为对算法本身的发展有一些误解。所以我附加了整个代码。所以我希望有人能告诉我我哪里做错了。提前谢谢。在

    def mutate(self, children):
        rnd.seed()
        count = 0
        for child in children:
            count += 1
            if rnd.random() < self.mut_prob:
                i = rnd.randrange(0, 7)
                ind = child[i].index(1)
                child[i][ind] = 0
                j = rnd.randrange(0, 7)
                child[i][j] = 1



    def solve(self, min_fitness= 7, max_epochs=100):
        prev_pop = self.initial_population()
        epochs = 0
        max_fitness = 0

        while (max_fitness <= min_fitness) and (epochs < max_epochs):
            fitness = self.fitness_function(prev_pop)
            fitness.sort(key=lambda tup: tup[1])

            best_sol = fitness[len(fitness) - 1][0]
            max_fitness = fitness[len(fitness) - 1][1]
            mating = self.roulette(fitness)

            mating_chromes = []
            pop = copy.deepcopy(prev_pop)
            for chrom in mating:
                mating_chromes.append(pop[chrom])
            pop.clear()

            children = self.crossover(mating_chromes)
            self.mutate(children)
            fit = self.fitness_function(prev_pop)


            to_destroy = self.reduction(fitness)

            for el in to_destroy:
                prev_pop[el] = children.pop(0)

            epochs += 1
        print(max_fitness)
        print(epochs)
        for el in prev_pop[best_sol]:
            print(el)
            print("\n")
        print("im fine")
        return 0

s = Solver_8_queens()
arr = s.solve()

Tags: inselfchildforpopelmaxprint
1条回答
网友
1楼 · 发布于 2024-09-28 05:28:28

代码的一个问题是使用Python函数random.randrange()的方式。documentation表示randrange(a, b)将返回一个随机数x,这样a <= x < b(注意,b不包括在内)。在

当你写类似i = random.randrange(0, 7)的东西时,你会从半开区间[0, 7)得到一个随机数,而你(最可能)想要的是闭合区间[0, 7]中的数字,因为电路板的尺寸是8x8。因此,请检查对randrange()的所有调用,如果这些调用不正确,请进行修复,并查看是否解决了问题。在

相关问题 更多 >

    热门问题