ALGORITMA KOMPUTER
DISUSUN OLEH :
Endro Swandi Nababan (5213230019)
Dito Yudisthira Nugroho (5213230021)
Fachmi Darizal Ananda (5213230004)
Josef Owen C D Siahaan (5213230003)
Raihan Novaldi Hsb (5213230005)
DOSEN PENGAMPU :
Dr. Amirhud Dalimunthe, S.T., M.Kom.
Reni Rahmadani, S.Kom., M.Kom.
2. Representasi Graf:
Implementasikan representasi graf di mana setiap sel dalam labirin menjadi node.
Hubungkan node-node yang bersebelahan dengan edge untuk membentuk graf.
7. Dokumentasi:
Tulis dokumentasi yang menjelaskan cara menggunakan program, struktur kode, dan
logika di balik implementasi.
Setiap langkah yang tersebut membentuk bagian penting dari proyek ini dan saling
berkesinambungan. Berikut adalah hubungan antar langkah-langkah tersebut:
1. Pembuatan Labirin:
Langkah ini adalah langkah awal dan membentuk dasar untuk representasi graf.
Labirin yang dihasilkan oleh algoritma rekursif backtracking akan digunakan sebagai
struktur dasar yang akan diwakili oleh graf.
2. Representasi Graf:
Setelah labirin dihasilkan, selanjutnya adalah membuat representasi graf. Setiap sel
dalam labirin menjadi node dalam graf, dan edge dibentuk antara node-node yang
bersebelahan. Representasi graf ini diperlukan untuk implementasi algoritma
pencarian jalur.
4. Visualisasi:
Terakhir, visualisasi ditambahkan ke dalam proyek. Antarmuka grafis akan
menampilkan labirin, proses algoritma pencarian jalur, dan jalur terpendek yang
ditemukan. Visualisasi memungkinkan pengguna untuk melihat bagaimana algoritma
beroperasi dan bagaimana jalur terpendek ditemukan.
7. Dokumentasi:
Selama dan setelah implementasi, dokumentasi ditulis untuk menjelaskan cara
menggunakan program, struktur kode, dan logika di balik implementasi. Dokumentasi
pada pengerajaan proyek ini langsung penulis cantumkan secara berurutan pada
langkah-langkah.
Langkah-langkah ini membentuk alur kerja yang logis dan membantu memastikan
bahwa setiap elemen proyek berkontribusi secara langsung terhadap keseluruhan tujuan
proyek.
D. Media yang digunakan dalam pengerjaan proyek
Adapun proyek ini dikerjakan dengan menggunakan fitur Command Prompt pada
windows laptop penulis, sebagai tempat menjalankan perintah dan langkah-langkah yang
telah diperkenalkan tadi. Penulis menggunakan bahasa python dalam penerapan setiap
langkah-langkah yang dibicarakan diatas untuk pembuatan ini. Pada setiap langkah-langkah
diatas, penulis terus menggunakan bahasa python disetiap langkahnya, dan tidak hanya itu,
penulis juga selalu menggunakan fitur pygame di software python yang digunakan. Jadi,
apabila pembaca ingin menerapkan langkah-langkah dalam proyek ini untuk beberapa
keperluan, pembaca harus menginstal :
dan juga harus menginstal fitur pygame karena beberapa langkah yang dibahas akan
menggunakan fitur pygame dalam penerapannya. Sebelum menginstal fitur pygame ini, harus
diinstal terlebih dahulu aplikasi diatas. Berikut langkah untuk menginstal pygame pada
computer dengan menggunakan CMD :
1) Pastikan koneksi internet bagus.
2) Buka Command Prompt (cmd).
3) Jalankan perintah berikut untuk menginstal Pygame menggunakan pip :
Pada saat penulis menerapkan setiap langkah yang membutuhkan fitur pygame, penulis
membutuhkan langkah-langkah berikut sebagai tahapan penggunaan fitur pygame dalam
penerapan skrip python :
1) Buat atau buka skrip Python yang menggunakan Pygame. Simpan dengan ekstensi
.py.
2) Buka Command Prompt di direktori tempat skrip Python disimpan.
3) Jalankan skrip Python dengan perintah berikut:
# Inisialisasi Pygame
pygame.init()
# Dimensi layar
WIDTH, HEIGHT = 600, 600
# Warna
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
CELL_SIZE = 20
# Inisialisasi labirin
maze_rows = HEIGHT // CELL_SIZE
maze_cols = WIDTH // CELL_SIZE
maze = [[0] * maze_cols for _ in range(maze_rows)]
# Inisialisasi layar
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Maze Generator")
def draw_maze():
screen.fill(WHITE)
for row in range(maze_rows):
for col in range(maze_cols):
color = WHITE if maze[row][col] == 0 else BLACK
pygame.draw.rect(screen, color, (col * CELL_SIZE, row * CELL_SIZE,
CELL_SIZE, CELL_SIZE))
pygame.display.flip()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
Hasil run script python dengan menggunakan CMD dapat dilihat sebagaimana digambarkan
oleh labirin berikut :
2. Representasi Graf
Setelah labirin dihasilkan, selanjutnya adalah membuat representasi graf. Setiap sel
dalam labirin menjadi node dalam graf, dan edge dibentuk antara node-node yang
bersebelahan. Representasi graf ini diperlukan untuk implementasi algoritma
pencarian jalur. Berikut adalah script python membuat representasi graf dari labirin
yang dihasilkan :
# Inisialisasi Pygame
pygame.init()
# Dimensi layar
WIDTH, HEIGHT = 600, 600
# Warna
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
CELL_SIZE = 20
# Inisialisasi labirin
maze_rows = HEIGHT // CELL_SIZE
maze_cols = WIDTH // CELL_SIZE
maze = [[0] * maze_cols for _ in range(maze_rows)]
# Inisialisasi layar
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Maze Generator")
def draw_maze():
screen.fill(WHITE)
for row in range(maze_rows):
for col in range(maze_cols):
color = WHITE if maze[row][col] == 0 else BLACK
pygame.draw.rect(screen, color, (col * CELL_SIZE, row * CELL_SIZE,
CELL_SIZE, CELL_SIZE))
pygame.display.flip()
# Cek atas
if row > 0 and maze[row - 1][col] == 0:
maze_graph[(row, col)].append((row - 1, col))
# Cek bawah
if row < rows - 1 and maze[row + 1][col] == 0:
maze_graph[(row, col)].append((row + 1, col))
# Cek kiri
if col > 0 and maze[row][col - 1] == 0:
maze_graph[(row, col)].append((row, col - 1))
# Cek kanan
if col < cols - 1 and maze[row][col + 1] == 0:
maze_graph[(row, col)].append((row, col + 1))
Hasil run program diatas dengan CMD ditunjukkan pada gambar berikut :
Script Python yang penulis jalankan dengan ekstensi ( dijkstraPencariJalur.py)
tampaknya berhasil menemukan jalur terpendek dari simpul A ke simpul D. Outputnya
menyatakan bahwa jalur terpendek adalah ['A', 'B', 'D'] dengan jarak terpendek sebesar 4.
Ini berarti, berdasarkan representasi graf yang telah Anda buat dan input yang diberikan ke
algoritma Dijkstra, jalur dari simpul A ke simpul D melalui simpul B memiliki panjang 4
(jumlah bobot/jarak minimum).
b. Algoritma Pencarian Jalur: Breadth-First Search (BFS)
from collections import defaultdict, deque
class Graf:
def __init__(self):
self.graph = defaultdict(list)
def tambah_edge(self, u, v):
self.graph[u].append(v)
self.graph[v].append(u)
def bfs(self, mulai, akhir):
visited = set()
queue = deque([[mulai]])
if mulai == akhir:
return f"Sudah berada di simpul akhir {akhir}"
while queue:
path = queue.popleft()
node = path[-1]
if node not in visited:
tetangga = self.graph[node]
for tetangga_node in tetangga:
new_path = list(path)
new_path.append(tetangga_node)
queue.append(new_path)
if tetangga_node == akhir:
return f"Jalur terpendek: {new_path}"
visited.add(node)
return "Tidak ditemukan jalur antara kedua simpul"
# Contoh penggunaan
graf = Graf()
graf.tambah_edge('A', 'B')
graf.tambah_edge('B', 'C')
graf.tambah_edge('B', 'D')
graf.tambah_edge('C', 'D')
graf.tambah_edge('D', 'E')
simpul_mulai = 'A'
simpul_akhir = 'E'
hasil_bfs = graf.bfs(simpul_mulai, simpul_akhir)
print(hasil_bfs)
Hasil run program diatas dengan CMD ditunjukkan pada gambar berikut :
import tkinter as tk
from tkinter import Canvas, Label, Button, messagebox
from dijkstraPencariJalur import dijkstra
from BreadthFirstSearch_Algoritm_jalan_terpendek import bfs
class MazeSolverGUI:
def __init__(self, root, maze, start, end):
self.root = root
self.root.title("Maze Solver")
self.maze = maze
self.start = start
self.end = end
self.canvas_size = 400
self.cell_size = self.canvas_size // len(self.maze)
self.canvas = Canvas(root, width=self.canvas_size, height=self.canvas_size)
self.canvas.pack()
self.label = Label(root, text="Choose Algorithm:")
self.label.pack()
self.dijkstra_button = Button(root, text="Dijkstra", command=self.solve_dijkstra)
self.dijkstra_button.pack()
self.bfs_button = Button(root, text="BFS", command=self.solve_bfs)
self.bfs_button.pack()
self.draw_maze()
def draw_maze(self):
for i in range(len(self.maze)):
for j in range(len(self.maze[i])):
x1, y1 = j * self.cell_size, i * self.cell_size
x2, y2 = x1 + self.cell_size, y1 + self.cell_size
color = "white" if self.maze[i][j] == 0 else "black"
self.canvas.create_rectangle(x1, y1, x2, y2, fill=color)
self.canvas.create_rectangle(
self.start[1] * self.cell_size,
self.start[0] * self.cell_size,
(self.start[1] + 1) * self.cell_size,
(self.start[0] + 1) * self.cell_size,
fill="green",
)
self.canvas.create_rectangle(
self.end[1] * self.cell_size,
self.end[0] * self.cell_size,
(self.end[1] + 1) * self.cell_size,
(self.end[0] + 1) * self.cell_size,
fill="red",
)
def solve_dijkstra(self):
path, distance = dijkstra(self.maze, self.start, self.end)
self.highlight_path(path)
def solve_bfs(self):
path = bfs(self.maze, self.start, self.end)
self.highlight_path(path)
def highlight_path(self, path):
if not path:
messagebox.showinfo("Path not found", "No path found!")
return
for i, j in path:
x1, y1 = j * self.cell_size, i * self.cell_size
x2, y2 = x1 + self.cell_size, y1 + self.cell_size
self.canvas.create_rectangle(x1, y1, x2, y2, fill="yellow")
if __name__ == "__main__":
# Contoh labirin, titik awal, dan titik akhir
maze_example = [
[0, 0, 0, 1, 0],
[1, 1, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 1, 1, 1, 1],
[0, 0, 0, 0, 0],
]
start_point = (0, 0)
end_point = (4, 4)
root_window = tk.Tk()
maze_solver_gui = MazeSolverGUI(root_window, maze_example, start_point,
end_point)
root_window.mainloop()
Untuk membuat antarmuka grafis (GUI) yang menampilkan labirin dan proses
algoritma pencarian jalur, kita dapat menggunakan pustaka GUI seperti Tkinter untuk Python.
Diatas merupakan contoh singkat membuat antarmuka grafis pencarian jalur. Bisa dipilih
dengan menggunakan algoritma yang mana, karena kedua algoritma telah dimasukkan
pustakanya ke script python “Visualisasi_penggunaanAlgoritma_BFS_Dijkstra.py”. Bila kita
ingin menggunakan algoritma BFS untuk mendeteksi jalur terpendek labirin pada kasus ini,
cukup ditekan tombol BFS pada hasil run CMD diatas. Begitupula bila kita menginginkan
eksekusi pencarian jalur terpendek dengan algoritma Dijkstra.
F. Hasil proyek
Adapun yang menjadi hasil akhir dari pengerjaan proyek kali ini meliputi :
a. Program Pembuatan Labirin
Program (script) ini dibuat berdasarkan aturan bahasa python dengan mengimplementasikan
algoritma rekursif backtracking untuk menghasilkan labirin secara acak.
import random
import pygame
import sys
# Inisialisasi Pygame
pygame.init()
# Dimensi layar
WIDTH, HEIGHT = 600, 600
# Warna
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
CELL_SIZE = 20
# Inisialisasi labirin
maze_rows = HEIGHT // CELL_SIZE
maze_cols = WIDTH // CELL_SIZE
maze = [[0] * maze_cols for _ in range(maze_rows)]
# Inisialisasi layar
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Maze Generator")
def draw_maze():
screen.fill(WHITE)
for row in range(maze_rows):
for col in range(maze_cols):
color = WHITE if maze[row][col] == 0 else BLACK
pygame.draw.rect(screen, color, (col * CELL_SIZE, row * CELL_SIZE,
CELL_SIZE, CELL_SIZE))
pygame.display.flip()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
# Inisialisasi Pygame
pygame.init()
# Dimensi layar
WIDTH, HEIGHT = 600, 600
# Warna
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
CELL_SIZE = 20
# Inisialisasi labirin
maze_rows = HEIGHT // CELL_SIZE
maze_cols = WIDTH // CELL_SIZE
maze = [[0] * maze_cols for _ in range(maze_rows)]
# Inisialisasi layar
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Maze Generator")
def draw_maze():
screen.fill(WHITE)
for row in range(maze_rows):
for col in range(maze_cols):
color = WHITE if maze[row][col] == 0 else BLACK
pygame.draw.rect(screen, color, (col * CELL_SIZE, row * CELL_SIZE,
CELL_SIZE, CELL_SIZE))
pygame.display.flip()
def recursive_backtracking(row, col):
directions = [(0, 2), (2, 0), (0, -2), (-2, 0)] # Move in increments of 2 to create walls
between paths
random.shuffle(directions)
for dr, dc in directions:
new_row, new_col = row + dr, col + dc
if 0 <= new_row < maze_rows and 0 <= new_col < maze_cols and maze[new_row]
[new_col] == 0:
maze[new_row][new_col] = 1
maze[(row + new_row) // 2][(col + new_col) // 2] = 1 # Break the wall between cells
recursive_backtracking(new_row, new_col)
# Generate maze using recursive backtracking
recursive_backtracking(0, 0)
# Draw the initial maze
draw_maze()
# Inisialisasi objek graf
maze_graph = {}
# Fungsi untuk menambahkan edge antara node-node yang bersebelahan
def add_edges_from_maze(maze, maze_graph):
rows = len(maze)
cols = len(maze[0])
for row in range(rows):
for col in range(cols):
if maze[row][col] == 0: # Hanya tambahkan edge untuk sel yang merupakan jalur
maze_graph[(row, col)] = []
# Cek atas
if row > 0 and maze[row - 1][col] == 0:
maze_graph[(row, col)].append((row - 1, col))
# Cek bawah
if row < rows - 1 and maze[row + 1][col] == 0:
maze_graph[(row, col)].append((row + 1, col))
# Cek kiri
if col > 0 and maze[row][col - 1] == 0:
maze_graph[(row, col)].append((row, col - 1))
# Cek kanan
if col < cols - 1 and maze[row][col + 1] == 0:
maze_graph[(row, col)].append((row, col + 1))
# Menambahkan edge dari labirin ke graf
add_edges_from_maze(maze, maze_graph)
# Gunakan maze_graph seperti yang diinginkan.
print("Representasi Graf dari Labirin:")
print(maze_graph)
c. Script pencarian jalur terpendek berbahasa pemrograman python, implementasi
dari Algoritma Pencarian Jalur: Breadth-First Search (BFS)
from collections import defaultdict, deque
class Graf:
def __init__(self):
self.graph = defaultdict(list)
def tambah_edge(self, u, v):
self.graph[u].append(v)
self.graph[v].append(u)
def bfs(self, mulai, akhir):
visited = set()
queue = deque([[mulai]])
if mulai == akhir:
return f"Sudah berada di simpul akhir {akhir}"
while queue:
path = queue.popleft()
node = path[-1]
if node not in visited:
tetangga = self.graph[node]
for tetangga_node in tetangga:
new_path = list(path)
new_path.append(tetangga_node)
queue.append(new_path)
if tetangga_node == akhir:
return f"Jalur terpendek: {new_path}"
visited.add(node)
return "Tidak ditemukan jalur antara kedua simpul"
# Contoh penggunaan
graf = Graf()
graf.tambah_edge('A', 'B')
graf.tambah_edge('B', 'C')
graf.tambah_edge('B', 'D')
graf.tambah_edge('C', 'D')
graf.tambah_edge('D', 'E')
simpul_mulai = 'A'
simpul_akhir = 'E'
hasil_bfs = graf.bfs(simpul_mulai, simpul_akhir)
print(hasil_bfs)
# Inisialisasi priority queue (heap) untuk menyimpan node-node yang akan dieksplorasi
priority_queue = [(0, start)]
while priority_queue:
current_distance, current_node = heapq.heappop(priority_queue)
# Skip jika node ini sudah dieksplorasi sebelumnya
if current_distance > distances[current_node]:
continue
for neighbor, weight in graph[current_node].items():
distance = current_distance + weight
# Perbarui jarak terpendek jika ditemukan jarak yang lebih pendek
if distance < distances[neighbor]:
distances[neighbor] = distance
heapq.heappush(priority_queue, (distance, neighbor))
# Jalur terpendek dari start ke end
path = []
current = end
while current != start:
path.insert(0, current)
current = min(graph[current], key=lambda x: distances[x])
path.insert(0, start)
return path, distances[end]
# Contoh penggunaan
graph = {
'A': {'B': 1, 'C': 4},
'B': {'A': 1, 'C': 2, 'D': 5},
'C': {'A': 4, 'B': 2, 'D': 1},
'D': {'B': 5, 'C': 1}
}
start_node = 'A'
end_node = 'D'
shortest_path, shortest_distance = dijkstra(graph, start_node, end_node)
print(f"Jalur terpendek dari {start_node} ke {end_node}: {shortest_path}")
print(f"Jarak terpendek: {shortest_distance}")
f. Flowchart