【问题标题】:How to create my population of genetic algorithm?如何创建我的遗传算法群体?
【发布时间】:2019-06-22 13:35:18
【问题描述】:

给定一个问题,我应该使用遗传算法找到从开始到目标的 5 条最佳路径。游乐场的图片如下所示:

1

游乐场有一个起点、一个目标和一些障碍。答案不应该与障碍相冲突。我将使用 Python-3.x 来实现。

我试图将我的 Playground 转换为 2D numpy 数组。 1 是我们不能去那里的瓷砖,因为它们是障碍物,而 0 是我们可以去的瓷砖。

grid = np.array([
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])

start = (12,0)
goal = (0,10)

现在我不知道如何创建我的初始种群以与其他 GA operators 一起工作,例如交叉和变异。

我认为我应该有一些功能,在了解限制的情况下创建一条从开始到目标的路径并将它们存储为我的人口。

【问题讨论】:

    标签: python-3.x genetic-algorithm


    【解决方案1】:

    由于您已经知道搜索空间的大小(即图中正方形的大小),您可以使用此信息从整数均匀分布初始化您的总体。

    我不知道正方形的瓷砖大小,但我们假设它是 [15,15]。你们人口中的每个人都将是二维的,对吧?因此,当您使用 python 时,考虑到人口规模等于 10,您应该执行以下操作:

    import numpy as np
    pop = np.random.randint(0,15,[10,2])
    

    因此,每个人都将在广场上的一个位置上进行。目前,您无需担心个人是否在禁地。您应该在选择阶段将其作为约束来处理。

    当然,你需要制定你的适应度函数来惩罚那些在禁地里的人。但是你不是用它来开始你的种群,你用它来选择最好的个体,你明白了吗?

    有一些处理约束的技术,我建议你在this paper 中阅读其中的一些技术,或者只是看到code example

    【讨论】:

    • 谢谢,很有帮助。你知道 pops 中的一系列人会导致 Goal,但是在初始化变量 pop 之后,它的值就像 [3,4] 等等......我现在该怎么办?@André Pacheco
    • 我教的问题应该从起点开始解决,对吗? @安德烈·帕切科
    • 嗯,你没事!在这种情况下,您只需选择个体数量并将所有个体设置在起点。之后,您继续 GA 操作,包括约束区域,并让算法为您工作。这里最重要的是正确设置适应度,即尊重问题的特征。
    • 那么我怎样才能让我的初始弹出窗口在代码中具有正确的起点? @安德烈·帕切科
    • 只需将所有个体设置在起点即可。例如:[0,0]
    【解决方案2】:

    在遗传算法中,种群是候选解决方案的集合,在迭代过程中不断发展。初始种群通常是随机生成的。 (link to source)

    例如,一种解决方案(或初始群体的一个候选者)可能是这样的:

    ([
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, *, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, *, *, *, *, 0, 0],
    [0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, *, 0, 0],
    [0, 0, 0, 1, 1, 1, 1, 1, 0, 0, *, *, *, *, 0, 0],
    [0, 0, 0, 1, 1, 1, 1, 1, 0, 0, *, 0, *, *, 0, 0],
    [0, 0, 0, 1, 1, 1, 1, 1, 0, 0, *, 0, *, *, 0, 0],
    [0, 0, 0, 1, 1, 1, 1, 1, 0, 0, *, 0, *, *, 0, 0],
    [0, 0, 0, 1, 1, 1, 1, 1, 0, 0, *, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, *, 1, 1, 1, 0, 0],
    [0, *, *, *, *, *, *, *, *, *, *, 1, 1, 1, 0, 0],
    [0, *, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0],
    [0, *, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0],
    [*, *, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])
    

    其中 * 的尾迹是从 (12, 0) 到 (0, 10) 的路径。

    所以现在你需要想办法随机生成一个 * 的路径,它从 start 开始,到 end 结束。天真的方法是使用随机的左、右、上和下方向。如果该方向被边界或 1 阻挡,请选择不同的方向。继续直到你到达终点。

    此外,如上所示,路径可能具有彼此相邻的 *。 (3, 11) 和 (3, 12) 包含 *,但不是连续轨迹的一部分。为此使用不同的数字来表示方向,或者我建议使用 unicode 作为箭头,例如\u2190 是左箭头。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2021-04-27
      • 2011-12-23
      • 2020-07-11
      • 2013-08-09
      • 1970-01-01
      • 2018-12-10
      • 2018-07-14
      • 2016-02-03
      • 1970-01-01
      相关资源
      最近更新 更多