Anda di halaman 1dari 13

Praktikum I – family.

pl

Penjelasan :

Kodingan di atas menggunakan logika prolog untuk menggambarkan beberapa fakta dan
aturan terkait hubungan antar individu dalam sebuah keluarga. Berikut adalah penjelasan
logika kodingannya:
Fakta individu:
Ada daftar individu laki-laki dan perempuan yang didefinisikan menggunakan predikat male
dan female.
Contoh: male(lennart). menunjukkan bahwa Lennart adalah laki-laki.
Fakta hubungan orang tua-anak:
Predikat parent(X, Y) menyatakan bahwa individu X adalah orang tua dari individu Y.
Contoh: parent(mike, lennart). menunjukkan bahwa Mike adalah orang tua dari Lennart.
Fakta individu anak:
Predikat child(X) menyatakan bahwa individu X adalah seorang anak.
Contoh: child(lisa). menunjukkan bahwa Lisa adalah seorang anak.
Aturan hubungan ayah, ibu, anak laki-laki, dan anak perempuan:
Predikat father(X, Y) menyatakan bahwa individu X adalah ayah dari individu Y. Ini terjadi
jika X adalah laki-laki dan orang tua X adalah Y.
Predikat mother(X, Y) menyatakan bahwa individu X adalah ibu dari individu Y. Ini terjadi
jika X adalah perempuan dan orang tua X adalah Y.
Predikat son(X, Y) menyatakan bahwa individu X adalah anak laki-laki dari individu Y. Ini
terjadi jika X adalah laki-laki dan orang tua X adalah Y.
Predikat daughter(X, Y) menyatakan bahwa individu X adalah anak perempuan dari
individu Y. Ini terjadi jika X adalah perempuan dan orang tua X adalah Y.
Aturan untuk mencari semua anak dalam keluarga:
Predikat family_children(X, X) digunakan sebagai aturan dasar untuk menemukan semua
anak langsung dari individu X.
Predikat family_children(X, Child) digunakan untuk mencari semua anak, baik anak
langsung maupun cucu, dari individu X. Ini dilakukan dengan mencari individu Y yang
merupakan orang tua dari Child dan memanggil kembali predikat family_children(Y, Child)
secara rekursif.
Dengan menggunakan aturan dan fakta ini, Pengguna dapat mengajukan pertanyaan tentang
hubungan antara individu-individu dalam keluarga dan mendapatkan jawaban yang sesuai
dengan informasi yang diberikan.

Output Penjelasan :
penjelasan logika untuk setiap pertanyaan yang diajukan:
Pertanyaan: ?- son(X,Y). Jawaban: X = lennart, Y = mike. Logika: Pertanyaan ini mencari
pasangan ayah-anak yang merupakan anak laki-laki. Jawabannya adalah X = lennart dan Y =
mike, yang berarti Lennart adalah anak laki-laki dari Mike.
Pertanyaan: ?- father(X,Y). Jawaban: X = lennart, Y = donald. Logika: Pertanyaan ini
mencari pasangan ayah-anak. Jawabannya adalah X = lennart dan Y = donald, yang berarti
Lennart adalah ayah dari Donald.
Pertanyaan: ?- mother(X,Y). Jawaban: X = hillary, Y = joar. Logika: Pertanyaan ini mencari
pasangan ibu-anak. Jawabannya adalah X = hillary dan Y = joar, yang berarti Hillary adalah
ibu dari Joar.
Pertanyaan: ?- daughter(X,Y). Jawaban: X = hillary, Y = lennart. Logika: Pertanyaan ini
mencari pasangan ibu-anak yang merupakan anak perempuan. Jawabannya adalah X = hillary
dan Y = lennart, yang berarti Hillary adalah anak perempuan dari Lennart.
Pertanyaan: ?- family_children(X, X). Jawaban: X = lisa. Logika: Pertanyaan ini mencari
individu yang merupakan anak langsung dari dirinya sendiri. Jawabannya adalah X = lisa,
yang berarti Lisa adalah anak langsung dari dirinya sendiri.
Pertanyaan: ?- family_children(X, Child). Jawaban: X = Child, Child = lisa. Logika:
Pertanyaan ini mencari semua anak, baik anak langsung maupun cucu, dari individu X.
Jawabannya adalah X = Child dan Child = lisa, yang berarti Lisa adalah anak langsung dari
dirinya sendiri.
Pertanyaan: ?- Child=joar. Jawaban: Child = joar. Logika: Pertanyaan ini menetapkan nilai
Child sebagai joar.
Pertanyaan: ?- Child=elise. Jawaban: Child = elise. Logika: Pertanyaan ini menetapkan nilai
Child sebagai elise.
Pertanyaan: ?- Child=dan. Jawaban: Child = dan. Logika: Pertanyaan ini menetapkan nilai
Child sebagai dan.
Pertanyaan: ?- Child=simon. Jawaban: Child = simon. Logika: Pertanyaan ini menetapkan
nilai Child sebagai simon.
Dengan menggunakan fakta dan aturan yang diberikan, pertanyaan-pertanyaan tersebut
mengembalikan jawaban yang sesuai dengan hubungan antar individu dalam keluarga yang
telah didefinisikan sebelumnya.

