pengantar
Tantangannya adalah varian yang sangat menarik dari arena pacuan kuda dan dua tantangan itu:
Sumber tantangan ini ada di sini (dalam bahasa Jerman): c't-Racetrack
Tantangan ini sangat menarik (dan berbeda dari dua tantangan di atas) karena menggabungkan ruang pencarian yang besar dengan beberapa kondisi tepat yang harus dipenuhi. Karena ruang pencarian yang luas, teknik pencarian lengkap sulit digunakan, karena kondisi yang tepat, metode perkiraan juga tidak mudah digunakan. Karena kombinasi unik ini (ditambah intuisi yang mendasari dari fisika) masalahnya menarik (dan segala sesuatu sehubungan dengan mobil balap tetap menarik ;-)
Tantangan
Lihatlah arena pacuan kuda ( sumber ) berikut:
Anda harus mulai (120,180)
dan menyelesaikan tepat pada (320,220)
("Ziel" dalam bahasa Jerman) tanpa menyentuh salah satu dinding.
Mobil dikendalikan oleh vektor percepatan bentuk (a_x,a_y)
- sebagai contoh:
(8,-6)
(10,0)
(1,9)
Angka pertama adalah percepatan untuk vektor-x, yang kedua untuk vektor-y. Mereka harus bilangan bulat karena Anda hanya diperbolehkan menggunakan titik bilangan bulat di grid. Selain itu, kondisi berikut harus dipenuhi:
a_x^2 + a_y^2 <= 100,
yang berarti bahwa akselerasi ke segala arah harus di bawah atau sama dengan 10
.
Untuk melihat cara kerjanya lihat gambar berikut ( sumber ):
Sebagai contoh: Mulai dari (120,180)
Anda berakselerasi dengan 8
arah x dan arah -6
y. Untuk langkah selanjutnya ini adalah kecepatan Anda di mana Anda menambahkan akselerasi Anda (10,0)
untuk mendapatkan (secara fisik benar) gerakan Anda selanjutnya (ke titik (146,168)
. Gerakan yang dihasilkan adalah yang terpenting dalam memeriksa apakah Anda menyentuh salah satu dinding. Pada langkah berikutnya Anda kembali menambahkan vektor percepatan berikutnya ke kecepatan Anda saat ini untuk mendapatkan gerakan berikutnya dan seterusnya. Jadi pada setiap langkah mobil Anda memiliki posisi dan kecepatan. (Dalam gambar ilustrasi di atas panah biru adalah untuk kecepatan, panah oranye untuk akselerasi dan panah merah gelap untuk gerakan yang dihasilkan.)
Sebagai kondisi tambahan Anda harus memiliki (0,0)
kecepatan terminal ketika Anda berada di titik akhir (320,220)
.
Keluaran harus berupa daftar vektor percepatan dalam bentuk yang disebutkan di atas.
Pemenangnya adalah orang yang menyediakan program yang menemukan solusi dengan vektor percepatan paling sedikit.
Tiebreak
Selain itu akan lebih bagus jika Anda dapat menunjukkan bahwa ini adalah solusi optimal dan apakah ini satu-satunya solusi optimal atau apakah ada beberapa solusi optimal (dan mana mereka).
Akan lebih baik jika Anda bisa memberikan garis besar umum tentang bagaimana algoritma Anda bekerja dan mengomentari kodenya sehingga kami dapat memahaminya.
Saya memiliki program yang memeriksa apakah solusi yang diberikan valid dan saya akan memberikan umpan balik.
Tambahan
Anda dapat menggunakan bahasa pemrograman apa pun tetapi saya akan sangat senang jika seseorang menggunakan R karena saya sering menggunakannya dalam pekerjaan saya dan entah bagaimana terbiasa dengannya :-)
Tambahan II
Untuk pertama kalinya saya memulai hadiah - semoga ini adalah bola yang bergulir (atau lebih baik: dapatkan mobilnya mengemudi :-)
print "(10,42)\n(62,64)..."
?Jawaban:
Python, 24 langkah (sedang berlangsung)
Idenya adalah untuk memecahkan masalah berkelanjutan pertama, sangat mengurangi ruang pencarian, dan kemudian mengukur hasilnya ke grid (dengan hanya membulatkan ke gridpoint terdekat dan mencari 8 kotak di sekitarnya)
Saya parametrize jalan sebagai jumlah fungsi trigonometrik (tidak seperti polinomial, mereka tidak berbeda dan lebih mudah untuk tetap di cek). Saya juga mengontrol kecepatan secara langsung daripada akselerasi, karena lebih mudah untuk menegakkan kondisi batas dengan hanya mengalikan fungsi pembobotan yang cenderung 0 pada akhirnya.
Fungsi obyektif saya terdiri dari
skor -eksponensial untuk akselerasi>
skor 10 -polynomial untuk jarak euclidean antara titik terakhir dan target
- skor konstan tinggi untuk setiap persimpangan dengan dinding, menurun ke arah tepi dinding
Untuk meminimalkan skor, saya membuang semuanya ke dalam optimasi Nelder-Mead dan tunggu beberapa detik. Algoritme selalu berhasil mencapai akhir, berhenti di sana dan tidak melebihi percepatan maksimum, tetapi memiliki masalah dengan dinding. Jalur tersebut dapat diteleportasi melalui sudut-sudut dan terjebak di sana, atau berhenti di sebelah dinding dengan tujuan tepat di seberang (gambar kiri)
Selama pengujian, saya beruntung dan menemukan jalur yang dililit dengan cara yang menjanjikan (gambar kanan) dan setelah mengubah parameter lagi saya bisa menggunakannya sebagai tebakan awal untuk optimasi yang sukses.
Kuantisasi
Setelah menemukan lintasan parametrik, tiba saatnya untuk menghapus titik desimal. Melihat lingkungan 3x3 mengurangi ruang pencarian dari sekitar 300 ^ N menjadi 9 ^ N, tetapi masih terlalu besar dan membosankan untuk diterapkan. Sebelum saya menyusuri jalan ini, saya mencoba menambahkan istilah "Snap to Grid" ke fungsi objektif (bagian komentar). Seratus langkah lagi pengoptimalan dengan tujuan yang diperbarui dan hanya pembulatan sudah cukup untuk mendapatkan solusi.
Jumlah langkah telah diperbaiki dan bukan bagian dari optimasi, tetapi karena kami memiliki deskripsi analitis jalur, (dan karena akselerasi maksimal jauh di bawah 10), kami dapat menggunakannya kembali sebagai titik awal untuk optimasi lebih lanjut dengan jumlah yang lebih kecil dari timesteps
Aktivitas: GUI yang memungkinkan Anda menggambar jalur awal untuk mendapatkan arah yang kasar. Apa pun lebih baik daripada pengambilan sampel acak dari ruang 14 dimensi
sumber