Bir nokta listesi göz önüne alındığında, tüm noktaları ziyaret eden ve başlangıç noktasına geri dönen en kısa yolu bulun.
Gezgin satıcı problemi olarak / hesaplamak bunu yaklaşmak için birçok yol vardır, bilgisayar bilimi alanında iyi bilinmektedir. Çok büyük nokta grupları için çözüldü, ancak en büyüğünün bazılarının işlemciliği yıllarca alması gerekiyor.
Patates tarafından yakılma.
Sıcak Patates , müzik çalarken 2+ oyuncunun bir dairenin etrafında bir "patates" geçtiği bir oyundur. Amaç hızlıca bir sonraki oyuncuya aktarmaktır. Müzik durduğunda patatesi tutuyorsanız, dışarı çıkarsınız.
Amacı, sıcak Patates Salesman olduğu:
100 benzersiz nokta kümesi göz önüne alındığında , bu noktaları daha iyi bir sırayla döndürün ( aşağı doğru tanımlandığı gibi daha kısa toplam mesafe ). Bu, sorunu bir sonraki oyuncuya "iletir". Geliştirmeleri ve diğerine geçirmeleri vb. Gerekir. Bir oyuncu iyileştiremezse, dışarı çıkar ve bir oyuncu kalana kadar oynamaya devam eder.
Bunun bir “kaba-güç-beni-bir-yol” yarışması olmasını engellemek için şu şartlar var:
Patatesi geçmek için bir dakikadan fazla zaman geçiremezsiniz. Bir dakika doluncaya kadar daha kısa bir çözüm bulamadıysanız ve geçmediyseniz, çıkardınız.
25 noktadan fazla konumunu değiştiremezsiniz . Kesin olarak
>= 75
puanlar, aldıklarınızla aynı konumda olmalıdır. Hangisini değiştirmeye karar verdiğiniz önemli değil , yalnızca değiştirdiğiniz tutar .
Sadece bir oyuncu kaldığında, o oyunun galibi olur ve bir puan alır. Turnuva , oyuncu sayısının 5*n
bulunduğu oyunlardan oluşur n
. Her oyun, başlangıç oyuncusu döndürülecek ve kalan oyuncu sırası karıştırılacaktır . Sonunda en yüksek puana sahip oyuncu turnuvayı kazanır. Turnuva ilk etapta bir kravatla sona ererse, yalnızca bu yarışmacılarla yeni bir turnuva oynanacaktır. Bu, kravat yok olana kadar devam edecek.
Her oyun için başlangıç oyuncusu, belirli bir düzende olmayan bir takım sahte seçili puan alır.
Noktalar, x,y
kartezyen ızgara üzerinde bir çift tam sayı koordinatı olarak tanımlanır . Mesafe kullanılarak ölçülür Manhattan mesafe , |x1-x2| + |y1-y2|
. Tüm koordinatlar [0..199]
aralıkta yer alacaktır .
Giriş
Giriş, tek bir dize argümanı ile verilir. Mevcut oyuncu sayısını ( m
) ve 100 puanı temsil eden 201 virgülle ayrılmış tam sayıdan oluşacaktır :
m,x0,y0,x1,y1,x2,y2,...,x99,y99
Bu noktaların sırası, geçerli yoldur. Toplam mesafe, her noktadan diğerine uzaklık eklenerek elde edilir ( dist(0,1) + dist(1,2) + ... + dist(99,0)
). Toplam mesafeyi hesaplarken başlamaya geri dönmeyi unutmayın!
Not m
olduğu değil oyun başladıktan oyuncu sayısı, bu hala bir sayıdır.
Çıktı
Çıktı, giriş eksi ile aynı şekilde verilir m
; noktaları yeni sıralarında temsil eden virgülle ayrılmış tam sayıları içeren tek bir dize.
x0,y0,x1,y1,x2,y2,...,x99,y99
Kontrol programı yalnızca bir dakika çıktısını bekleyecektir. Çıktı alındığında, şunu doğrulayacaktır:
- çıktı iyi şekillendirilmiş
- çıkış sadece ve girişte mevcut olan tüm 100 noktadan oluşur.
>=75
puanlar orijinal konumlarındadır- yol uzunluğu önceki yoldan daha az
Bu kontrollerden herhangi biri başarısız olursa (veya herhangi bir çıktı yoksa), siz yok sayılırsınız ve oyun bir sonraki oyuncuya geçer.
Kontrol programı
Kontrol programını bu linkte bulabilirsiniz . Kontrol programının kendisi belirleyicidir ve kukla bir tohum ile birlikte gönderilir 1
. Puanlama sırasında kullanılan tohumlar farklı olacaktır, bu yüzden tükettiği sıra sıralarını / nokta listelerini analiz etmeye çalışmaktan rahatsız olmayın.
Ana sınıftır Tourney
. Bunu yapmak, yarışmacıların argüman olarak verilmiş olduğu turnuvaya katılacak. Her oyunun kazananı ve sonunda bir taksitli tükürür. İki SwapBots içeren örnek turnuvaya benziyor:
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
Bir seferde sadece bir oyun test etmek istiyorsanız, Game
bunun yerine sınıfı çalıştırabilirsiniz . Bu, argüman olarak verilen sırayla oyuncularla bir oyun oynayacaktır. Varsayılan olarak, geçerli oynatıcıyı ve yol uzunluğunu gösteren bir oyun oynatma da basar.
Ayrıca dahil birkaç deneme oyuncular şunlardır: SwapBot
, BlockPermuter
ve TwoSwapBot
. İlk ikisi puanlama çalışmalarına dahil edilmeyecek, test sırasında bunları kullanmaktan ve kötüye kullanmaktan çekinmeyin. Yargılamaya dahil TwoSwapBot
olacak ve o huysuz değil, bu yüzden A oyununu getir.
derleme
Durum bilgilerini kaydedemezsiniz ve her bir dönüş programınızın ayrı bir çalışmasıdır. Her bir dönüş alacağınız tek bilgi puan setidir.
Dış kaynakları kullanamazsınız. Buna şebeke aramaları ve dosya erişimi de dahildir.
TSP problemini veya varyantlarını çözmek / yardımcı olmak için tasarlanmış kütüphane fonksiyonlarını kullanamazsınız.
Diğer oyuncularla hiçbir şekilde manipülasyon yapamaz veya bunlara müdahale edemezsiniz.
Kontrol programını veya içerdiği sınıfları veya dosyaları herhangi bir şekilde manipüle edemez veya müdahale edemezsiniz.
Çok diş açmaya izin verilir.
Kullanıcı başına bir başvuru. Birden fazla giriş yaparsanız, sadece gönderilen ilk girişi girerim. Gönderinizi değiştirmek istiyorsanız, orijinali düzenleyin / silin.
Turnuva 13.04 Ubuntu'da, i7-3770K CPU ve 16GB RAM'e sahip bir bilgisayarda yapılacak . Bir VM'de çalıştırılmayacaktır. Kötü niyetli olarak algıladığım her şey mevcut ve gelecekteki girişlerinizi derhal diskalifiye eder .
Tüm girişler komut satırından ücretsiz ( biradaki gibi ) yazılımı ile çalıştırılabilir olmalıdır . Girişinizi derlerken / çalıştırırken sorun yaşarsam yorumlarda yardım isteyeceğim. Cevap vermezseniz ya da sonunda çalıştıramazsam, diskalifiye edilir.
Sonuçlar (22 Mayıs 2014)
Yeni sonuçlar geldi! UntangleBot rekabeti oldukça sağlam bir şekilde yendi. TwoSwapBot yedi kazancı yönetti ve SANNbot da bir zafer kazandı. İşte bir çetele ve ham çıktıya bir link :
Wins Contestant
22 (2) ./UntangleBot
7 (0) TwoSwapBot
1 (5) SANNbot.R
0 (1) BozoBot
0 (3) Threader
0 (4) DivideAndConquer
Haliyle şimdi , UntangleBot onay işaretini kazandı. Ancak turnuvaya katılacağım için daha fazla yarışmacı belirdiği ve kabul edilen cevabı buna göre değiştirdiğim için bunun size girmekten caydırmasına izin vermeyin.