Python 如何在网格板上实现遗传算法来寻找最优路径

Python 如何在网格板上实现遗传算法来寻找最优路径,python,matrix,genetic-algorithm,path-finding,Python,Matrix,Genetic Algorithm,Path Finding,我正在准备在有障碍物的地形中寻找最佳路径的算法。到目前为止,我实现了Dijsktra和A*算法。现在我必须实现遗传算法,我有一个问题 首先,我将向您展示我的地图表示的外观。有7种不同的地形(0-起点、7-终点、1-4个可以通过的正常地形、5-6个不能通过)。下面是Python中的代码(在我看来,要理解这个问题,代码中最重要的部分是函数邻居): class-Graph(): 定义初始化(self,x=10,y=10): self.width=x 自我高度=y self.board=((1,1,1,

我正在准备在有障碍物的地形中寻找最佳路径的算法。到目前为止,我实现了Dijsktra和A*算法。现在我必须实现遗传算法,我有一个问题

首先,我将向您展示我的地图表示的外观。有7种不同的地形(0-起点、7-终点、1-4个可以通过的正常地形、5-6个不能通过)。下面是Python中的代码(在我看来,要理解这个问题,代码中最重要的部分是函数
邻居
):

class-Graph():
定义初始化(self,x=10,y=10):
self.width=x
自我高度=y
self.board=((1,1,1,5,1,1,1,1,1,7),
(1, 1, 1, 5, 1, 1, 1, 1, 1, 1),
(1, 1, 1, 5, 1, 5, 1, 1, 1, 1),
(0, 1, 1, 1, 1, 5, 1, 1, 1, 1),
(1, 1, 1, 1, 1, 5, 1, 1, 1, 1),
(1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
(1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
(1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
(1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
(1, 1, 1, 1, 1, 1, 1, 1, 1, 1))
self.time={0:None,
1: 1,
2: 4,
3: 7,
4: 4,
7: 1}
def成本(自身、id):
(x,y)=id
返回self.time.get(self.board[y][x])
def CAN PASS(自我,id):
(x,y)=id
返回自我板[y][x]!=5和self.board[y][x]!=6和self.board[y][x]!=0
def内边界(自身,id):
(x,y)=id

return 0二维网格的一个简单的基于遗传算法的方法是将染色体(二进制字符串)分割成移动,例如:

00 = down
10 = left
01 = right
11 = up
run(chromose)
函数给定一个
chromose
,从起点(地图上的code
0
)执行移动,并返回到达的终点:

(f_y, f_x) = run(chromosome)
适应度函数是距离目标点的距离:

def fitness(chromosome):
    final = run(chromosome)
    return 1.0 - (distance(final, goal) / max_possible_distance)
或者:

# Returns negative values.
# Depending on the selection scheme, it can be problematic.
def fitness(chromosome):
    final = run(chromosome)
    return -distance(final, goal)
这两个适应度函数都假设越大越好

现在举个例子:

  • S
    是起点,
    F
    是终点,
    G
    是终点,
    *
    是一堵墙
  • 染色体
    00 01 00 01 11
    ↓ ↓ → → ↓ ↓ ↓ → → ↑
  • run(S,染色体)
    以以下方式运行:

    |---|---|---|---|---|---|
    | S |   |***|   |   |   |
    |-|-|---|---|---|---|---|
    | | |   |***|   |   |   |
    |-|-|---|---|---|---|---|
    | +---+->***|   |***|***|
    |---|-|-|---|---|---|---|
    |   | | |***| F |   | G |
    |---|-|-|---|-^-|---|---|
    |   | +-------+ |***|   |
    |---|-|-|---|---|---|---|
    
    该函数只忽略不可能的移动

  • 健身是
    -2
  • 可以使用标准(或其他形式),例如:

    ONE POINT CROSSOVER
    
    00 00 01 01 00 00|00 01 01 11      PARENTS
    11 11 01 01 00 00|01 01 11 01
    -----------------^-----------
    00 00 01 01 00 00|01 01 11 01      OFFSPRING
    11 11 01 01 00 00|00 01 01 11
    
    第一个孩子(
    00 00 01 00 01 01 11 01
    )的健康状况比父母双方都好(
    -1
    ):

    注释

    • 与忽略不可能的移动(如上例所示)不同,该方案可以使用基因修复算子进行扩展,该算子删除错误的移动并添加随机移动以填充染色体(更复杂,但它利用了完整的可用长度)
    • 通常,在遗传算法中,染色体具有固定长度:允许长度比最佳路径长30%-40%是个好主意
    • 任何通往目标的道路都被视为符合标准。搜索最佳路径需要在适应度函数中添加与最短路径偏差的惩罚项,例如:

        def fitness(chromosome):
            final = run(chromosome)
            return -distance(final, goal) - length_of_path(chromosome) / 100.0
      
    • 一种完全不同的方法是使用遗传算法优化A*(Ryan Leigh、Sushil J.Louis和Chris Miles在中提供了更多详细信息)

    • 第三种选择,从人工智能的角度来看可能是最有趣的,是遗传编程(参见Rick Strom的例子)
    • 这是遗传算法灵活性的一个很好的例子,但是a*更好

      • 二维网格的一种简单的基于遗传算法的方法是将染色体(二进制字符串)分割成移动,例如:

        00 = down
        10 = left
        01 = right
        11 = up
        
        run(chromose)
        函数给定一个
        chromose
        ,从起点(地图上的code
        0
        )执行移动,并返回到达的终点:

        (f_y, f_x) = run(chromosome)
        
        适应度函数是距离目标点的距离:

        def fitness(chromosome):
            final = run(chromosome)
            return 1.0 - (distance(final, goal) / max_possible_distance)
        
        或者:

        # Returns negative values.
        # Depending on the selection scheme, it can be problematic.
        def fitness(chromosome):
            final = run(chromosome)
            return -distance(final, goal)
        
        这两个适应度函数都假设越大越好

        现在举个例子:

      • S
        是起点,
        F
        是终点,
        G
        是终点,
        *
        是一堵墙
      • 染色体
        00 01 00 01 11
        ↓ ↓ → → ↓ ↓ ↓ → → ↑
      • run(S,染色体)
        以以下方式运行:

        |---|---|---|---|---|---|
        | S |   |***|   |   |   |
        |-|-|---|---|---|---|---|
        | | |   |***|   |   |   |
        |-|-|---|---|---|---|---|
        | +---+->***|   |***|***|
        |---|-|-|---|---|---|---|
        |   | | |***| F |   | G |
        |---|-|-|---|-^-|---|---|
        |   | +-------+ |***|   |
        |---|-|-|---|---|---|---|
        
        该函数只忽略不可能的移动

      • 健身是
        -2
      • 可以使用标准(或其他形式),例如:

        ONE POINT CROSSOVER
        
        00 00 01 01 00 00|00 01 01 11      PARENTS
        11 11 01 01 00 00|01 01 11 01
        -----------------^-----------
        00 00 01 01 00 00|01 01 11 01      OFFSPRING
        11 11 01 01 00 00|00 01 01 11
        
        第一个孩子(
        00 00 01 00 01 01 11 01
        )的健康状况比父母双方都好(
        -1
        ):

        注释

        • 与忽略不可能的移动(如上例所示)不同,该方案可以使用基因修复算子进行扩展,该算子删除错误的移动并添加随机移动以填充染色体(更复杂,但它利用了完整的可用长度)
        • 通常,在遗传算法中,染色体具有固定长度:允许长度比最佳路径长30%-40%是个好主意
        • 任何通往目标的道路都被视为符合标准。搜索最佳路径需要在适应度函数中添加与最短路径偏差的惩罚项,例如:

            def fitness(chromosome):
                final = run(chromosome)
                return -distance(final, goal) - length_of_path(chromosome) / 100.0
          
        • 一种完全不同的方法是使用遗传算法优化A*(Ryan Leigh、Sushil J.Louis和Chris Miles在中提供了更多详细信息)

        • 第三种选择,从人工智能的角度来看可能是最有趣的,是遗传编程(参见Rick Strom的例子)
        • 这是遗传算法灵活性的一个很好的例子,但是a*更好

        我个人的意见是,只要你能使用像A*这样的东西,你就应该坚持使用,而不是