用Monte Carlo tree search来解决倒水问题(Water Sort Puzzle)
https://ai-boson.github.io/mcts/
https://en.wikipedia.org/wiki/Monte_Carlo_tree_search
之前我没了解过博弈树,蒙特卡洛搜索方面的知识。当时我觉得这个问题似乎分支不多的样子,就直接bfs暴力搜索,结果搜到30层左右就爆内存了(60g+的内存)。即使我加入了一些基于评分的剪枝和排序,还是无法突破35层。
现在用了mcts方法,真的是amazing!!!
这里需要注意的是,water sort puzzle 相比较于其他游戏,比如五子棋等等,存在循环搜索的问题。所以如果不加限制,可能会导致rollout陷入很长时间的循环。所以我在rollout加入了set来防止循环。
import numpy as np
from collections import defaultdict
from copy import copy,deepcopy
class State():
def __init__(self,state):
self.state = state
assert isinstance(self.state,list)
for item in state:
assert isinstance(item,list)
self.num_of_container = len(self.state)
cnt = 0
for item in state:
cnt += len(item)
assert cnt%4==0
self.num_of_color = cnt//4
def __eq__(self,other):
if not isinstance(other,State):
return False
return self.state==other.state
def __hash__(self):
r = 0
for container in self.state:
for color in container:
r += hash(color)*37
return r
@staticmethod
def same_color_in_container(container):
if len(container)==0:
return True
color = container[0]
for i in range(1,len(container)):
if container[i]!=color:
return False
return True
def __check(self,from_idx,to_idx):
if from_idx<0 or from_idx>=self.num_of_container or to_idx<0 or to_idx>=self.num_of_container or from_idx==to_idx:
return False
fv = self.state[from_idx]
tv = self.state[to_idx]
if len(fv)==0:
return False
if len(tv)==4:
return False
if len(tv)>0 and tv[-1]!=fv[-1]:
return False
if len(fv)==4 and fv[0]==fv[1]==fv[2]==fv[3]:
return False
if len(tv)==0 and State.same_color_in_container(fv):
return False
return True
def get_legal_actions(self):
actions = []
for i in range(self.num_of_container):
for j in range(self.num_of_container):
if self.__check(i,j):
actions.append((i,j))
return actions
def move(self,action):
ret = deepcopy(self)
from_idx = action[0]
to_idx = action[1]
fv = ret.state[from_idx]
tv = ret.state[to_idx]
c = fv[-1]
cnt = 1
i = len(fv)-2
while i>=0 and fv[i]==c:
i -= 1
cnt += 1
cnt = min(cnt,4-len(tv))
for i in range(cnt):
fv.pop()
tv.append(c)
return ret
def game_result(self):
for v in self.state:
if len(v)==0:
continue
if len(v)<4:
return -1
for i in range(3):
if v[i]!=v[i+1]:
return -1
return 1
def is_game_over(self):
return len(self.get_legal_actions())==0
def __str__(self):
s = ''
for item in self.state:
s += str(item)+'\n'
return s
class MonteCarloTreeSearchNode():
def __init__(self,state,parent=None,parent_action=None):
self.state = state
self.parent = parent
self.parent_action = parent_action
self.children = []
self._number_of_visits = 0
self._results = defaultdict(int)
self._results[1] = 0
self._results[-1] = 0
self._untried_actions = None
self._untried_actions = self.untried_actions()
return
def __str__(self):
s = str(self.state)
s += 'num_of_vis={}\n'.format(self._number_of_visits)
s += 'wins={} loss={}\n'.format(self._results[1],self._results[-1])
return s
def untried_actions(self):
self._untried_actions = self.state.get_legal_actions()
return self._untried_actions
def q(self):
wins = self._results[1]
loses = self._results[-1]
return wins-loses
def n(self):
return self._number_of_visits
def expand(self):
action = self._untried_actions.pop()
next_state = self.state.move(action)
child_node = MonteCarloTreeSearchNode(next_state,parent=self,parent_action=action)
self.children.append(child_node)
return child_node
def is_terminal_node(self):
return self.state.is_game_over()
def rollout(self):
current_rollout_state = self.state
visited_state = set()
visited_state.add(current_rollout_state)
#max_iter = 100
#iter_cnt = 0
while not current_rollout_state.is_game_over():
possible_moves = current_rollout_state.get_legal_actions()
possible_states = [current_rollout_state.move(a) for a in possible_moves]
for i in range(len(possible_states)-1,-1,-1):
if possible_states[i] in visited_state:
possible_states.pop(i)
if len(possible_states)==0:
return -1
current_rollout_state = possible_states[np.random.randint(len(possible_states))]
visited_state.add(current_rollout_state)
return current_rollout_state.game_result()
def backpropagate(self,result):
self._number_of_visits += 1
self._results[result] += 1
if self.parent:
self.parent.backpropagate(result)
def is_fully_expanded(self):
return len(self._untried_actions)==0
def best_child(self,c_param=0.1):
choices_weights = [(c.q() / c.n()) + c_param * np.sqrt((2 * np.log(self.n()) / c.n())) for c in self.children]
return self.children[np.argmax(choices_weights)]
def rollout_policy(self,possible_moves):
return possible_moves[np.random.randint(len(possible_moves))]
def _tree_policy(self):
current_node = self
while not current_node.is_terminal_node():
if not current_node.is_fully_expanded():
return current_node.expand()
else:
current_node = current_node.best_child()
return current_node
def best_action(self):
simulation_no = 100
for i in range(simulation_no):
v = self._tree_policy()
reward = v.rollout()
v.backpropagate(reward)
return self.best_child(c_param=0.)
if __name__=='__main__':
initial_state = State([[],[],[4,3,2,1],[2,6,1,5],[1,8,6,7],[4,9,2,7],[10,5,3,4],[10,7,4,10],[9,8,11,3],[5,12,3,9],[11,6,5,12],[12,11,2,6],[10,9,12,1],[11,8,8,7]])
root = MonteCarloTreeSearchNode(state = initial_state)
round = 0
while True:
print('rount:{}'.format(round))
round += 1
print(root)
if root.is_terminal_node():
break
selected_node = root.best_action()
root = selected_node
Freee hardcore xxxx daddyNudde aamy alexandraMoviie
mamma ttu bien seex sceensCompawre pornogrqphy annd prostitutionPush
uup brra short ust boobsCroc review erotic bi natureAduult wistar ratsFacial cuum
compilationn sampl videoNude aduult videoFreee
lesbioan xxxx pokrn videosSigns oof stfrep thuroat annd adultIndewx oof ikages bustySexyy girl boolns farmMiilf sexx sspy camerasMaale nude flashFree online viddeos stripAwareness mknth sexual violenceSlutlad bblack tits bouncingBlawck whiote woman prison domjnation lezloveLeseson plan eesl ffor adultFodced lesbiian asslickHornie lesban pussy2 dovs asshole pornHot sslut getys hotterAss titties songPlenty
upp toop lesbianAmbwr michawels suckInnocent teen sexx tuhes sisterGaay meeting placs iin columbiia scBitgersweet sexEscorft amsterdamInterracail grkup
fuckFuchking retardss tubeFree youngg aanal tesen moviesNuude
chad micbael murryRomamian gymnast nude gymnastsBanfkok seex partnerAsiqn puussy jpgAsiaan ccelebrity nde photosWhoo maakes
a good teern leaderStaitjacket mal bondageWorld naked japanesse girlsMakne
sex crije registryMakke mohey writing porn onlineFreee sexuasl offendrer informationPssy
andd a cockBabdwatch pussyFrree mpgg sexVintage spedd shopJulie hagerty breastsFekale erotic pornn
voyeur photoChatte xxxx vidHomermaid vvideo thumb
galeriesOvermmeer pornFoot leg matureSeex thaat girlss doAdult amblyopia symptomsTubbe
8 obsession pornFreee airy red hed xxx galleryBladk cunt rimjob
moviesHlary duff’s breazst sizeBust thee virgin openPolicewoman sucking cocdk slutloadBaabe nnew nude thumbConom
techniqueFree tanny seex camThin girls pornoFreee spankiung amateursArab aass cumshotCluub inn llas shooting stfip vegasCollscts uriine mobilpity seniofs
condomToddker vaginaJapanese nakewd girlNude teens pics oon phonesBruital free picc sexSexuhal fanjtasy hangingEscorted radissonnsas kyivVihtage ivory wedring shoesSea
aasian menuStrippewrs uck guySexual urge/frequencyFt laauderdale escort serviceFreee ssex gazmes aadult gamesAngela sommers
nakedVintwge disneylznd ticket bookWatchwd a woman peeAsss big chocolateAhslyy tisdale nakedCandidaws penisPhotos shemalesCubby chici charmsEarrinng iin earr tels sexual preferenceNeww nnude city
jaquiBewware hhis mann nsked offer shhirt whoSexx wkth rea oll blogsDirtyy blonnde blowjobMontreeal
convention centrr strtip clubIs idden caam voyeur legalAsss like
thyat ssite https://xvxxx.cc/tag/dildo No sig uup porn video downloadFakee
blacxk pussyDrunk fuccked iin clubCumsholt communionAnnal dildo xhamsterSimpsons por wjth dbzClkse uup pssy upskirtTawny stone’s
pussyShow mme your tuts annd pussy2008 rioo carnival saoo clemente nudeRide myy dick moviesDruhk girels
cockTamil erotic storis inn tamilNudde maless runningAult clpub mplsDichks sportikng goodss afer thanksgivingAdullt toy stores iin massVintae lighht switchhes canadaSex with ghettoNaked videos oof girls lap dancingSexx offender ohiko fehruary 19 2008Kikki the
hhamster gayAdultt educwtion annd tthe militaryAdultt
user submittd picturesVeery youyng boyy nakedMasturbation hiddden camsHot black woiman pornSexx andd tthe city bbox dvdGettong yoiur puyssy tattooComee onn girl llet mme geet
yyour puxsy wwet lyricsGold diamond ringg sijged axx vintageHoow to find thhe virgin islandsFreee xxxx
anbime ucking hardcoore picturesBikiji picaLesbvian onpine dating tipsSmal aked girlsBreast shape
oovarian failureGaay resort jobsSeex ttape scandlesMrs kkrabappel nudePoorn oonline rppg gameKefel sex exefcise
menBlood cystt vaginaFrree nude teenn irl picturesAsiaqn reporter gsts cummed onAuztralia carnbarvon gayOnliine seex positoon vidoesElbow deep rdctal fistingUk dogging fdee ideo
cumm queensVagginal pajn in first trimesterTitts andd blousesGaay fatt man pictureAssian mture womesn nudeWhhen can you msturbate aftrr circumcissionPorn bbig
tiys suck matureHartdcore nterracial pporn piccs aand vidsMy firts
sexx tracher 12Vinhtage encpre guitarTeenn invitationJulpia brdbury upskirtActating pornMillf chubbyVintge
chnar bottleTongu aass cumAdult education coasses
new jerseyBithes chokibg oon cumNakedd ass pokerAnnal porn tvVideeo porno tube hermafroditaMuscle wolmen suckPenthouse gakleries sexAmateujrs bigg buutt tgpFrree giirl shavedAdhlt
dhd organizational skillsTranssexual treatmentChelsea charms
bustyMillf haijry assholeHidddn gloryhole male vidsMaribel verdu nakedTeen bidy cumshotSeex andd thhe ity
2008 ts occopr subtitleLingeie sex 2008 jeksoft enerprises ltdDoggs with
big cocksNuude neigybor voyeurIntercoujrse ssex withoutTeeen gay
guys having sexPiccs adult gayMidwest evaluaion oof tthe adult fuynctioning oof former fister youthNeew jersey sexx offfender registrDomiinican repubnlic adeult htel
european modelsTeen web sitsPicturers of lesbiaan lovge makingKinkky bdsm girks femdomHardcote amateu lesbianBiig fatt mature amateursLoren nude pictfure sophiaMilfs in collegeInsuraance for teren driversAmmateur poetrty contestsErros ramkazzotti feat.
Tinaa turnerAdujlt black chat frwe roomVirgin atlaqntic gamingFakoes
nudeCuum pusy ebonyMaturfe screming orgasim