• Tidak ada hasil yang ditemukan

Back end. Generate soal. logic. Generate plan. output. N-puzzle solved GUI. Parsing output dari solver

N/A
N/A
Protected

Academic year: 2021

Membagikan "Back end. Generate soal. logic. Generate plan. output. N-puzzle solved GUI. Parsing output dari solver"

Copied!
6
0
0

Teks penuh

(1)

2 Modul permainan untuk user akan menampilkan graphic user interface berupa soal N-puzzle yang dapat dimainkan oleh user dan solusinya.

3 Modul untuk pengujian akan menampilkan soal yang dibangkitkan, solusi yang dihasilkan, dan waktu penyelesaiannya. Komunikasi

Bagian komunikasi akan mengodekan (encode) problem menjadi input untuk back end dan harus mengodekan kembali output dari back end menjadi representasi N-puzzle. Modul komunikasi akan dibangun dengan PHP.

Arsitektur Sistem

Komunikasi Back end

logic Front end GUI Generate soal Generate plan Generate problems N-puzzle (pilih ukuran dan pengacakan) output Pengujian N-puzzle Parser

Gambar 5 Arsitektur sistem.

Arsitektur sistem pada Gambar 5 terdiri atas tiga bagian yaitu, back end, front end, dan modul komunikasi. Back end untuk pembangkitan soal dikerjakan oleh PHP. Sedangkan untuk penyelesaian akan dikerjakan oleh DLV dan C++. Berdasarkan arsitektur sistem di atas, diagram alur proses N-puzzle sampai menghasilkan solusi dapat di lihat pada Gambar 6.

Pembangkitan soal N-puzzle Pilih ukuran N-puzzle Pilih jumlah pengacakan Generate.php Soal.dat N-puzzle solver Npuzzle.txt (DLV) solve5.cpp (solve5.exe) solve10.cpp (solve.exe) solve15.cpp (solve15.exe) Idsgame.php (fungsi exec) N-puzzle solved GUI Parsing output dari solver Menampilkan hasil parsing ke bentuk representasi N-puzzle Pengujian

Gambar 6 Diagram alur proses N-puzzle.

HASIL DAN PEMBAHASAN

Banyaknya arah bergerak untuk nilai 0 bergantung pada banyaknya adjacent dari nilai 0 tersebut. Selain itu, pergerakan N-puzzle tidak boleh kembali pada satu langkah tepat sebelumnya karena akan jadi gerakan yang percuma. Pembangkitan soal dimulai dari puzzle yang solve. Node yang dikunjungi akan dipilih secara random dari adjacent yang tersedia. Pseudo code dari pembangkitan puzzle lihat pada Lampiran 1. Penyelesaian N-puzzle dilakukan dengan dua cara yaitu answer set programming (ASP) dengan DLV dan iteration deepening search (IDS) dengan C++.

Domain Masalah dalam DLV

Posisi sebuah nilai pada N-puzzle direpresentasikan dengan predikat at(T,N,X,Y). T menunjukkan waktu dari sebuah nilai N pada posisi dengan koordinat X,Y pada grid. Pada soal N-puzzle variabel T dimulai dari 0 dan akan bertambah sampai dengan waktu N-puzzle selesai (solve). Variabel N akan berisi nilai 0 sampai N pada N-puzzle. Variabel X dan Y bergantung pada ukuran puzzle. Soal N-puzzle yang dibangkitkan dibentuk menjadi himpunan predikat at dan menjadi fakta awal untuk permasalahan N-puzzle. Sebagai contoh soal N-puzzle dengan ukuran 3x3 seperti pada Gambar 7.

Gambar 7 Soal N-puzzle yang dibangkitkan. Soal N-puzzle pada Gambar 7 dikodekan ke dalam bentuk predikat seperti berikut : at(0,1,1,1). at(0,2,2,1). at(0,3,3,1). at(0,4,1,2). at(0,6,2,2). at(0,0,3,2). at(0,7,1,3). at(0,5,2,3). at(0,8,3,3).

