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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
src/__pycache__/
137 changes: 83 additions & 54 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,77 +2,106 @@

<img src="https://picjumbo.com/wp-content/uploads/white-tir-truck-in-motion-driving-on-highway_free_stock_photos_picjumbo_DSC04205-1080x720.jpg" class="img-responsive" width="50%" height="50%"><img src="https://upload.wikimedia.org/wikipedia/commons/1/1a/Luftaufnahmen_Nordseekueste_2013_05_by-RaBoe_tele_46.jpg" class="img-responsive" width="50%" height="50%">

## Tujuan Tugas
1. Review materi pathfinding pada mata kuliah Strategi Algoritma.
2. Mengenal multiple-agent TSP.
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>
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.
## Prerequisites
Untuk menjalankan program, perangkat anda perlu memiliki dependencies berikut ini
1. [Python (v3.7.0 or higher)](https://www.python.org/downloads/)
2. [Python-MIP](https://docs.python-mip.com/en/latest/install.html)
3. [NetworkX for Python](https://networkx.github.io/documentation/stable/install.html)
4. [Matplotlib](https://matplotlib.org/3.2.1/users/installing.html)

Apabila anda memiliki package manager [pip](https://pypi.org/project/pip/), anda dapat menginstal dependencies nomor 2 sampai 4 dengan menjalankan perintah berikut
```
pip install requirements.txt
```

## Running
Untuk simpul-simpul yang ingin ditelusuri, ubahlah file **post.txt** pada directory **data**, dengan baris pertama merupakan indeks simpul awal (kantor pusat logistik) dan simpul lainnya dipisahkan *newline*.

Contoh isi file *post.txt*
```
1
2
3
4
```
Jalankan perintah berikut pada directory **bin**
- Untuk peta Oldenburg
```
python main.py ol
```
- Untuk peta San Francisco
```
python main.py sf
```

## 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.
## Solution
### Pathfinding
Dalam membentuk upagraf dari simpul-simpul kota yang diinginkan, algoritma pathfinding yang dimanfaatkan adalah A* (a-star) dengan fungsi biaya/cost didefinisikan sebagai berikut

<img src=https://latex.codecogs.com/gif.latex?f%28n%29%20%3D%20g%28n%29%20&plus;%20h%28n%29>

dengan g(n) merupakan biaya/cost yang dibutuhkan untuk mencapai simpul n dan h(n) merupakan nilai heuristik yang memperkirakan biaya/cost yang dibutuhkan untuk mencapai simpul tujuan. Nilai heuristik yang dimanfaatkan dalam implementasi program ini adalah **Euclidean Distance** antara simpul n dengan simpul tujuan.

<img src=https://latex.codecogs.com/gif.latex?d%3D%5Csqrt%7B%28x_1-x_2%29%5E2&plus;%28y_1-y_2%29%5E2%7D>

### Mutiple Travelling Salesman Problem

#### 1. Reduced Cost Matrix

Persoalan mTSP dapat diaproksimasi solusinya dengan membagi-bagi titik menjadi sebanyak **m** subgraf lengkap yang akan dicari tur minimumnya. Sirkuit Hamilton minimum ini dapat dicari dengan merepresentasikan tiap subgraf menjadi matriks ketetanggaan dengan contoh sebagai berikut.

<img src=https://latex.codecogs.com/gif.latex?%5Cbegin%7Bbmatrix%7D%20%5Cinfty%20%2614%2617%262%268%5C%5C%2012%26%5Cinfty%2619%262%267%5C%5C%2010%263%26%5Cinfty%264%262%5C%5C%205%263%2612%26%5Cinfty%269%5C%5C%2011%267%264%2612%26%5Cinfty%20%5Cend%7Bbmatrix%7D>

### 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. Simpul-simpul tersebut merupakan masukan program yang dimasukkan oleh pengguna, dengan format masukan bebas. Hasilkan sebuah matriks jarak antar simpul upagraf lengkap. Nilai untuk milestone pertama maksimal adalah **600**.
Matrix ini kemudian akan direduksi sedemikian rupa sehingga pada setiap kolom dan baris matriks terdapat sedikitnya satu sel yang bernilai nol.

### 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**
<img src=https://latex.codecogs.com/gif.latex?%5Cbegin%7Bbmatrix%7D%20%5Cinfty%20%2612%2615%260%266%5C%5C%208%26%5Cinfty%2617%260%265%5C%5C%206%261%26%5Cinfty%262%260%5C%5C%200%260%269%26%5Cinfty%266%5C%5C%202%260%260%265%26%5Cinfty%20%5Cend%7Bbmatrix%7D>

### 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**
Total nilai yang dikurangi dari matriks awal (r) adalah sebesar 18.

## 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 :
Dengan memanfaatkan reduced cost matrix ini, nilai tur yang seminimum mungkin dapat dicari dengan pendekatan Branch and Bound, dimana nilai cost untuk setiap simpul c(i) ditulis sebagai

1. Pendekatan algoritma yang digunakan untuk pathfinding dan penyelesaian mTSP, serta
2. Cara menjalankan program, termasuk instalasi pustaka bila menggunakan bermacam pustaka
<img src=https://latex.codecogs.com/gif.latex?%5Chat%7Bc%7D%28S%29%20%3D%20%5Chat%7Bc%7D%28P%29%20&plus;%20A%28i%2Cj%29%20&plus;%20r>

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>
dengan *c(P)* merupakan cost dari simpul parent pada pohon pencarian dan *A(i,j)* merupakan nilai sel matriks yang dipilih

## 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.
#### 2. Pemodelan MIP

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.
Permasalahan m-TSP merupakan permasalahan optimasi yang diselesaikan dengan pendekatan **mixed integer programming (MIP)** dengan fungsi objektif sebagai berikut.

## 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.
<img src=https://latex.codecogs.com/gif.latex?min%5Csum_%7B%5C%28i%2Cj%29%20%5Cin%20V%7Dc%5Ctextsubscript%7Bij%7D%20x%5Ctextsubscript%7Bij%7D>

## 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. Jawaban akan diposting dalam bagian QnA README ini.
Batasan-batasan (constraints) berupa persamaan linear yang ditambahkan kedalam model MIP ini adalah

## QnA
- Bagaimana penentuan upagraf ? Apakah bebas oleh developer ?<br>
Upagraf dibangun dari masukan simpul-simpul tujuan dan simpul kantor pusat. Masukan tersebut berasal dari pengguna, namun developer bebas menentukan format masukan simpul.
- Bagaimana cara menghitung jarak dua simpul pada upagraf ? Apakah menggunakan jarak koordinat kedua simpul atau menggunakan data jalan, walaupun kedua simpul tidak bertetangga ?<br>
Tentunya kendaraan kurir bergerak di atas jalanan, tidak bergerak lurus antara du simpul :) Selain itu, sebuah simpul dapat mencapai simpul lainnya dengan menelusuri jalan. Lakukan penelusuran untuk mendapatkan jaraknya.
- Apakah program menggunakan GUI atau command-based ?<br>
Dibebaskan.
<img src=https://latex.codecogs.com/gif.latex?%5Csum_%7Bi%20%5Cin%20V-%5C%7B0%5C%7D%7Dx%5Ctextsubscript%7Bi0%7D%3Dm>

<img src=https://latex.codecogs.com/gif.latex?%5Csum_%7Bj%20%5Cin%20V-%5C%7B0%5C%7D%7Dx%5Ctextsubscript%7B0j%7D%3Dm>

Dengan asumsi simpul (node) 0 merupakan simpul dimulainya tur, kedua persamaan di atas berfungsi untuk memastikan bahwa tepat sebanyak m kendaraan logistik yang berangkat dan kembali ke simpul 0.

<img src=https://latex.codecogs.com/gif.latex?%5Csum_%7Bi%20%5Cin%20V%7Dx_%7Bij%7D%3D1%2C%5Cforall%20j%20%5Cin%20V-%5C%7B0%5C%7D>
<br>
<img src=https://latex.codecogs.com/gif.latex?%5Csum_%7Bj%20%5Cin%20V%7Dx_%7Bij%7D%3D1%2C%5Cforall%20i%20%5Cin%20V-%5C%7B0%5C%7D>

Sementara itu, kedua persamaan di atas bermanfaat untuk membatasi agar simpul lainnya (selain simpul awal 0) agar hanya dikunjungi tepat sekali saja.

Untuk mengeliminasi subtour, constraint ini ditambahkan ke dalam model MIP yang sudah ada [MTZ, 1960].

<img src=https://latex.codecogs.com/gif.latex?u_i-u_j&plus;p%5Ccdot%20x_%7Bij%7D%5Cle%20p-1%2C%5Cforall%201%20%5Cle%20i%20%5Cne%20j%20%5Cle%20n>

dengan **n** merupakan jumlah nodes pada graf dan **p** merupakan jumlah node maksimum yang dapat dikunjungi sebuah kendaraan logistik (salesman)

## Referensi
Silahkan gunakan referensi berikut sebagai awal pengerjaan tugas:<br>
[1] Dataset : https://www.cs.utah.edu/~lifeifei/SpatialDataset.htm<br>
[2] Pengenalan dan formulasi mTSP : https://neos-guide.org/content/multiple-traveling-salesman-problem-mtsp<br>
[3] MIP , pustaka Python untuk optimisasi : https://python-mip.readthedocs.io/en/latest/intro.html<br>
[4] OpenGL untuk Python : https://stackabuse.com/brief-introduction-to-opengl-in-python-with-pyopengl/<br>
[5] Li, Feifei, Dihan Cheng, Marios Hadjieleftheriou, George Kollios, and Shang-Hua Teng. "On trip planning queries in spatial databases." In International symposium on spatial and temporal databases, pp. 273-290. Springer, Berlin, Heidelberg, 2005.
1. Dataset : https://www.cs.utah.edu/~lifeifei/SpatialDataset.htm
2. Pengenalan dan formulasi mTSP : https://neos-guide.org/content/multiple-traveling-salesman-problem-mtsp
3. MIP , pustaka Python untuk optimisasi : https://python-mip.readthedocs.io/en/latest/intro.html
4. Li, Feifei, Dihan Cheng, Marios Hadjieleftheriou, George Kollios, and Shang-Hua Teng. "On trip planning queries in spatial databases." In International symposium on spatial and temporal databases, pp. 273-290. Springer, Berlin, Heidelberg, 2005.
5. Matai, Rajesh, Surya Prakash Singh, and Murari Lal Mittal. "Traveling salesman problem: an overview of applications, formulations, and solution approaches." Traveling salesman problem, theory and applications 1, 2010.
6. K-Means Clustering Algorithm: https://stanford.edu/~cpiech/cs221/handouts/kmeans.html
7. Python MIP for TSP Problem: https://python-mip.readthedocs.io/en/latest/examples.html
8. Reduced Cost Matrix for TSP: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.734.8448&rep=rep1&type=pdf

## Credits
Thank you for Li Fei Fei et. al. for providing the data.

## Final Words
Akhir Kata, selamat bersenang-senang ! It's not worth it if you're not having fun.
85 changes: 85 additions & 0 deletions bin/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
"""
Main program to simulate
logistic routing problem
"""
import sys
import networkx as nx
sys.path.append('../')
from src import graph, mtsp, clustering, hungarian

OUTPUT = "../out/"

def input_logistics():
''' Masukan m '''
while True:
m = int(input("Masukan banyaknya kendaraan logistik: "))
if m > 0:
return m

def choose_method():
''' Pilihan metode penyelesaian mTSP '''
print("Aproksimasi penyelesaian m-TSP: ")
print("[1] Reduced Cost Matrix")
print("[2] Pemodelan MIP")

while True:
m = int(input("Pilihan anda: "))
if m == 1 or m == 2:
return m

MAP = None
SAVE_GRAPH = False # if true, graph will be saved in ../out/img

if len(sys.argv) == 2:
if sys.argv[1].lower() == 'ol':
MAP = graph.read_graph(graph.OL_NODE, graph.OL_EDGE)
elif sys.argv[1].lower() == 'sf':
MAP = graph.read_graph(graph.SF_NODE, graph.SF_EDGE)
else:
print("Invalid argument(s)")
sys.exit()
else:
print("Invalid argument(s)")
sys.exit()

START, PLACES = graph.create_subgraph(MAP)

# Input menu
log = input_logistics()
opt = choose_method()
tours = [] # Results go here !

if opt == 1: # With Clustering

CL = clustering.cluster(PLACES, START, log)
clustering.cluster_to_matrix(PLACES, START, CL)

n = len(CL)

# Solving each tours
for i in range(n):
MAPPED, MATR = mtsp.load_graph( OUTPUT + "CLnodes" + str(i) + ".txt",
OUTPUT + "CLmat" + str(i) + ".txt" )
tour = hungarian.search(MAPPED, MATR)
tours.append(tour)

else: # Without clustering

graph.create_subgraph_matrix(START, PLACES, filename=sys.argv[1].upper())
MAPPED, MATR = mtsp.load_graph( OUTPUT + sys.argv[1].upper() + "nodes.txt",
OUTPUT + sys.argv[1].upper() + "mat.txt" )

# Max num of nodes = (len(MATR)//log) - 1
tours = mtsp.mip_solve(MAPPED, MATR, log, (len(MATR)//log) - 1)


# Output
print("Simpan? (y/n)")
ans = input(">> ")

SAVE_GRAPH = ans.lower() == 'y'
graph.print_tours(PLACES, tours)
ed, nd, lb = graph.generate_tours_data(tours)

graph.draw_map(MAP, PLACES, ed, nd, lb, save=SAVE_GRAPH)

Loading