Algoritma Rantai Markov

10.2 Algoritma Rantai Markov

Contoh kedua adalah implementasi dari algoritma rantai Markov. Program membuat teks acak,didasarkan pada kata yang boleh diikuti urutan dari n kata sebelumnya dalam teks dasar. Untuk implementasi ini,kita akan gunakan n=2.

Bagian pertama program membaca teks dasar dan membuat tabel,untuk setiap awalan 2 kata,berikan sebuah daftar kata yang diikuti awalan dalam teks. Setelah membuat tabel,program menggunakan tabel untuk mebuat teks acak,dimana setiap kata diikuti 2 kata sebelumnya dengan kemungkinan yang sama dari teks dasar sebagai hasil,kita punya teks,tetapi tidak rapi,acak,sebagai contoh,ketika selesai menggunakan buku,hasilnya seperti "Constructors can also traverse a table constructor, then the parentheses in the following line does the whole file in a field n to store the contents of each function, but to show its only argument. If you want to find the maximum element in an array can return both the maximum value and continues showing the prompt and running the code. The following words are reserved and cannot be used to convert between degrees and radians. "

Kita akan mengkode setiap awalan dengan penggabungan 2 kata dengan spasi diantaranya:

function prefix (w1, w2) return w1 .. ' ' .. w2 end

Kita akan menggunakan string NOWORD(ā€œ\nā€) untuk menginisialisasi awal kata dan menandai akhir teks. Sebagai contoh,adalah teks dibawah ini:

the more we try the more we do

Tabel kata akan menjadi

{ ["\n \n"] = {"the"}, ["\n the"] = {"more"}, ["the more"] = {"we", "we"}, ["more we"] = {"try", "do"},

["we try"] = {"the"}, ["try the"] = {"more"}, ["we do"] = {"\n"},

} Program melindungi tabel dalam variabel global statetab. Untuk memasukkan sebuah

kata baru dalam daftar awalan pada tabel,kita gunakan fungsi dibawah ini:

function insert (index, value) if not statetab[index] then

statetab[index] = {value}

else

table.insert(statetab[index], value)

end end

Pertama,memeriksa apakah awalan sudah ada dalam daftar,jika tidak,ini membuat yang baru dengan nilai baru. Jika tidak gunakan fungsi tabel yang didefinisikan sendiri. Insert untuk memasukkan nilai baru pada akhir daftar yang ada.

Untuk membuat tabel statetab,kita perlu 2 variabel w 1 dan w 2 dengan 2 kata terakhir yang dibaca untuk setiap awalan. Kita perlu daftar seluruh kata yang mengikutinya. Setelah membuat tabel,program memulai untuk membuat sebuah teks dengan kata MAXGEN. Pertama,inisialisasi ulang variabel w 1 dan w 2 . kemudian, untuk setiap awalan,dipilih secara acak sebuah kata selanjutnya dari daftar kata yang enar.mencetak kata dan memperbaharui w 1 dan w 2 ,selanjutnya kita lihat program lengkapnya:

-- Markov Chain Program in Lua

function allwords () local line = io.read() -- current line local pos = 1 -- current position in the line return function () -- iterator function

while line do -- repeat while there are lines local s, e = string.find(line, "%w+", pos) if s then -- found a word?

pos = e + 1 -- update next position return string.sub(line, s, e) -- return

the word else line = io.read() -- word not found; try next

line

pos = 1 -- restart from first position

end end return nil -- no more lines: end of traversal

end end

function prefix (w1, w2) return w1 .. ' ' .. w2 end

local statetab local statetab

end

local N = 2 local MAXGEN = 10000 local NOWORD = "\n"

-- build table statetab = {} local w1, w2 = NOWORD, NOWORD for w in allwords() do

insert(prefix(w1, w2), w) w1 = w2; w2 = w;

end insert(prefix(w1, w2), NOWORD)

-- generate text w1 = NOWORD; w2 = NOWORD -- reinitialize for i=1,MAXGEN do

local list = statetab[prefix(w1, w2)] -- choose a random item from list local r = math.random(table.getn(list)) local nextword = list[r]

if nextword == NOWORD then return end io.write(nextword, " ")

w1 = w2; w2 = nextword end