Diberikan daftar poin, temukan jalur terpendek yang mengunjungi semua titik dan kembali ke titik awal.
Masalah Travelling Salesman terkenal di bidang ilmu komputer, seperti banyak cara untuk menghitung / memperkirakannya. Sudah dipecahkan untuk kelompok poin yang sangat besar, tetapi beberapa yang terbesar membutuhkan banyak CPU-tahun untuk menyelesaikannya.
Jangan sampai terbakar oleh kentang.
Hot Potato adalah gim di mana 2+ pemain mengedarkan "kentang" dalam lingkaran sambil memainkan musik. Tujuannya adalah untuk meneruskannya ke pemain berikutnya dengan cepat. Jika Anda memegang kentang saat musik berhenti, Anda keluar.
Objek dari Penjual Kentang Panas adalah:
Dengan seperangkat 100 poin unik , kembalikan poin-poin itu dalam urutan yang lebih baik ( jarak total lebih pendek seperti yang didefinisikan lebih jauh ke bawah ). Ini akan "meneruskan" masalahnya ke pemain berikutnya. Mereka harus meningkatkan dan meneruskannya ke yang lain, dll. Jika seorang pemain tidak dapat meningkatkannya, mereka keluar dan bermain terus sampai satu pemain tersisa.
Agar ini tidak menjadi kompetisi "brute-force-me-a-path", ada ketentuan berikut:
Anda tidak dapat mengambil lebih dari satu menit untuk melewatkan kentang. Jika Anda belum menemukan dan memberikan solusi yang lebih singkat saat satu menit berlalu, Anda keluar.
Anda tidak dapat mengubah posisi lebih dari 25 poin. Tepatnya,
>= 75
poin harus berada di posisi yang sama dengan yang Anda terima. Tidak masalah mana yang Anda putuskan untuk diubah, hanya jumlah yang Anda ubah.
Ketika hanya satu pemain yang tersisa, dia adalah pemenang dari permainan itu, dan menerima satu poin. Turnamen terdiri dari 5*n
permainan, di mana n
jumlah pemain. Setiap permainan, pemain awal akan diputar , dan urutan pemain yang tersisa akan diacak . Pemain dengan poin terbanyak di akhir adalah pemenang pertandingan. Jika pertandingan berakhir dengan dasi untuk tempat pertama, pertandingan baru akan dimainkan hanya dengan para kontestan. Ini akan berlanjut sampai tidak ada dasi.
Pemain pemula untuk setiap permainan akan menerima satu set poin pseudorandomly yang dipilih tanpa urutan tertentu.
Poin didefinisikan sebagai pasangan x,y
koordinat bilangan bulat pada kisi kartesius. Jarak diukur dengan menggunakan Manhattan jarak , |x1-x2| + |y1-y2|
. Semua koordinat akan terletak pada [0..199]
kisaran.
Memasukkan
Input diberikan dengan argumen string tunggal. Ini akan terdiri dari 201 bilangan bulat yang dipisahkan koma yang mewakili jumlah pemain saat ini ( m
) dan 100 poin:
m,x0,y0,x1,y1,x2,y2,...,x99,y99
Urutan titik-titik ini adalah jalur saat ini. Total jarak diperoleh dengan menambahkan jarak dari setiap titik ke titik berikutnya ( dist(0,1) + dist(1,2) + ... + dist(99,0)
). Jangan lupa untuk kembali memulai ketika menghitung jarak total!
Perhatikan bahwa m
ini bukan jumlah pemain yang memulai pertandingan, itu adalah jumlah yang masih dalam.
Keluaran
Output diberikan dengan cara yang sama seperti input, minus m
; string tunggal berisi bilangan bulat yang dipisahkan koma yang mewakili titik dalam orde baru mereka.
x0,y0,x1,y1,x2,y2,...,x99,y99
Program kontrol akan menunggu output hanya untuk satu menit. Ketika output diterima, itu akan memverifikasi bahwa:
- output terbentuk dengan baik
- output hanya terdiri dari dan semua 100 poin hadir dalam input
>=75
poin ada di posisi semula- panjang lintasan lebih kecil dari lintasan sebelumnya
Jika salah satu dari cek ini gagal (atau tidak ada output), Anda keluar dan permainan akan berlanjut ke pemain berikutnya.
Program Kontrol
Anda dapat menemukan program kontrol di tautan ini . Program kontrol itu sendiri bersifat deterministik, dan diposting dengan benih dummy 1
. Benih yang digunakan selama penilaian akan berbeda, jadi jangan repot-repot mencoba menganalisis daftar urutan belokan / titik yang dikeluarkannya.
Kelas utamanya adalah Tourney
. Menjalankan ini akan melakukan turnamen penuh dengan kontestan yang diberikan sebagai argumen. Itu memuntahkan pemenang dari setiap pertandingan dan penghitungan di akhir. Contoh pertandingan dengan dua SwapBots terlihat seperti:
Starting tournament with seed 1
(0) SwapBot wins a game! Current score: 1
(1) SwapBot wins a game! Current score: 1
(1) SwapBot wins a game! Current score: 2
(1) SwapBot wins a game! Current score: 3
(0) SwapBot wins a game! Current score: 2
(1) SwapBot wins a game! Current score: 4
(1) SwapBot wins a game! Current score: 5
(1) SwapBot wins a game! Current score: 6
(1) SwapBot wins a game! Current score: 7
(1) SwapBot wins a game! Current score: 8
Final Results:
Wins Contestant
2 (0) SwapBot
8 (1) SwapBot
Jika Anda ingin menguji hanya satu game pada satu waktu, Anda dapat menjalankan Game
kelas sebagai gantinya. Ini akan menjalankan satu game dengan pemain dalam urutan yang diberikan sebagai argumen. Secara default, itu juga akan mencetak play-by-play yang menunjukkan pemain saat ini dan panjang lintasan.
Juga termasuk beberapa pemain tes: SwapBot
, BlockPermuter
, dan TwoSwapBot
. Dua yang pertama tidak akan dimasukkan dalam penilaian berjalan, jadi jangan ragu untuk menggunakan dan menyalahgunakannya selama pengujian. TwoSwapBot
akan dimasukkan dalam penilaian, dan dia tidak bungkuk, jadi bawalah A-game Anda.
Varia
Anda tidak dapat menyimpan informasi status, dan setiap belokan adalah program terpisah dari program Anda. Satu-satunya informasi yang akan Anda terima setiap belokan adalah serangkaian poin.
Anda tidak dapat menggunakan sumber daya eksternal. Ini termasuk panggilan jaringan dan akses file.
Anda tidak dapat menggunakan fungsi pustaka yang dirancang untuk memecahkan / membantu dengan masalah TSP atau variannya.
Anda tidak dapat memanipulasi atau mengganggu pemain lain dengan cara apa pun.
Anda tidak dapat memanipulasi atau mengganggu program kontrol atau kelas atau file yang disertakan dengan cara apa pun.
Multi-threading diizinkan.
Satu pengiriman per pengguna. Jika Anda mengirim lebih dari satu entri, saya hanya akan memasukkan entri pertama yang dikirimkan. Jika Anda ingin mengubah kiriman Anda, edit / hapus yang asli.
Turnamen akan berjalan di Ubuntu 13.04, di komputer dengan CPU i7-3770K dan RAM 16GB. Itu tidak akan dijalankan di VM. Apa pun yang saya anggap berbahaya akan segera mendiskualifikasi entri saat ini dan di masa mendatang yang Anda kirimkan.
Semua entri harus dapat dijalankan dari baris perintah dengan perangkat lunak gratis ( seperti bir ). Jika saya memiliki masalah dalam mengkompilasi / menjalankan entri Anda, saya akan meminta bantuan dalam komentar. Jika Anda tidak merespons atau pada akhirnya saya tidak dapat menjalankannya, itu akan didiskualifikasi.
Hasil (22 Mei 2014)
Hasil baru ada di! UntangleBot telah mengalahkan kompetisi dengan cukup baik. TwoSwapBot berhasil tujuh kemenangan, dan SANNbot menyelipkan kemenangan juga. Ini papan skor, dan tautan ke output mentah :
Wins Contestant
22 (2) ./UntangleBot
7 (0) TwoSwapBot
1 (5) SANNbot.R
0 (1) BozoBot
0 (3) Threader
0 (4) DivideAndConquer
Seperti sekarang , UntangleBot telah memenangkan tanda centang. Namun, jangan biarkan hal itu menghalangi Anda untuk masuk, karena saya akan menjalankan turnamen karena semakin banyak kontestan muncul dan ubah jawaban yang diterima.