Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
133 changes: 133 additions & 0 deletions Milestone 1/graph.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
import queue as Q
import numpy as np

# Pembacaan node dari dataset
def read_nodes(file):
dataset = open("../dataset/"+file+".txt",'r')
nodes = dataset.readlines()
locations = {}
dataset.close()

for node in nodes:
place = []
place = node.split(" ")
if(node[2][-1] == '\n'):
place[2] = place[2][:-1]
# loc = Node(place[0],place[1],place[2])
locations.update({place[0] : (float(place[1]),float(place[2]))})
# locations[int(place[0])] = (float(place[1]),float(place[2]))
return locations

# Pembacaan edge dari dataset
def read_edges(file):
dataset = open("../dataset/"+file+".txt",'r')
edges = dataset.readlines()
street = {}
dataset.close()

for edge in edges :
edge = edge.split(" ")
if edge[3][-1] == '\n' :
edge[3] = edge[3][:-1]
if int(edge[2]) not in street :
street.update({int(edge[2]) : []})
if int(edge[1]) not in street :
street.update({int(edge[1]) : []})
connect(street,edge)

return street

# Untuk menghubungkan edge antar node
def connect(street,edge):
street[int(edge[2])].append((int(edge[1]), float(edge[3])))
street[int(edge[1])].append((int(edge[2]), float(edge[3])))

# Fungsi heuristik menggunakan numpy (Euclidean Distance)
def heuristic(init,finish):
return(np.linalg.norm(finish-init))

# Tetangga dari sebuah node
def neighbors(node,edge_data):
# print(node)
list_neighbor = edge_data[node]
neighbors = []

for neighbor in list_neighbor:
neighbors.append(neighbor)

return neighbors

# Menyimpan path yang ditempuh untuk mencapai sebuah node
def reconstruct_path(node, start):
path = []
path.append(node)
while node != start:
node = node.parent
path.append(node)
return path

# Algoritma A* untuk mencari shortest path antar node
def a_star(start,finish,node_data,edge_data):
frontier = Q.PriorityQueue()
frontier.put(start, 0)
parent = {start: None}
total_cost = {start: 0}

while frontier:
current = frontier.get()

if current == finish:
break

for visit,cost in neighbors(current,edge_data):
new_cost = total_cost[current] + cost
if visit not in total_cost or new_cost < total_cost[visit]:
total_cost[visit] = new_cost
priority = new_cost + heuristic(finish, visit)
frontier.put(visit, priority)
parent[visit] = current

return total_cost[current]

# Membentuk matriks subgraph dari list node dan edge yang telah dibuat
def subgraph_matrix(node_data, edge_data, unvalued_node) :
index = {}
for i in range(len(unvalued_node)) :
index[unvalued_node[i]] = i
subgraph = [[0 for i in range(len(unvalued_node))] for j in range(len(unvalued_node))]

for i in range(len(unvalued_node)) :
for j in range(len(unvalued_node)) :
if i > j :
subgraph[i][j] = subgraph[j][i]
# print(i,j,subgraph[i][j])
elif i < j :
subgraph[i][j] = a_star(unvalued_node[i], unvalued_node[j], node_data, edge_data)

return index,subgraph


# Main function
city = input("Masukkan wilayah yang ingin dianalisis : ")
if(city == "OL"):
edge_data = read_edges("OLcedge")
node_data = read_nodes("OLcnode")
elif(city == "SF"):
edge_data = read_edges("SFcedge")
node_data = read_nodes("SFcnode")
else:
edge_data = read_edges("exedge")
node_data = read_nodes("exnode")

node1 = int(input("Masukkan node 1 : "))
node2 = int(input("Masukkan node 2 : "))
print()
print("Rute terpendek dari " + str(node1) + " ke " + str(node2) + " adalah :")
print(a_star(node1,node2,node_data,edge_data))
print()
dest = [i for i in range(6)]
idx,sg = subgraph_matrix(node_data, edge_data, dest)

print("Matriks rute terpendek hasil algoritma A* :")
for row in sg:
print(row)
56 changes: 23 additions & 33 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,52 +8,42 @@
3. Melakukan visualisasi data.

