Algoritma apa yang digunakan oleh elevator untuk menemukan jalur terpendek menuju pesanan lantai perjalanan?

27

Saya mencoba mensimulasikan lift, seperti biasa saya mulai dengan sangat sederhana dengan hanya mengambil satu urutan pada satu waktu, kemudian menambahkan memori ke lift dalam bentuk antrian sehingga lantai dilalui sesuai urutan penekanannya, yang jelas bukan pendekatan terbaik.

Jadi saat ini saya menggunakan logika yang sangat sederhana dan "singkat", yaitu, untuk lantai saat ini temukan lantai yang paling dekat dengan saya dan atur sebagai tujuan berikutnya dan putar sampai tidak ada lantai lagi dalam daftar.

Tapi ini tidak selalu berhasil, misalnya lift berada di lantai 3 gedung 5 lantai dan mendapat pesanan 4,5,2 jalur terpendek adalah 2-> 4-> 5 yang harganya 4 lantai tetapi menggunakan logika ini 4-> 5-> 2 yang harganya 5 memiliki peluang yang sama untuk dipetik, tergantung pada kodenya.

Bagaimana cara menemukan jalur terpendek dan membuat lift lebih efisien?

Raed Tabani
sumber
6
Saya ingin mengundang Anda ke kantor saya dan mencari tahu algoritma yang digunakan elevator di sana. Karena saya sama sekali tidak bisa.
gnasher729
1
@ gnasher729 Oh, saya bisa walaupun saya tidak mengenal Anda, karena pasti sama dengan di kantor saya: jangan pernah berhenti di lantai tempat saya berada, kecuali ketika sudah penuh dengan orang. Apakah saya benar?
Andres F.
2
Tidak terlalu. Ada empat lift. Anda menekan tombol, tidak ada yang bergerak untuk waktu yang sangat lama. Jika satu bergerak, ia berhenti tepat di depan lantai Anda dan menunggu lama, sampai disusul oleh yang lain yang melewati lantai Anda dan kemudian turun. Dalam perjalanan ke tanah itu berhenti setidaknya tiga kali tanpa ada yang masuk.
gnasher729
2
Permainan / tantangan pemrograman yang relevan: play.elevatorsaga.com
dwikle

Jawaban:

30

"Efisiensi" bukan fitur yang paling penting, yang paling penting adalah memastikan setiap pesanan diikuti, bahwa tidak ada kelaparan. Jika seseorang menekan 100 dan orang-orang terus menekan 1 dan 2 mungkin efisien untuk terus berjalan di antara lantai-lantai itu, tetapi alangkah baiknya jika 100 dikunjungi di beberapa titik.

Saya pikir (dari pengamatan pribadi ketika saya tertarik untuk mencari tahu) bahwa kebanyakan dari mereka:

  1. Mulai pergi ke arah tombol pertama ditekan, melacak ke arah mana kita pergi
  2. Ketika lantai tercapai dan tombol itu ditekan, berhenti dan buka pintu, tandai tombol untuk lantai ini karena tidak ditekan lagi.
    • Jika masih ada lagi lantai yang perlu kita kunjungi yang berada di arah yang sama, teruslah ke arah itu .
    • Jika tidak dan masih ada lantai yang perlu kita kunjungi, bergeraklah ke arah itu.
    • Jika tidak maka kita sudah selesai dan akan mulai pada 1 ketika tombol ditekan lagi.

Perhatikan bahwa banyak elevator memiliki tombol "Saya ingin naik" dan "Saya ingin turun" di sebelah pintu alih-alih satu tombol. Algoritme hanya membutuhkan perubahan kecil: pada 2, jika satu-satunya tombol yang ditekan untuk lantai itu adalah salah satu tombol di sebelah pintu, hanya berhenti dan buka pintu jika kita menuju ke arah itu. Mungkin terus menekan tombol jika pintu terbuka karena tombol ditekan di dalam lift dan itu menuju ke arah yang salah.

Anda tidak perlu mencari tahu seluruh jalan , hanya ke arah mana untuk pergi berikutnya.

