Skip to content
116 changes: 59 additions & 57 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,64 +11,66 @@
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.

## 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.
## Library yang digunakan
Pada tugas ini, menggunakan python 3 dan menggunakan beberapa library untuk menyelesaikan milestone yang ada :
1. OpenGL (Visualisasi)
2. Pygame (Visualisasi)
3. MIP (Solver mtsp)

## Instalasi yang diperlukan
Pada tugas ini, saya menggunakan sistem operasi linux ubuntu, untuk dapat menjalankan program ini, perlu melakukan beberapa instalasi sebagai berikut :
1. OpenGL
```
pip3 install PyOpenGL PyOpenGL_accelerate
```
apabila masih belum support, kemungkinan perlu menginstall glut terlebih dahulu, untuk linux, dapat menggunakan command berikut :
```
sudo apt-get install freeglut3-dev
```
2. Pygame
```
pip3 install pygame
```
3. MIP
```
pip3 install mip
```
atau
```
pip3 install mip --user
```
apabila mip tidak dapat dijalankan, karena error "cbclib" is not defined, maka pastikan cbc sudah terinstall, untuk melakukan itu, pada ubuntu dapat menggunakan command :
```
sudo apt-get install -y coinor-cbc
```

## Pendekatan Algoritma
### Pathfinding
Asumsi edge yang disediakan pada dataset adalah dua arah.
Dalam penyelesaian persoalan ini, algoritma pathfinding yang saya gunakan adalah dijkstra. Saya menggunakan algoritma tersebut, karena algoritma tersebut akan mencari jarak terpendek antara dua buah titik berdasarkan suatu titik awalan yang ditentukan. Pemilihan algoritma dijkstra ini juga dikarenakan dengan dijkstra, path dari suatu titik ke titik lain dapat ditelusuri dengan menyimpan informasi parent dari setiap titik. Pembentukan subgraph dan jarak antara titik menggunakan dijkstra ini optimal karena dijkstra akan mencari lintasan terpendek menuju suatu titik berdasarkan edge yang terdapat pada sebuah graf. Jadi, tidak mungkin dijkstra akan menuju sebuah titik pada graf melalui sebuah lintasan yang tidak ada pada graf tersebut. Sehingga, hal ini membuktikan bahwa pathfinding dengan dijkstra sudah optimal karena mencari lintasan terpendek berdasarkan edge yang ada.

### mTSP
Penyelesaian persoalan mTSP pada tugas ini saya menggunakan MIP solver untuk python. Dengan memberikan fungsi objektif minimisasi serta constraint pada persoalan ini, mip solver akan mencari solusi untuk fungsi objektif tersebut se optimal mungkin berdasarkan batas waktu yang diberikan. Pada kasus ini, saya memberikan batas waktu 30 detik. Namun, pada saat saya mencoba untuk langsung penyelesaian mTSP dengan salesman lebih dari 1, MIP tidak menemukan solusi yang optimal maupun feasible, sehingga solusi tidak dapat ditemukan. Maka dari itu, saya mencoba menggunakan pendekatan lain. Pendekatan yang saya gunakan adalah membagi daerah tujuan tiap salesman berdasarkan titik koordinat terhadap titik awal (perusahaan tempat kurir bekerja).

Pendekatan tersebut akan membagi daerah yang kurang lebih jumlah titik tujuan yang akan dikunjungi tiap kurir tersebut sama rata. Hal tersebut didapat dengan mendata banyaknya titik selain perusahaan, kemudian menghitung gradien dari koordinat titik tersebut terhadap koordinat titik perusahaan. Kemudian, titik tersebut akan diurutkan berdasarkan gradien yang telah didapatkan tadi. Lalu, tiap salesman akan dibagi rata jumlah titik tujuan berdasarkan pengurutan titik koordinat berdasarkan gradien. Dengan itu, harapannya adalah pembagian wilayah tersebut dapat memberikan hasil yang optimal, karena setiap titik yang memiliki gradien yang berdekatan akan berada di satu wilayah yang lebih dekat dibanding wilayah lain.

Kemudian, setelah membagi wilayah untuk tiap kurir tersebut. Akan dijalankan MIP Solver lagi untuk tiap kurir untuk mendapatkan hasil persoalan mTSP yang optimal dengan jumlah salesman sebanyak 1. Pendekatan pathfinding, pembagian wilayah, dan juga solusi MIP solver yang optimal diharapkan akan memberikan hasil yang optimal untuk permasalahan mTSP ini.

## Cara Menjalankan Program
Untuk menjalankan aplikasi ini, dari root directory project ini dapat pindah ke folder src dengan command "cd src". Kemudian, jalankan file main.py dengan command :
```
cd src
python3 main.py
```
atau apabila python sudah dipastikan dalam versi python 3
dapat menggunakan command
```
cd src
python main.py
```
Masukkan untuk kota berupa "OL" atau "SF". OL untuk kota Oldenburg dan SF untuk San Fransisco.

## 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
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**.

### 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 :

1. Pendekatan algoritma yang digunakan untuk pathfinding dan penyelesaian mTSP, serta
2. Cara menjalankan program, termasuk instalasi pustaka bila menggunakan bermacam pustaka

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>

## 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.

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.

## 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.

## 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.

## 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.

## 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.

## Credits
Thank you for Li Fei Fei et. al. for providing the data.
Pada tugas ini, saya dapat menampilkan peta San Fransisco yang lebih besar dengan memanfaatkan zooming serta moving pada OpenGL untuk memperoleh penglihatan pada window OpenGL yang lebih baik.

## Final Words
Akhir Kata, selamat bersenang-senang ! It's not worth it if you're not having fun.
Loading