This commit is contained in:
2025-03-03 12:34:16 +01:00
commit 67bef34c2f
12 changed files with 650 additions and 0 deletions

Binary file not shown.

Binary file not shown.

67
ora2/hanoi2.py Normal file
View File

@@ -0,0 +1,67 @@
from keres import *
from collections import namedtuple
State = namedtuple('State',['korong','rud'])
class Hanoi(Feladat):
def __init__(self,n):
super().__init__('1'*n,'3'*n)
# def célteszt(self, állapot):
# return állapot==self.cél
def result(self,state:str,action:State): # '111' , 0 , '2'
korong,rud=action # 0 , '2'
return state[0:korong] + rud + state[korong+1: ] #211
def rákövetkező(self, állapot:str):
lepesek=[]
f1 = állapot.find('1') # melyik koron a legkisebb az 1-es rúdon
f2 = állapot.find('2') #-1
f3 = állapot.find('3')
if f1 > -1 and (f1 < f2 or f2 == -1):
tmp = self.result(állapot,State(f1,"2")) # '211'
text = '{} korongot {} rúdra'.format(State(f1,"2").korong+1,State(f1,"2").rud)
lepesek.append((text,tmp))
if f1 > -1 and (f1 < f3 or f3 == -1):
tmp = self.result(állapot,State(f1,"3")) # '311'
text = '{} korongot {} rúdra'.format(State(f1,"3").korong+1,State(f1,"3").rud)
lepesek.append((text,tmp))
if f2 > -1 and (f2 < f3 or f3 == -1):
tmp = self.result(állapot,State(f2,"3")) #
text = '{} korongot {} rúdra'.format(State(f2,"3").korong+1,State(f2,"3").rud)
lepesek.append((text,tmp))
if f2 > -1 and (f2 < f1 or f1 == -1):
tmp = self.result(állapot,State(f2,"1"))
text = '{} korongot {} rúdra'.format(State(f2,"1").korong+1,State(f2,"1").rud)
lepesek.append((text,tmp))
if f3 > -1 and (f3 < f1 or f1 == -1):
tmp = self.result(állapot,State(f3,"1"))
text = '{} korongot {} rúdra'.format(State(f3,"1").korong+1,State(f3,"1").rud)
lepesek.append((text,tmp))
if f3 > -1 and (f3 < f2 or f2 == -1):
tmp = self.result(állapot,State(f3,"2"))
text = '{} korongot {} rúdra'.format(State(f3,"2").korong+1,State(f3,"2").rud)
lepesek.append((text,tmp))
return lepesek
K=Hanoi(8) # 2^n - 1
print(len(szélességi_gráfkeresés(K).megoldás()))

125
ora2/keres.py Normal file
View File

@@ -0,0 +1,125 @@
import sys
from seged import *
class Feladat:
def __init__(self, kezdő, cél=None):
self.kezdő = kezdő;
self.cél = cél
def rákövetkező(self, állapot): #operator elofeltetel
raise NotImplementedError
def érték(self):
raise NotImplementedError
def célteszt(self, állapot):
return állapot == self.cél
#raise NotImplementedError
def útköltség(self, c, állapot1, lépés, állapot2):
return c + 1
class Csúcs:
def __init__(self, állapot, szülő=None, lépés=None, útköltség=0):
self.állapot = állapot
self.szülő = szülő
self.lépés = lépés
self.útköltség = útköltség
if szülő:
self.mélység = szülő.mélység + 1
else:
self.mélység = 0
def __repr__(self):
return "<Csúcs: %s>" % (self.állapot, )
#return "%s" % (list(self.állapot),)
def út(self):
x, válasz = self, [self]
while x.szülő:
válasz.append(x.szülő)
x = x.szülő
return válasz
def megoldás(self):
utam = self.út()
utam.reverse()
return [csúcs.lépés for csúcs in utam[1:]]
def kiterjeszt(self, feladat):
for (művelet, következő) in feladat.rákövetkező(self.állapot):
if következő not in [csúcs.állapot for csúcs in self.út()]:
yield Csúcs(következő, self, művelet,
feladat.útköltség(self.útköltség, self.állapot, művelet,
következő))
def fakeresés(feladat, perem):
global meglátogatott_csúcsok
perem.append(Csúcs(feladat.kezdő))
while perem:
meglátogatott_csúcsok += 1;
csúcs = perem.pop()
if feladat.célteszt(csúcs.állapot):
return csúcs
perem.extend(csúcs.kiterjeszt(feladat))
return None
def szélességi_fakeresés(feladat):
return fakeresés(feladat, Sor())
def mélységi_fakeresés(feladat):
return fakeresés(feladat, Verem())
def gráfkeresés(feladat, perem):
global meglátogatott_csúcsok
zárt = set()
perem.append(Csúcs(feladat.kezdő))
while perem:
meglátogatott_csúcsok += 1;
csúcs = perem.pop()
if feladat.célteszt(csúcs.állapot):
return csúcs
if csúcs.állapot not in zárt:
zárt.add(csúcs.állapot)
perem.extend(csúcs.kiterjeszt(feladat))
return None
def szélességi_gráfkeresés(feladat):
return gráfkeresés(feladat, Sor())
def mélységi_gráfkeresés(feladat):
return gráfkeresés(feladat, Verem())
def best_first(feladat, f):
return gráfkeresés(feladat, RendezettLista(f))
def a_csillag(feladat, h):
def f(n):
return n.útköltség + h(n)
return best_first(feladat, f)
def csúcsok_statisztika():
global meglátogatott_csúcsok
tmp = meglátogatott_csúcsok
meglátogatott_csúcsok = 0
return tmp
meglátogatott_csúcsok = 0;

75
ora2/main.py Normal file
View File

@@ -0,0 +1,75 @@
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
h = Hanoi(8)
#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)

68
ora2/seged.py Normal file
View File

@@ -0,0 +1,68 @@
import bisect
import random
import functools
class Várólista:
def __init__(self):
pass
def extend(self, elemek):
for elem in elemek: self.append(elem)
def Verem():
return []
class Sor(Várólista):
def __init__(self):
self.A = []; self.kezd = 0
def append(self, elem):
self.A.append(elem)
def __len__(self):
return len(self.A) - self.kezd
def extend(self, elemek):
self.A.extend(elemek)
def pop(self):
e = self.A[self.kezd]
self.kezd += 1
if self.kezd > 5 and self.kezd > len(self.A)/2:
self.A = self.A[self.kezd:]
self.kezd = 0
return e
class RLElem:
def __init__(self,érték,elem):
self.értékem = érték
self.elemem = elem
def __lt__(self,másik):
return self.értékem < másik.értékem
def érték(self):
return self.értékem
def elem(self):
return self.elemem
class RendezettLista(Várólista):
def __init__(self, f):
self.A=[]
self.f=f
def append(self, elem):
pár = RLElem(self.f(elem),elem)
bisect.insort(self.A, pár)
def __len__(self):
return len(self.A)
def pop(self):
return self.A.pop(0).elem()
def argmin(lista, fv):
legjobb = lista[0]; legjobb_érték = fv(legjobb)
for x in lista[1:]:
x_érték = fv(x)
if x_érték < legjobb_érték:
legjobb, legjobb_érték = x, x_érték
return legjobb