RemcoGerlich
sumber
ini benar-benar terlewati pikiran saya, saya sangat fokus pada efisiensi dan lupa hal-hal lain juga penting. masih belum efisien untuk mengatakan dari 2-> 100 dan kembali ke 1 hanya karena berada di arah yang sama tetapi setidaknya itu memastikan tidak ada kelaparan. dan, benar-benar di luar topik, mungkin ini sebabnya sering ditemukan dua lift dengan logika ini? yang membuat saya bertanya-tanya apakah itu lebih umum untuk menemukan lift di arah yang berlawanan pada waktu tertentu. Bagaimanapun, saya masih penasaran bagaimana menemukan seluruh jalur terpendek, tetapi ini menjawab pertanyaan saya dengan sangat rapi, terima kasih
Raed Tabani
7
Perhatikan bahwa begitu Anda sampai di sebuah bangunan dengan 100 lantai, Anda biasanya akan memiliki lift yang hanya melayani kisaran lantai tertentu (mis. 0-19, 20-39, ...), serta lift ekspres yang hanya menempuh jarak jauh (mis. 0 ke 50, 0 hingga 100, 50 hingga 100, tetapi tidak ada lantai di antaranya), jadi Anda mungkin harus mengganti elevator untuk sampai ke tujuan. Anda mungkin juga memiliki beberapa elevator per poros yang jelas tidak bisa saling melintas. Benar-benar di luar topik: IIRC, ada pertanyaan tentang efisiensi tombol panah atas dan bawah pada situs Pengalaman Pengguna yang dibuat untuk bacaan yang sangat menarik.
Jörg W Mittag
terima kasih, saya tidak tahu itu. pengelompokan kelihatannya merupakan strategi yang baik jika satu bagian memecah seluruh sistem tidak dan juga untuk mendistribusikan beban yang penting untuk keausan mekanis. Saya bertanya-tanya apakah lift ekspres ini disebabkan oleh kekurangan logis dari algoritma Knuth's Elevator.
Raed Tabani
hanya hal lain yang saya tambahkan adalah bahwa mereka sering memiliki lantai 'rumah' yang akan mereka kembalikan ketika tidak digunakan, ini bisa berbeda untuk lift yang berbeda, dan bahkan mungkin berubah tergantung pada waktu dan pola penggunaan yang diharapkan
jk .
Saya memiliki kecenderungan untuk menekan tombol naik / turun setengah secara acak terlepas dari arah mana saya sebenarnya bepergian. Dalam kasus saya, saya hanya pernah memiliki satu tujuan, jadi lift membawa saya ke lokasi itu terlepas dari apakah saya memilih naik atau tidak. turun. Saya menduga bahwa jika saya menekan tombol ke bawah, pilih lantai di atas saya, dan kemudian pilih lantai di bawah saya sebelum lift mulai bergerak, itu akan membawa saya ke lantai di bawah saya daripada lantai yang saya dorong dulu. Saya bisa saja salah, saya pasti akan mengujinya lain kali saya menemukan diri saya di dalam lift.
Ucenna
13

Jawaban lainnya dengan benar memberikan algoritma lift standar, yang pada dasarnya "tetap berjalan ke arah yang sama selama mungkin dan membuat setiap yang diperlukan berhenti di sepanjang jalan".

Ada algoritma lift lainnya. Misalnya, pertimbangkan sebuah gedung apartemen di mana apartemen menjadi lebih mahal saat Anda naik. Pemilik gedung mungkin memilih untuk memodifikasi algoritma lift untuk "pergi ke arah yang sama selama mungkin tetapi hanya berhenti di jalan turun". Dengan begitu jika Anda memiliki orang-orang di lift yang berada di lobi dan pergi ke 2, 5 dan 10, lift pergi ke 10, lalu 5, lalu 2, mengantarkan orang ke dalam urutan berapa banyak sewa yang mereka bayar. Tetapi tentu saja ketika orang-orang di 10 meninggalkan apartemen mereka, mereka akan lebih sering harus menunggu lebih lama untuk sampai ke lobi.

Jika Anda mencari solusi yang efisien maka buatlah metrik untuk biaya dan implementasikan banyak algoritma yang berbeda, dan jalankan simulasi. Ingatlah untuk mengukur tidak hanya biaya rata-rata, tetapi juga metrik seperti yang terlama yang harus dilayani oleh satu permintaan. Mengoptimalkan untuk rata-rata rendah kadang-kadang dapat mengoptimalkan kasus terburuk, yang buruk.

Eric Lippert
sumber
1
Tampaknya jarang (alogirm lainnya)
FindOutIslamNow
10

Perhatikan bahwa elevator menggunakan algoritma penjadwalan yang sama dengan beberapa pengontrol hard drive. Algoritma SCAN standar bahkan dikenal sebagai algoritma elevator . Saya pikir dalam praktiknya algoritma LOOK lebih umum, karena sedikit lebih efisien daripada SCAN.

kepala kebun
sumber
Ketika Anda berbicara dengan sangat pasti, apakah Anda memiliki pengalaman profesional dalam mengimplementasikan kode untuk elevator? Terutama sistem lift yang lebih baru? Saya ingin tahu apakah setelah 9/11 di NYC ada prioritas yang lebih tinggi untuk mengirim penumpang turun dan membawa mereka naik.
John Zabroski