## Deskripsi Masalah
Welcome to **Oldenburg** ! Kota kecil cantik ini merupakan sebuah kota kecil di barat lau kota Bremen , Jerman , dengan penduduk kurang lebih 168 ribu jiwa [2018]. Kota kecil ini cocok menjadi lahan uji coba untuk melakukan pemodelan sederhana pembuatan rute pengantaran logistik.<br>
Welcome to **Oldenburg** ! Kota kecil cantik ini merupakan sebuah kota kecil di barat laut kota Bremen , Jerman , dengan penduduk kurang lebih 168 ribu jiwa [2018]. Kota kecil ini cocok menjadi lahan uji coba untuk melakukan pemodelan sederhana pembuatan rute pengantaran logistik.<br>
Setiap beberapa jam sekali, sebuah perusahaan logistik akan mengirimkan beberapa kurirnya untuk mengantar barang dari kantor pusat mereka ke beberapa titik tujuan yang tersebar di penjuru kota Oldenburg. Anda diminta untuk mencari rute untuk seluruh kurir sehingga jarak yang ditempuh oleh semua kurir paling kecil, sehingga perusahaan logistik dapat menghemat biaya bensin.

## Multiple-Agent TSP
Masalah pengantaran barang untuk satu kendaraan dengan fungsi objektif jarak minimal dapat dimodelkan oleh Travelling Salesman Problem. Akan tetapi, perusahaan logistik biasanya memiliki lebih dari satu kendaraan yang berangkat bersamaan, sehingga TSP kurang cocok digunakan. Generalisasi TSP untuk beberapa agen adalah **multiple-agent TSP (mTSP)**, dan model masalah ini akan kita gunakan. Pada mTSP, akan terdapat *m* tur yang akan dibangun. Syarat dari semua tur mirip dengan TSP, yaitu bahwa seluruh tur akan kembali ke simpul awal (mewakili kantor pusat) dan setiap tujuan hanya akan dilewati oleh satu tur.

## Tugas
Kita akan menggunakan dataset jalanan pada kota Oldenburg yang dapat diakses pada <a href="https://www.cs.utah.edu/~lifeifei/SpatialDataset.htm">tautan ini.</a> Lakukan pengunduhan untuk kedua data jalanan di kota Oldenburg. Data pertama merupakan koordinat simpul, data kedua merupakan data sisi antar simpul. Asumsikan seluruh jalan dua arah.<br>
Seperti yang disebutkan sebelumnya, kita akan menggunakan pendekatan mTSP dalam permasalahan ini. Untuk mempermudah anda dan mempermudah penilaian, tugas akan dibagi dalam beberapa tahap.

### Milestone 1
## Milestone 1
Pada milestone 1, anda diminta untuk membangun sebuah upagraf dari graf jalan keseluruhan kota Oldenburg. Upagraf tersebut merupakan sebuah graf lengkap tak berarah, dengan simpul-simpulnya adalah titik tujuan pengiriman barang ditambah titik yang mewakili kantor pusat perusahaan logistik. Hasilkan sebuah matriks jarak antar simpul upagraf lengkap. Nilai untuk milestone pertama maksimal adalah **600**.

### Milestone 2
Pada Milestone 2 , anda akan menggunakan upagraf yang telah dihasilkan pada Milestone 1 untuk membangun rute dari para kurir dengan pendekatan mTSP. Tampilkan rute yang diambil oleh tiap kurir. Nilai maksimal pada milestone kedua adalah **1500**

### Milestone 3
Setelah berhasil mendapatkan rute bagi para kurir, selanjutnya anda diminta untuk menggambarkan rute dari para kurir. Visualisasi rute minimal membedakan warna rute untuk tiap kurir dan menampilkan upagraf yang digunakan untuk membuat rute. Nilai lebih akan diberikan jika anda dapat menampilkan rute beserta seluruh peta jalan di kota Oldenburg. Nilai minimal adalah **800** dan nilai maksimal adalah **1500**

## Pengerjaan
Tugas ini individual.<br>
Lakukan *fork* terhadap *repository* ini.<br>
Spek tugas cukup umum, sehingga asisten tidak membatasi algoritma maupun bahasa pemrograman yang digunakan, walaupun **penggunaan Python disarankan**. Algoritma yang digunakan untuk pathfinding harus optimal, namun hasil dari mTSP tidak harus optimal (*Note : beberapa pustaka optimization bisa menghasilkan solusi sub-optimal dalam batas waktu tertentu*). Bila merasa sudah menyelesaikan tugas, silahkan lakukan pull request dan hubungi asisten lewat email untuk melakukan demo.<br>
Pastikan ada menambahkan/menggati README ini saat mengumpulkan. README minimal mengandung :
## Pendekatan solusi
Untuk milestone 1, saya menggunakan algoritma pathfinding A* untuk mencari rute terpendek. Algoritma ini merupakan teknik pencarian rute pada graf
untuk mencari rute dengan bobot terpendek dari sebuah node ke node tujuan. Pada kasus kali ini, algoritma pencarian rute digunakan untuk menelusuri
edge/jalan sehingga diperoleh rute dengan jarak terpendek.<br>

