1
0
Fork 0

Alustava toteutus Markovin ketjuille

This commit is contained in:
Vili Sinervä 2022-09-22 10:28:48 +03:00
parent d956305fb0
commit 7dddb59c31
3 changed files with 46 additions and 1 deletions

View file

@ -17,6 +17,8 @@ Seuraavan nuotin luominen Markovin ketjulla vaatii kaikkien mahdollisten seuraav
## Lähteet (Tähän asti)
[Wikipedia: Trie](https://en.wikipedia.org/wiki/Trie)
[Wikipedia: Markov chain](https://en.wikipedia.org/wiki/Markov_chain)
[Albert Au Yeung "Implementing Trie in Python" (Luettu 15.09.2022)](https://albertauyeung.github.io/2020/06/15/python-trie.html/#implementing-trie-in-python-1)
[Vijaykrishna Ram "Trie Data Structure in C/C++" (Luettu 15.09.2022)](https://www.digitalocean.com/community/tutorials/trie-data-structure-in-c-plus-plus)

43
src/markov_ketju.py Normal file
View file

@ -0,0 +1,43 @@
from trie import Trie
from collections import deque
from random import choices
class MarkovKetju:
def __init__(self, aste=1, trie=Trie()):
self._trie = trie
self._aste = aste
self._menneet_tilat = deque()
def kasittele_opetusdata(self, opetusdata: list):
self._trie = Trie()
for jono in opetusdata:
if len(jono) > self._aste:
alkio = deque(jono[0:self._aste+1])
self._trie.lisaa(alkio)
for i in range(self._aste+1, len(jono)):
alkio.popleft()
alkio.append(jono[i])
self._trie.lisaa(alkio)
def aseta_alkuosa(self, alkuosa):
if len(alkuosa) < self._aste:
raise ValueError("Liian lyhyt alkuosa!")
self._menneet_tilat = deque([alkuosa[i] for i in range(0, self._aste)])
def seuraava(self):
if len(self._menneet_tilat) < self._aste:
raise ValueError("Markovin ketjulle ei ole asetettu sopivaa alkuosaa!")
todennakoisyydet, merkit = self._trie.etsi_seuraavat(self._menneet_tilat)
if todennakoisyydet and merkit:
seuraava = choices(merkit, weights=todennakoisyydet)[0]
self._menneet_tilat.popleft()
self._menneet_tilat.append(seuraava)
return seuraava
return None

View file

@ -74,7 +74,7 @@ class Trie:
#Etsitään alkuosaa vastaava solmu
for merkki in alkuosa:
if merkki not in solmu.lapset:
return []
return (None, None)
solmu = solmu.lapset[merkki]
#Listaa kaikki alkuosan lapset