Pergerakan angka 0 pada N-puzzle akan direpresentasikan dengan predikat move(T,X,Y) pada waktu T angka 0 akan bergerak ke koordinat X,Y.

Encoding dengan DLV

Pendekatan guess and check pada ASP diterapkan untuk penyelesaian menggunakan

(2)

DLV. Guess akan menebak semua kandidat solusi. Untuk menebak semua kandidat solusi kita mulai dengan mendefinisikan ruang pencarian yang memenuhi logic dari N-puzzle. Waktu melangkah, posisi nilai 0, kotak yang adjacent dengannya, dan kondisi puzzle akan menentukan ruang pencarian.

Langkah pertama dan langkah-langkah berikutnya akan memiliki ruang pencarian yang berbeda. Pada langkah pertama, N-puzzle memiliki node tujuan sebanyak dua, tiga, atau empat tergantung pada jumlah adjacent dari nilai 0, sedangkan pada langkah berikutnya N-puzzle memiliki : node tujuan = adjacent – 1. Selain itu, pada langkah selanjutnya kondisi puzzle menjadi pertimbangan untuk melakukan langkah atau berhenti (selesai), sedangkan pada langkah pertama tidak. Hal ini disebabkan puzzle yang dibangkitkan tidak mungkin sudah solve dari awal.

Jika posisi 0 seperti pada soal di Gambar 7, contoh aturannya sebagai berikut:

move(1,2,2) v move(1,3,1) v move(1,3,3) :- at(0,0,3,2).

Aturan di atas menjelaskan jika nilai 0 berada di sisi kanan puzzle dengan koordinat (3,2), nilai 0 memiliki tiga kemungkinan gerak, yaitu ke kiri (2,2), ke atas (3,1), dan ke bawah (3,3). Kode aturan gerakan pada langkah pertama yang lebih lengkap dapat dillihat pada Lampiran 2. Pada posisi yang sama, jika sebelumnya nilai 0 bergerak dari bawah (3,3) ke posisi tersebut (3,2), program akan memeriksa apakah puzzle sudah solve atau belum. Jika puzzle sudah solve, tidak akan melakukan langkah lagi dan program akan berhenti. Namun, jika puzzle belum solve, kemungkinan gerak nilai 0 tinggal ke kiri (2,2) atau ke atas (3,1). Kode aturan gerakan pada langkah berikutnya dapat dillihat pada Lampiran 3. Berikut adalah contoh aturannya :

move(2,2,2) v move(2,3,1) :- at(1,0,3,2), at(0,0,3,3), not solved(1).

Selanjutnya, menentukan aturan pertukaran posisi 0 akibat terjadi suatu pergerakan. Jika pada aturan di atas menghasilkan move(2,2,2), nilai 0 akan bertukar posisi dengan nilai N yang pada T=1 berada di posisi 2,2. Kode aturan pertukaran posisi nilai 0 dapat dillihat pada Lampiran 4. Berikut adalah contoh bentuk aturannya: at(2,0,2,2) :- at(1,0,3,2), at(1,N,2,2), move(2,2,2).

at(2,N,3,2) :- at(1,0,3,2), at(1,N,2,2), move(2,2,2).

Selain itu, kita juga harus membuat aturan frame axiom. Frame axiom berfungsi untuk menentukan kondisi state pada langkah selanjutnya untuk nilai-nilai yang tidak bergerak. Program akan terus menentukan frame axiom selama kondisi puzzle belum solve. Namun, jika puzzle sudah solve program akan berhenti menetukan frame axiom. Kode aturan frame axiom dapat dillihat pada Lampiran 5. Pada kasus di atas, contoh aturannya sebagai berikut :

at(2,N,3,1) :- at(1,0,3,2), at(1,N,3,1), not move(2,3,1),not solved(1).