Paraktikum II – 8-Puzzles.ipynb
Penjelasan :

Kodingan di atas adalah program Python yang mengimplementasikan algoritma Branch and
Bound untuk mencari solusi dari teka-teki N*N-1 8-puzzle. Berikut adalah penjelasan logika
dari program tersebut:

1. Import Library:
• copy digunakan untuk menduplikat objek dengan menggunakan fungsi
deepcopy.
• heappush dan heappop digunakan untuk mengimplementasikan Priority
Queue.
2. Variabel Global:
• n digunakan untuk menentukan ukuran puzzle (misalnya, n=3 untuk 8-
puzzle).
• row dan col adalah array yang menyimpan perubahan baris dan kolom yang
akan digunakan untuk menggerakkan elemen dalam puzzle.
3. Fungsi printMatrix():
• Fungsi ini digunakan untuk mencetak matriks puzzle dengan tata letak yang
rapi.
• Menerima parameter mat yang merupakan matriks yang akan dicetak.
4. Fungsi isSafe():
• Fungsi ini digunakan untuk memeriksa apakah indeks baris dan kolom yang
diberikan valid di dalam matriks puzzle.
• Menerima parameter x dan y yang merupakan indeks baris dan kolom yang
akan diperiksa.
5. Fungsi calculateHeuristic():
• Fungsi ini digunakan untuk menghitung nilai heuristik untuk keadaan puzzle
yang diberikan.
• Menerima parameter initial dan final yang merupakan matriks awal dan
matriks tujuan.
• Mengembalikan jumlah posisi yang salah dihitung dengan membandingkan
elemen matriks awal dan tujuan.
6. Fungsi isSolvable():
• Fungsi ini digunakan untuk memeriksa apakah keadaan awal puzzle solvable
atau tidak.
• Menerima parameter matrix yang merupakan matriks keadaan awal puzzle.
• Mengembalikan True jika puzzle solvable, dan False jika tidak solvable.
7. Kelas Node:
• Kelas ini digunakan untuk merepresentasikan setiap keadaan puzzle.
• Properti:
• matrix: matriks keadaan puzzle.
• cost: biaya yang diperlukan untuk mencapai keadaan ini.
• level: level atau langkah saat ini dari algoritma.
• x dan y: indeks baris dan kolom dari elemen kosong (0) dalam matriks.
• parent: node orang tua dari node saat ini.
• heuristic: nilai heuristik untuk keadaan ini (dihitung menggunakan
fungsi calculateHeuristic()).
• key: prioritas node dalam Priority Queue (dihitung sebagai cost +
heuristic).
8. Fungsi solvePuzzle():
• Fungsi ini adalah implementasi utama dari algoritma Branch and Bound untuk
menyelesaikan puzzle.
• Menerima parameter initial yang merupakan matriks keadaan awal puzzle.
• Fungsi menggunakan Priority Queue untuk melacak node yang akan
dieksplorasi.
• Iteratif melakukan langkah-langkah berikut:
• Menginisialisasi node awal dengan matriks awal, cost = 0, dan level =
0.
• Memeriksa apakah keadaan awal puzzle solvable menggunakan fungsi
isSolvable().
• Jika puzzle tidak solvable, mengembalikan pesan kesalahan.
• Jika puzzle solvable, melanjutkan dengan algoritma Branch and
Bound.
• Mencetak keadaan awal puzzle dan biaya yang diperlukan.
• Melakukan loop sampai Priority Queue tidak kosong:
• Mengeluarkan node dengan prioritas terendah dari Priority
Queue.
• Memeriksa apakah keadaan node saat ini adalah keadaan
tujuan.
• Jika ya, mencetak solusi dan mengembalikan.
• Jika tidak, melakukan langkah-langkah berikut:
• Menggerakkan elemen kosong ke arah yang berbeda
menggunakan perubahan baris dan kolom yang
didefinisikan di row dan col.
• Membuat node baru untuk setiap pergerakan yang
mungkin.
• Menambahkan node-node baru ke Priority Queue
dengan menghitung biaya, level, heuristik, dan kunci
yang sesuai.
• Jika Priority Queue kosong dan tidak ada solusi yang ditemukan, mencetak
pesan kesalahan.
9. Main Program:
• Membaca matriks keadaan awal puzzle dari input pengguna.
• Memanggil fungsi solvePuzzle() dengan matriks keadaan awal sebagai
argumen.

