diff --git a/src/statebag/boardstate.py b/src/statebag/boardstate.py --- a/src/statebag/boardstate.py +++ b/src/statebag/boardstate.py @@ -1,14 +1,23 @@ from util import EMPTY,BLACK,WHITE, hashBoard,exportBoard -from go.engine import getTransitionSequence +from go.engine import getTransitionSequence,SpecGo + + +g=SpecGo() ## Crude lower bound on edit distance between states. -def estimateDistance(diff): +def estimateDistance(diff,s1,s2): # lot of room for improvements - additions=sum(1 for d in diff if d[2]=="+") - deletions=sum(1 for d in diff if d[2]=="-") - replacements=len(diff)-additions-deletions - if additions>0: return additions+replacements + additions=deletions=replacements=unaccounted=0 + for (r,c,d,color) in diff: + if d=="+": additions+=1 + elif d=="-": + deletions+=1 + for (ri,ci) in g.listNeighbours(r,c): + if s1[ri][ci]==EMPTY and s2[ri][ci]==EMPTY: + unaccounted+=1 + else: replacements+=1 + if additions>0 or unaccounted>0: return additions+replacements+unaccounted elif replacements==0 and deletions>0: return 2 # take n, return 1 return replacements+1 # ??? @@ -53,8 +62,10 @@ class BoardState: self._hash=None def tryConnect(self,s,diff=None): + """:param s: BoardState s + :param diff: [(r,c,change,color), ...], change in {+,-,*}, color in {BLACK,WHITE}""" if diff is None: diff=self-s - distEst=estimateDistance(diff) + distEst=estimateDistance(diff,s,self) if distEst>3: return # we couldn't find every such move sequence anyway without a clever algorithm weightEst=s.getWeight()+2-distEst if weightEst<=self.getWeight(): return