我已经为这个游戏实现了一个人工智能,它根据上述贪心算法工作。特别是,它试图最大化从 (0,0) 开始最终成为集群一部分的单元格的数量
首先,我们定义一个计算一组点的方法,这些点彼此相邻,颜色相同。我们称其为集群。
def cluster(self, x, y):
# setup return value
retval = sets.Set([])
# stack
col = self._grid[x][y]
stk = []
stk.append((x,y))
while len(stk) > 0:
curr = stk.pop()
retval.add(curr)
c_x = curr[0]
c_y = curr[1]
nbs = [(c_x,c_y+1),(c_x,c_y-1),(c_x+1,c_y),(c_x-1,c_y)]
for n in nbs:
if n[0] < self._width and n[0] >=0 and n[1] < self._height and n[1] >= 0:
if self._grid[n[0]][n[1]] == col and not (n in retval):
stk.append(n)
# return
return retval
然后我们可以将填充网格定义为简单地获取 (0,0) 的集群并用新颜色标记这些单元格。
def flood(self, x, y, c):
pts = self.cluster(x,y)
for p in pts:
self._grid[p[0]][p[1]] = c
然后可以按如下方式实现简单(贪婪)策略:
def easy_strategy(self):
retval = []
g = copy.deepcopy(self)
c = g.cluster(0,0)
S = g._width * g._height
# continue until all cells have the same color
while len(c) != S :
# attempt all flood options
cps = []
for i in xrange(0, self._num_colors+1):
cps.append(copy.deepcopy(g))
csz = [0 for i in xrange(0, self._num_colors+1)]
for i in xrange(0,self._num_colors+1):
cps[i].flood(0,0,i)
csz[i] = len(cps[i].cluster(0,0))
# best move
max_index = csz.index(np.max(csz))
g = cps[max_index]
c = g.cluster(0,0)
# append to array
retval.append(max_index)
# return
return retval
这基本上执行以下操作: 1. 复制当前网格 k 次(其中 k 是颜色的数量) 2. 用颜色 i 填充每个副本(在索引 i 处) 3. 在 (0,0) 处计算集群的大小4.选择集群最大的副本(和相应的颜色)
尽管这是一个幼稚的实现,但它确实表现良好。
亲切的问候,乔里斯