【问题标题】:Genetic Algorithm for 8 queens puzzle8皇后拼图的遗传算法
【发布时间】:2018-07-22 09:15:51
【问题描述】:

我正在尝试将遗传算法应用于 8 个皇后拼图。我已经编写了整个算法,但是当它找到 6 个未命中皇后的解决方案并且无法克服它时,它会一直卡住。我觉得存在一些多样性问题,但我不知道如何处理它。我的问题是这种认识有什么问题,为什么它一直卡在 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()

【问题讨论】:

  • 你有什么问题?尝试通过将代码减少到重现错误所需的最少代码来隔离您的错误。 minimal reproducible example
  • 我的问题是这种认识有什么问题,为什么它一直卡在 6 个未命中的皇后上,无法做出最后的行动。我已经检查了每一段代码,我认为对算法本身的进化存在一些误解。所以我希望有人能告诉我我哪里做错了。

标签: python genetic-algorithm n-queens


【解决方案1】:

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

当你写像i = random.randrange(0, 7) 这样的东西时,你会从半开区间[0, 7) 中得到一个随机数,而你(很可能)想要的是闭区间[0, 7] 中的数字,因为棋盘大小是8x8 .所以检查所有对randrange()的调用,如果它们不正确,请修复它们,看看它是否解决了问题。

【讨论】:

  • 是的,我已经想通了,但感谢您的回答。就是这样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多