Bagian terpenting dari logika adalah kita harus menentukan tujuan dari pencarian. Program dinyatakan selesai (solve) jika sudah mencapai tujuan pada waktu T. Berikut adalah aturan pada DLV untuk kondisi selesai (solve):

solvedt :- solved(T).

Kondisi solved(T) adalah tujuan dari program, yaitu ketika N-puzzle sudah terurut. Kondisi solved(T) dibangkitkan berdasarkan ukuran puzzle dari soal yang dibangkitkan. Berikut adalah kondisi yang dibangkitkan untuk soal pada Gambar 7 di atas:

solved(T) :- at(T,1,1,1), at(T,2,2,1), at(T,3,3,1), at(T,4,1,2), at(T,6,2,2), at(T,0,3,2), at(T,7,1,3), at(T,5,2,3), at(T,8,3,3).

Setelah guess menebak semua kandidat solusi, check akan memeriksa semua kandidat solusi yang dihasilkan dengan menggunakan constraint. Constraint akan menghapus answer set yang tidak memenuhi syarat. Pada N-puzzle, semua path langkah yang tidak menemukan kondisi selesai (solve) akan digugurkan, constraint akan ditulis sebagai berikut:

:- solvedt.

Menjalankan Model Penyelesaian N-puzzle Soal yang dibangkitkan akan dibuat dalam bentuk fakta dan kondisi solve dari N-puzzle. Setiap soal baru dibangkitkan, fakta dan kondisi solve dari soal tersebut akan ditulis ulang dalam file soal.dat, sedangkan model penyelesaian dengan program DLV akan disimpan dalam file Npuzzle.txt. Misalnya, telah dibangkitkan sebuah soal N-puzzle dengan ukuran 3 x 3 seperti pada Gambar 7. Berikut adalah representasi fakta

(3)

dan kondisi yang akan di tulis pada file soal.dat: #maxint=8. pos(1..3). angka(0..8). n(3). at(0,1,1,1). at(0,2,2,1). at(0,3,3,1). at(0,4,1,2). at(0,6,2,2). at(0,0,3,2). at(0,7,1,3). at(0,5,2,3). at(0,8,3,3).

solved(T) :- at(T,1,1,1), at(T,2,2,1), at(T,3,3,1), at(T,4,1,2), at(T,6,2,2), at(T,0,3,2), at(T,7,1,3), at(T,5,2,3), at(T,8,3,3).

Fakta di atas diproses bersama dengan model penyelesaian pada file Npuzzle.txt oleh DLV. Output yang diminta hanya path langkah menuju solusi dan jumlah langkahnya. Berikut adalah eksekusi program DLV untuk soal pada Gambar7 :

C:\solver>dlv.mingw.tgh soal.dat Npuzzle.txt –nofacts –filter = move, solved –silent

{move(1,2,2), move(2,2,3), move(3,3,3), solved(3)}

Answer set di atas diterjemahkan kembali menjadi sebuah bentuk representasi N-puzzle seperti pada Gambar 8.

Gambar 8 Solusi N-puzzle. Struktur Data pada C++

Ukuran N-puzzle yang dipilih disimpan dalam file ukuran.dat dan soal N-puzzle yang dibangkitkan disimpan dalam file imperatif.dat. Soal N-puzzle yang dibangkitkan akan ditulis dengan format berikut: Nilai1 Nilai2 Nilai3 ... NilaiN

Sebagai contoh, penulisan soal N-puzzle pada Gambar 7 memiliki ukuran puzzle adalah 3 dan soal akan ditulis ke file imperatif.dat seperti berikut :

1 2 3 4 6 0 7 5 8

Penyelesaian N-puzzle dengan C++