Dengan menggunakan algoritma Branch and Bound dan konsep Priority Queue, program ini
mencoba menemukan solusi optimal untuk puzzle yang diberikan.
Penjelasan:

Kodingan di atas adalah implementasi kelas priorityQueue, yang merupakan struktur data
antrian prioritas menggunakan heap. Berikut adalah penjelasan logika dari kelas tersebut:

1. Fungsi __init__():
• Fungsi ini adalah konstruktor kelas yang digunakan untuk menginisialisasi
antrian prioritas (heap).
• Membuat variabel heap yang merupakan list kosong.
2. Fungsi push(k):
• Fungsi ini digunakan untuk memasukkan elemen baru k ke dalam antrian
prioritas.
• Menggunakan fungsi heappush() dari modul heapq untuk memasukkan
elemen k ke dalam heap dengan mempertahankan sifat antrian prioritas.
3. Fungsi pop():
• Fungsi ini digunakan untuk menghapus dan mengembalikan elemen terkecil
(prioritas terendah) dari antrian prioritas.
• Menggunakan fungsi heappop() dari modul heapq untuk menghapus elemen
terkecil dari heap dan mengembalikannya.
4. Fungsi empty():
• Fungsi ini digunakan untuk memeriksa apakah antrian prioritas kosong atau
tidak.
• Jika heap kosong, mengembalikan True, menunjukkan bahwa antrian
prioritas kosong.
• Jika heap tidak kosong, mengembalikan False, menunjukkan bahwa antrian
prioritas tidak kosong.

Kelas priorityQueue ini menyediakan fungsi dasar yang diperlukan untuk mengelola antrian
prioritas menggunakan heap. Dengan menggunakan metode push(), pop(), dan empty(),
elemen dapat dimasukkan ke dalam antrian prioritas, elemen terkecil dapat dihapus, dan
kekosongan antrian dapat diperiksa.
Penjelasan :

Kodingan di atas adalah implementasi kelas node yang merepresentasikan setiap keadaan
dalam puzzle. Berikut adalah penjelasan logika dari kelas tersebut:

1. Fungsi __init__():
• Fungsi ini adalah konstruktor kelas yang digunakan untuk menginisialisasi
objek node.
• Menerima parameter parent, mat, empty_tile_pos, cost, dan level yang
merupakan informasi tentang keadaan node.
• Properti objek node diinisialisasi dengan nilai-nilai yang sesuai.
2. Metode __lt__(self, nxt):
• Metode ini didefinisikan untuk membandingkan dua objek node berdasarkan
nilai properti cost.
• Digunakan saat memasukkan objek node ke dalam antrian prioritas, sehingga
elemen dengan nilai cost terkecil akan memiliki prioritas yang lebih tinggi.
• Mengembalikan True jika self.cost lebih kecil dari nxt.cost, dan False
sebaliknya.

Kelas node ini menyediakan struktur data untuk merepresentasikan setiap keadaan dalam
puzzle. Properti-properti seperti parent, mat (matriks puzzle), empty_tile_pos (posisi
elemen kosong), cost (biaya atau heuristik), dan level (langkah saat ini) digunakan untuk
melacak dan memanipulasi setiap keadaan puzzle dalam algoritma Branch and Bound.
Penjelasan :
Kodingan di atas merupakan implementasi beberapa fungsi yang digunakan dalam algoritma
Branch and Bound untuk menyelesaikan puzzle N x N - 1. Berikut adalah penjelasan logika
dari setiap fungsi tersebut:

1. Fungsi calculateCost(mat, final):


