Python 如何在网格板上实现遗传算法来寻找最优路径
我正在准备在有障碍物的地形中寻找最佳路径的算法。到目前为止,我实现了Dijsktra和A*算法。现在我必须实现遗传算法,我有一个问题 首先,我将向您展示我的地图表示的外观。有7种不同的地形(0-起点、7-终点、1-4个可以通过的正常地形、5-6个不能通过)。下面是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,
邻居):
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
,从起点(地图上的code0
)执行移动,并返回到达的终点:
(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
,从起点(地图上的code0
)执行移动,并返回到达的终点:
(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*这样的东西,你就应该坚持使用,而不是