Sama seperti DLV, program penyelesaian N-puzzle menggunakan C++ juga harus menerapkan logic dari N-puzzle. Pada C++, program dibuat dengan tiga buah fungsi, yaitu fungsi utama yang akan mengambil soal dan ukuran dari file, fungsi untuk memeriksa kondisi solve puzzle, dan fungsi untuk menggerakan puzzle. Program akan dimulai dengan membuka file ukuran.dat dan imperatif.dat untuk mendapatkan ukuran dan soal puzzle. Pseudo code untuk mendapatkan ukuran dan soal dapat dilihat pada Lampiran 6.

Ukuran dan soal puzzle yang didapat menjadi input untuk program ini. Ukuran puzzle dikonversi dari sebuah string menjadi integer dan disimpan dalam sebuah variabel. Dengan cara yang sama, semua nilai pada soal N-puzzle akan disimpan ke dalam array satu dimensi. Penyimpanan nilai puzzle dan posisinya pada array dapat dilihat pada Gambar 9.

Pada Gambar 9, posisi nilai pada N-puzzle diwakili indeks pada array, dengan indeks array dimulai dari 1. Langkah berikutnya program akan memeriksa puzzle sudah solve atau belum. Untuk memeriksa kondisi solve puzzle program akan menghitung jumlah jarak setiap posisi nilai saat konfigurasi puzzle solve terhadap posisi nilai pada konfigurasi saat ini. Berikut ini adalah rumus untuk memeriksa kondisi solve puzzle:

∑ |[nilai saat solve] – [posisi nilai saat ini]| Posisi nilai saat ini dapat menggunakan nilai dari array. Pengecualian terjadi jika nilai array adalah 0, nilai 0 diganti menjadi banyaknya indeks pada array. Banyaknya indeks pada array adalah ukuran*ukuran. Misal untuk puzzle dengan ukuran 3 x 3, nilai 0 akan diganti menjadi 9, sedangkan nilai saat solve adalah indeks dari array untuk posisi nilai tersebut.

Gambar 9 Menyimpan soal N-puzzle ke array.

(4)

Jika total perhitungan tersebut bernilai 0, puzzle sudah solve dan program selesai, namun jika hasilnya lebih besar dari 0, puzzle belum terurut (not solve). Pseudo code untuk memeriksa kondisi solve array dapat dilihat pada Lampiran 7. Sebagai contoh untuk penjelasan perhitungan di atas, digunakan kondisi puzzle pada Gambar 9 :

Hitsolve = |1-1| + |2-2| + |3-3| + |4-4| + |5-6| + |6-9| + |7-7| + |8-5| + |9-8|

= 0 + 0 + 0 + 0 + 1 + 3 + 0 + 3 + 1 = 8

Hasil perhitungan di atas akan disimpan ke sebuah variabel. Anggap saja nama variabel tersebut adalah Hitsolve. Perhitungan di atas menghasilkan nilai yang lebih besar dari 0, sehingga puzzle dinyatakan belum terurut (not solve). Ketika puzzle belum terurut, program akan mencari path menuju goal state dari N-puzzle dengan teknik iterative deepening search (IDS).

Fungsi utama akan memanggil fungsi yang bertugas menggerakan puzzle dengan parameter array dari puzzle, node tempat nilai 0 berada, node sebelumnya, ukuran puzzle, kedalaman ruang pencarian, status langkah (jika belum melangkah status langkahnya 0), dan kondisi puzzle.

Selanjutnya, dengan fungsi yang menggerakan puzzle tersebut program akan melakukan pencarian path yang menuju solusi menggunakan teknik depth-first search (DFS) dengan kedalaman yang dibatasi. Sesuai logic, pergerakan posisi 0 bergantung dari posisinya pada puzzle, banyaknya adjacent, langkah sebelumnya, dan kondisi puzzle. Pada langkah pertama, karena belum melangkah pergerakan 0 tidak dipengaruhi oleh langkah sebelumnya.