• Fungsi ini digunakan untuk menghitung jumlah ubin yang salah posisi dalam
matriks mat dibandingkan dengan matriks final.
• Mengiterasi setiap elemen dalam matriks dan membandingkannya dengan
elemen yang sesuai dalam matriks final.
• Jika elemen tidak kosong dan tidak sama dengan elemen yang sesuai dalam
final, maka jumlah ubin yang salah posisi akan ditambahkan.
2. Fungsi newNode(mat, empty_tile_pos, new_empty_tile_pos, level, parent, final):
• Fungsi ini digunakan untuk membuat dan mengembalikan objek node baru
dengan informasi yang diperoleh dari argumen-argumen fungsi.
• Membuat salinan dari matriks mat menggunakan fungsi deepcopy agar tidak
mengubah matriks asli.
• Menukar posisi ubin kosong dengan ubin yang baru di new_empty_tile_pos.
• Menghitung biaya dengan memanggil fungsi calculateCost() pada matriks
yang telah dimodifikasi.
• Membuat objek node baru dengan menggunakan informasi yang diperoleh
dan mengembalikannya.
3. Fungsi printMatrix(mat):
• Fungsi ini digunakan untuk mencetak matriks mat dengan format yang sesuai.
• Mengiterasi setiap baris dan kolom dalam matriks dan mencetak elemen
dengan spasi di antaranya.
4. Fungsi isSafe(x, y):
• Fungsi ini digunakan untuk memeriksa apakah koordinat (x, y) merupakan
koordinat yang valid dalam matriks.
• Mengembalikan True jika (x, y) berada dalam batas matriks, dan False
sebaliknya.
5. Fungsi printPath(root):
• Fungsi ini digunakan untuk mencetak path (langkah-langkah) dari root node
ke node tujuan.
• Memanfaatkan rekursi untuk mencetak path secara terbalik, mulai dari node
tujuan hingga root node.
• Untuk setiap node, mencetak matriks yang terkait dengannya dengan
menggunakan fungsi printMatrix().
6. Fungsi solve(initial, empty_tile_pos, final):
• Fungsi ini adalah inti dari algoritma Branch and Bound untuk menyelesaikan
puzzle.
• Membuat priority queue pq untuk menyimpan node-node yang masih aktif
dalam pencarian.
• Membuat root node dengan menggunakan matriks awal, posisi ubin kosong,
dan biaya awal yang dihitung menggunakan fungsi calculateCost().
• Menambahkan root node ke priority queue.
• Melakukan iterasi hingga priority queue kosong:
• Mengeluarkan node dengan biaya terendah dari priority queue.
• Jika biaya node minimum adalah 0, artinya node tersebut adalah solusi,
maka mencetak path dari root ke node tersebut dan mengembalikan.
• Jika bukan solusi, membuat node-node anak yang mungkin dari node
minimum dan menambahkannya ke priority queue.
• Jika priority queue kosong dan tidak ditemukan solusi, maka algoritma
dianggap tidak berhasil.

Fungsi-fungsi tersebut bekerja bersama-sama untuk menyelesaikan puzzle dengan


menggunakan algoritma Branch and Bound.
Penjelasan :
Kodingan di atas adalah contoh penggunaan dari algoritma Branch and Bound untuk
menyelesaikan puzzle N x N - 1. Berikut adalah penjelasan logika dari kode tersebut:

1. Matriks initial merupakan konfigurasi awal dari puzzle. Angka 0 digunakan untuk
mewakili ubin kosong.
2. Matriks final merupakan konfigurasi akhir yang diinginkan untuk mencapai solusi.
Angka 0 juga digunakan untuk mewakili ubin kosong pada konfigurasi akhir.
3. empty_tile_pos adalah koordinat ubin kosong pada konfigurasi awal. Koordinat
tersebut ditentukan dalam bentuk [baris, kolom].
4. Fungsi solve() dipanggil dengan argumen konfigurasi awal, posisi ubin kosong, dan
konfigurasi akhir.
5. Fungsi solve() akan mencari solusi menggunakan algoritma Branch and Bound.
6. Jika ditemukan solusi, fungsi printPath() akan dipanggil untuk mencetak path dari
konfigurasi awal ke konfigurasi akhir.
7. Jika tidak ditemukan solusi, maka tidak akan ada output yang dihasilkan.
8. Pada contoh ini, hasil pencarian solusi akan dicetak dalam urutan langkah-langkah
yang dilakukan untuk mencapai konfigurasi akhir.

Dengan menjalankan kodingan tersebut, Pengguna akan mendapatkan hasil output berupa
path (langkah-langkah) dari konfigurasi awal ke konfigurasi akhir.
Yaitu :

Anda mungkin juga menyukai