上周我偶然发现了 aichallenge.org,我认为这款“蚂蚁”游戏是学习 Python 和学习 AI 编码的好方法。
游戏是一个 (x,y) 网格,最多可以包含一只蚂蚁。瓷砖可以表示为土地或水,这是不可逾越的。
我的 AI 做得很好,通过广度优先搜索算法派蚂蚁去收集食物,并使用 A* 寻路攻击敌人的山丘。
但是,我尝试实现的探索算法花费了太多时间,大约 700 毫秒。我的 AI 每转只允许 500 毫秒,这意味着它被取消资格。
为了进行探索,我想为每个图块分配一个“ExploreValue”。这个值在游戏开始时从 0 开始,每转一圈增加 1 块隐藏在战争迷雾下。当瓷砖可见时,我希望将探索值重置为 0。每只蚂蚁的视线半径为 10 个方格。
首先,我对每只蚂蚁进行广度优先搜索,将图块标记为“可见”。每只蚂蚁大约需要 10 毫秒。之后,我遍历地图上的每个图块以更新它们的“ExploreValue”。如果它们被标记为可见,则该值将重置为 0,否则将其增加 1。
在必须约为 100x100 的地图上,这需要半秒多的时间。
这是代码,你认为我能做些什么来让它运行得更快?我已经将我的列表转换为集合,因为它们应该更快。
def do_setup 在游戏开始时运行一次,def do_turn 在游戏中每回合运行一次。
def do_setup(self, ants):
self.tile_visible = set()
self.explorevalue = {}
for row in range(ants.rows):
for col in range(ants.cols):
self.explorevalue[(row, col)]=0
def do_turn(self, ants):
self.tile_visible = [] # empty visible list
#Define visible tiles set:
ants_tiles_scan_distance=10
for ant in ants.my_ants(): #start bfs of length ants_tiles_can_distance
tiles_dist = {} #dict visited tiles
tiles_from = {} #dict previous tiles
from_nodes=[]
from_nodes.append(ant)
to_nodes=[]
close_friends_count[ant]=0
steps=1
while (steps<=ants_tiles_scan_distance and len(from_nodes)>=1):
for from_node in from_nodes:
for new_loc in ants.tiles_voisins[(from_node)]:
if (new_loc not in tiles_dist):
tiles_dist[new_loc]=steps
to_nodes.append(new_loc)
if new_loc not in self.tile_visible:
self.tile_visible.append(new_loc)
from_nodes=to_nodes
to_nodes=[]
steps=steps+1
#Update ExploreValues :
for tile in self.explorevalue.keys() :
if (tile in self.tile_visible):
self.explorevalue[tile]=0
else:
self.explorevalue[tile]=self.explorevalue[tile]+1