Fungsi yang menggerakan puzzle ini menerapkan prioritas penentuan arah langkah gerakan 0. Prioritas ini menentukan arah yang lebih dulu dituju oleh nilai 0. Arah yang tersedia bergantung pada adjacent dari posisi 0 dan langkah pertama atau bukan.

Gambar 10 Pergerakan N-puzzle.

Berdasarkan arah yang tersedia, pertama 0 diprioritaskan bergerak ke kanan, jika tidak menemukan tujuan setelah bactrack prioritas kedua 0 bergerak ke bawah, jika masih belum menemukan tujuan prioritas setelah bactrack prioritas berikutnya 0 bergerak ke kiri, dan terakhir ke atas.

Prioritas berikutnya dilakukan jika pada pencarian pada prioritas sebelumnya tidak menemukan tujuan walaupun sudah mencapai batas kedalaman yang ditentukan dan kembali ke node sebelumnya (setelah bactrack dari prioritas sebelumnya). Seperti pada Gambar 10 di atas, prioritas bergerak 0 adalah ke bawah dulu, lalu ke kiri, dan terakhir ke atas. Pergerakan ke kanan tidak tersedia karena posisi 0 pada puzzle adalah sisi paling kanan.

Sesuai gerakan 0 pada puzzle, posisi 0 pada array juga berubah berdasarkan pertukaran dengan adjacent dari posisi 0 pada puzzle. Jika posisi 0 ada pada indeks i,dan n adalah ukuran N-puzzle, pergerakan ke kanan posisi 0 akan bertukar dengan nilai yang berada pada indeks i+1 pada array, pergerakan ke bawah akan bertukar dengan nilai yang berada pada indeks i+n pada array, pergerakan ke kiri akan bertukar dengan nilai yang berada pada indeks i-1 pada array, dan pergerakan ke atas akan bertukar dengan nilai yang berada pada indeks i-n pada array. Jika 0 bergerak ke bawah seperti pada Gambar 10, posisi nilai pada array akan berubah seperti pada Gambar 11.

Pada Gambar 11, posisi 0 yang sebelumnya pada indeks 6 di array, setelah pada puzzle posisi 0 bergerak ke bawah, nilai 0 akan berpindah posisi ke indeks 9 pada array. Posisi nilai 8 yang sebelumnya berada pada indeks ke 9 berpindah ke indeks 6 yang sebelumnya ditempati nilai 0.

Fungsi yang menggerakan puzzle ini bersifat rekursif karena setelah melangkah (menggerakan posisi 0) fungsi ini akan memanggil dirinya sendiri dengan kondisi puzzle setelah melangkah untuk melakukan langkah berikutnya. Kondisi puzzle setelah melangkah meliputi posisi 0 saat ini, posisi 0 sebelumnya, nilai yang adjacent, dan kondisi puzzle.

(5)

Berikut adalah pseudo code untuk prioritas langkah dan pemanggilan dirinya sendiri:

IF adjacent right available and not previous THEN

Go to adjacent right Increment step Call this function

ELSE IF adjacent down available and not previous THEN

Go to adjacent down Increment step Call this function

ELSE IF adjacent left available and not previous THEN

Go to adjacent left Increment step Call this function

ELSE IF adjacent up available and not previous THEN

Go to adjacent up Increment step Call this function END IF

Jika posisi 0 berada di indeks paling akhir pada array, program akan memeriksa kondisi puzzle sudah solve atau belum. Berikut adalah pseudo code jika posisi 0 berada di indeks paling akhir pada array:

IF position of 0 is number of puzzle THEN

Cek solve

IF puzzle solve THEN puzzle solved print

END THIS function ELSE

backtrack END IF END IF

Jika puzzle sudah solve, program akan mencetak array (konfigurasi puzzle) saat di node tersebut dan kembali ke super function (fungsi yang memanggil fungsi ini) untuk mencetak konfigurasi array-array sebelumnya sampai konfigurasi array soal, sehingga akan terbentuk path yang memiliki solusi dan program selesai seperti pada Gambar 12.

