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