1. Pendekatan algoritma yang digunakan untuk pathfinding dan penyelesaian mTSP, serta
2. Cara menjalankan program, termasuk instalasi pustaka bila menggunakan bermacam pustaka
Setiap kota atau titik dalam suatu daerah direpresentasikan oleh simpul pada graf. Setiap jalan yang menghubungkan antar kota direpresentasikan oleh edge(v,e) dengan v adalah simpul asal dan e adalah simpul tujuan. Nilai dari edge(v,e) merupakan jarak tempuh simpul v menuju simpul e.<br>

Anda bebas menggunakan pustaka maupun referensi apapun untuk mengerjakan tugas, kecuali kode/pustaka jadi yang melakukan *routing*, karena tujuan tugas adalah membuat sebuah prototipe pembuatan rute. Pastikan anda mencantumkan sumber bilamana anda menggunakan kode dari orang lain. Akan tetapi, pemahaman terhadap solusi masalah menjadi bagian penting dari penilaian , sehingga anda disarankan untuk menuliskan kode anda sendiri.<br>
Pada persoalan kali ini saya menggunakan metode A* untuk melakukan pathfinding karena dinilai paling efektif. Rumus nilai heuristik untuk algoritma
A* adalah :<br>

## Penilaian
Nilai maksimal non-bonus adalah **4200**. Penilaian akan dilakukan berdasarkan :
1. kode sumber,
2. pendekatan solusi,
2. demo aplikasi dan ,
3. pemahaman terhadap solusi masalah.
```
f(n) = g(n) + h(n)
```

Untuk poin (1) dan poin (2) , nilai maksimal adalah **3600** dari ketiga milestone.<br>
Demo hanya dapat dilakukan sekali. Demo bernilai **600** poin. Pada demo, anda akan menunjukkan hasil aplikasi dan akan terdapat tanya jawab untuk menguji pemahaman.<br>
Asisten juga akan menjalankan **plagiarism checking** antar kode sumber peserta. Bila ditemukan adanya kecurangan, maka nilai peserta bersangkutan adalah 0 tanpa pengubahan, dan pengurangan poin maksimal tidak akan berlaku. Perhatikan bahwa selama anda mencantumkan asal kode yang anda salin , tidak menggunakan pustaka untuk *routing* dan tidak menyalin kode milik teman anda, anda tidak akan mendapat masalah.
Dalam kasus pencarian rute, setiap komponen tersebut memiliki makna sebagai berikut.<br>
- f(n) = cost total untuk mencapai simpul tujuan melalui simpul n <br>
- g(n) = jarak tempuh yang sudah ditempuh dari simpul asal ke simpul n <br>
- h(n) = nilai heuristik berdasarkan jarak euclidean antara simpul n ke simpul tujuan <br>

## Bonus
Bonus **300** poin diberikan jika anda dapat mengirimkan hasil algoritma beserta beberapa contoh masukan/keluaran untuk kasus kota San Francisco , dengan jumlah jalanan yang lebih besar dari Kota Oldenburg. Dataset dapat diambil di website yang sama.
Nilai dari fungsi heuristik ini akan digunakan untuk mencari jalan dengan bobot terkecil, sehingga algoritma akan berjalan lebih efektif

## Kontak
Silahkan hubungi asisten lewat line @alamhasabiebaru atau lewat email 13517096@std.stei.itb.ac.id dengan subjek diawal tulisan \[SELEKSI IRK\] . *Note : waktu menjawab bervariasi, namun email biasanya akan dibalas kurang dari sehari. Line mungkin tidak dibalas dalam waktu satu-dua hari. Mohon bersabar :)*. Pertanyaan juga dipersilahkan.
## Cara Menjalankan Program
Pastikan sudah menjalankan program di folder src
```
python graph.py
```
Masukkan untuk kota berupa "OL" atau "SF". OL untuk kota Oldenburg dan SF untuk San Fransisco.

## Referensi
Silahkan gunakan referensi berikut sebagai awal pengerjaan tugas:<br>
Expand Down
Loading