Gambar 12 Path dari soal sampai solved.

Namun, jika puzzle belum solve dan sudah melakukan pencarian sampai batas kedalaman, program akan melakukan backtrack ke langkah sebelumnya (super function) untuk melakukan langkah pada prioritas berikutnya. Jika pada langkah sebelumnya prioritas pertama 0 bergerak ke semua node di kanan dan buntu, setelah bactrack langkah yang dilakukan berdasarkan prioritas berikutnya (bukan ke kanan). Sebagai contoh, jika pada Gambar 9 nilai 0 bergerak ke bawah lalu buntu, setelah melakukan backtrack, puzzle akan melakukan langkah ke kiri seperti pada Gambar 13.

Gambar 13 Backtrack dan prioritas langkah berikutnya.

Teknik iteration (iterasi) dari IDS diterapkan pada fungsi utama yang memanggil fungsi untuk menggerakan puzzle berkali-kali dengan batas kedalaman yang bertambah secara berturut-turut. Setiap fungsi utama memanggil fungsi ini kondisi puzzle dimulai dari kondisi awal (soal puzzle). Pseudo code untuk memanggil fungsi yang menggerakan puzzle dapat dilihat pada Lampiran 8. Namun, jika sudah melakukan teknik iterasi sampai batas maksimal kedalaman yang ditentukan tapi masih belum menemukan path yang mencapai solusi, program model penyelesaian N-puzzle dengan pemrograman IDS dinyatakan not solved. Hasil Pengujian

Pengujian dilakukan dengan cara membangkitan masing-masing 10 soal N-puzzle untuk ukuran 3 x 3 (8-N-puzzle), 4 x 4 (15-puzzle), dan 5 x 5 (24-puzzle). Sebagai tambahan, untuk perbandingan dilakukan pengujian untuk puzzle ukuran 6 x 6 (35-puzzle). Banyaknya langkah pengacakan didapatkan secara random. Tool DLV sendiri masih dalam tahap pengembangan. Hal ini menyebabkan program DLV yang dibangun belum dapat mengakomodasi penyelesaian untuk puzzle dengan ukuran lebih besar dari 6 x 6 (35-puzzle) walaupun teknik answer set programming yang digunakan untuk

(6)

penelitian ini dapat menyelesaikan semua ukuran N-puzzle.

Model penyelesaian yang digunakan adalah model penyelesaian permainan N-puzzle dengan DLV yang menggunakan answer set programming dibandingkan dengan model penyelesaian yang menggunakan teknik iterative deepening search dengan kedalaman maksimal 5, 10, dan 15. Semua soal yang dibangkitkan tersebut digunakan untuk menguji semua model penyelesaian yang dibangun. Pengujian dilakukan sampai solusi ditemukan atau sudah mengunjungi seluruh ruang pencarian sampai batas kedalaman yang ditentukan. Selain menguji pencarian mencapai solusi atau tidak, akan dihitung waktu eksekusi (satuan detik) beserta waktu rata-rata penyelesaian dari setiap solver untuk setiap ukuran. Waktu rata-rata penyelesaian hanya dihitung dari waktu eksekusi solver yang mencapai solusi. Hasil pengujian waktu model penyelesaian dituliskan pada Tabel 1, Tabel 2, Tabel 3, dan Tabel 4.

Tabel 1 Waktu eksekusi dan kondisi selesai dari teknik ASP dan IDS untuk 8-puzzle

