102 lines
3.5 KiB
Python
102 lines
3.5 KiB
Python
from collections import namedtuple
|
|
from random import randint
|
|
from keres import *
|
|
from seged import *
|
|
|
|
Act = namedtuple('Act', ['korong', 'rud']) # [int, str]
|
|
|
|
class Hanoi(Feladat):
|
|
def __init__(self, n): #hany darab korong = n
|
|
super().__init__('1'*n)
|
|
|
|
def célteszt(self, állapot: str):
|
|
if állapot == '2'*len(állapot) or állapot == '3'*len(állapot):
|
|
return True
|
|
else:
|
|
return False
|
|
|
|
def mod(self, állapot):
|
|
self.kezdő = állapot
|
|
|
|
def result(self, állapot: str, act: Act): #állapot(1,1,1) -> 0 korong '2' poziciora -> (2,1,1)
|
|
k,r = act #korong, rud kicsomagolasa
|
|
return állapot[:k] + r + állapot[k+1:]
|
|
|
|
def rákövetkező(self, állapot: str) -> list[tuple[str, tuple[int,int,int]]]:
|
|
lepesek = []
|
|
f1 = állapot.find('1') # melyik az legkisebb korong az első rúdon
|
|
f2 = állapot.find('2') # -1 ha nincs korong a rúdon
|
|
f3 = állapot.find('3')
|
|
|
|
if f1 > -1 and (f1 < f2 or f2 == -1):
|
|
text = f'A {f1+1}-es korongot a 2-es rúdra'
|
|
tmp = self.result(állapot, Act(f1, '2'))
|
|
lepesek.append((text, tmp))
|
|
|
|
if f1 > -1 and (f1 < f3 or f3 == -1):
|
|
text = f'A {f1+1}-es korongot a 3-as rúdra'
|
|
tmp = self.result(állapot, Act(f1, '3'))
|
|
lepesek.append((text, tmp))
|
|
|
|
if f2 > -1 and (f2 < f3 or f3 == -1):
|
|
text = f'A {f2+1}-es korongot a 3-as rúdra'
|
|
tmp = self.result(állapot, Act(f2, '3'))
|
|
lepesek.append((text, tmp))
|
|
|
|
if f2 > -1 and (f2 < f1 or f1 == -1):
|
|
text = f'A {f2+1}-es korongot a 1-es rúdra'
|
|
tmp = self.result(állapot, Act(f2, '1'))
|
|
lepesek.append((text, tmp))
|
|
|
|
if f3 > -1 and (f3 < f2 or f2 == -1):
|
|
text = f'A {f3+1}-es korongot a 2-es rúdra'
|
|
tmp = self.result(állapot, Act(f3, '2'))
|
|
lepesek.append((text, tmp))
|
|
|
|
if f3 > -1 and (f3 < f1 or f1 == -1):
|
|
text = f'A {f3+1}-es korongot a 1-es rúdra'
|
|
tmp = self.result(állapot, Act(f3, '1'))
|
|
lepesek.append((text, tmp))
|
|
|
|
return lepesek
|
|
|
|
@staticmethod
|
|
def érték(csucs: Csúcs):
|
|
állapot = csucs.állapot
|
|
n = állapot.count('1') #hany darab korong van az egyes rudon | megoldaskor 0
|
|
return n - állapot.count('2') - 2*állapot.count('3')
|
|
|
|
def útköltség(self, c, állapot1, lépés, állapot2):
|
|
#return super().útköltség(c, állapot1, lépés, állapot2)
|
|
egy = 2*(állapot1.count('1') - állapot2.count('1'))
|
|
ketto = 1.5*(állapot2.count('2') - állapot1.count('2'))
|
|
harom = 0*(állapot2.count('3') - állapot1.count('3'))
|
|
return c+ egy + ketto + harom
|
|
|
|
h = Hanoi(5)
|
|
print("szelessegi kereses")
|
|
print(szélességi_fakeresés(h))
|
|
#print("melysegi kereses")
|
|
#print(mélységi_fakeresés(h))
|
|
print("melysegi graf")
|
|
print(mélységi_gráfkeresés(h))
|
|
print("best first")
|
|
print(best_first(h, h.érték), len(best_first(h, h.érték).út()[::-1])-1)
|
|
print('a*')
|
|
print(a_csillag(h, h.érték), len(a_csillag(h, h.érték).út()[::-1])-1)
|
|
|
|
|
|
|
|
#print(h.result('123', Act(0,'2')))
|
|
#print(h.rákövetkező('321'))
|
|
|
|
#k = 0
|
|
#while h.célteszt(h.kezdő)==False:
|
|
# #print(h.rákövetkező(h.kezdő))
|
|
# i=randint(0,len(h.rákövetkező(h.kezdő))-1)
|
|
# lepes=h.rákövetkező(h.kezdő)[i][1]
|
|
# h.mod(lepes)
|
|
# #print(lepes)
|
|
# k+=1
|
|
#print(k)
|