Untuk 10 soal 8-puzzle yang dibangkitkan dengan jumlah langkah pengacakan yang berbeda, model penyelesaian (solver) dengan ASP (menggunakan DLV) dapat menyelesaikan seluruhnya. Model penyelesaian IDS dengan kedalaman pencarian 5 (IDS5) hanya mampu menyelesaikan 2 soal, yaitu soal dengan langkah pengacakan 4 dan 5 (acak 4 dan 5). Sedangkan model penyelesaian IDS dengan kedalaman pencarian 10 (IDS10) hanya mampu menyelesaikan 5 soal, yaitu 2 soal dengan langkah pengacakan 6 , dan masing-masing 1 soal dengan langkah pengacakan 4,5, dan 8. Model penyelesaian IDS dengan kedalaman pencarian 15 (IDS15) dapat menyelesaikan seluruh langkah pengacakan soal berada pada selang 1 sampai 15. Waktu

rata-rata dihitung hanya dari waktu pencarian yang menemukan solusi.

Tabel 2 Waktu eksekusi dan kondisi selesai dari teknik ASP dan IDS untuk 15-puzzle

Dari 10 soal 15-puzzle yang dibangkitkan, seluruhnya dapat diselesaikan dengan DLV dan IDS15. Sementara model IDS5 hanya berhasil menyelesaikan 1 soal dengan acak 5. Model IDS10 hanya berhasil menyelesaiakan 6 soal, yaitu 4 soal dengan acak 10 dan masing-masing 1 soal dengan acak 5 dan 6. Kemudian waktu rata-rata didapat dengan menghitung rata-rata dari waktu eksekusi yang berhasil menemukan solusi. Hal tersebut menyebabkan waktu rata-rata IDS5 hanya dihitung dari 1 waktu penyelesaian yang berhasil menemukan solusi pada langkah ke 5. Tabel 3 Waktu eksekusi dan kondisi selesai dari teknik ASP dan IDS untuk 24-puzzle

Dari 10 soal 24-puzzle yang dibangkitkan, seluruhnya dapat diselesaikan dengan DLV dan IDS15. Beberapa solusi pertama yang dimunculkan model DLV dapat menyelesaikan soal-soal tersebut dengan jumlah langkah menuju solved yang lebih besar dari 15 langkah. Hal ini disebabkan pada model DLV tidak perlu menentukan batas maksimal kedalaman pencarian yang bisa dicapai. Model IDS15 menyelesaikan soal tersebut dengan jumlah langkah yang lebih kecil atau sama dengan batas maksimal kedalaman pencarian yang ditentukan, yaitu

Gambar

Tabel  1  Waktu eksekusi dan kondisi selesai  dari  teknik  ASP  dan  IDS untuk  8-puzzle

Referensi

Dokumen terkait

Kategorisasi risiko dilakukan berdasarkan klasifikasi jenis risiko inovasi yang telah dilakukan oleh Hernandez dan Vargaz (2011) yang membagi nya menjadi tujuh

Mainland stock markets are closed for the Golden Week public holiday (2 to 6 October) and on re-opening are expected to be in a 'wait-and-see' mode ahead of the Chinese Communist

Kategori pelanggan tersebutakan berubah sesuai dengan perkembangan waktu. Dengan memperhatikan ModelKano, menuntut perusahaan menciptakan produk/jasa inovatif yang

The information and/or analysis contained in this material have been compiled or arrived at from sources believed to be reliable but Manulife Asset Management does not make

Vibrio SKT-b yang lebih tinggi dibandingkan dengan perlakuan probiotik baik pada akhir perlakuan maupun pascauji tantang, sedangkan pada perlakuan kontrol dan prebiotik tidak

Sekiranya ibu atau waris ibu berhalangan untuk menjaga anak luar nikah, pihak berkuasa mempunyai hak untuk memberi perlindungan dan penjagaan kepada seseorang anak

Perkembangan dunia saat ini pendidikan merupakan hal terpenting, karena dengan pen- didikan manusia dapat membuat peradaban yang maju, artinya pendidikan merupakan sebuah komponen

Berdasarkan hasil analisis data hasil belajar peserta didik untuk kompetensi sikap, pengetahuan, dan keterampilan, dapat ditarik kesimpulan bahwa pembelajaran dengan