UWAGA: To wyzwanie jest obecnie martwe, ponieważ nie mogę zainstalować języków potrzebnych do uruchomienia meczu. Jeśli ktoś ma czas i zainteresowanie, aby to zrobić, nie mam nic przeciwko.
Tabela wyników znajduje się na dole ogłoszenia.
Jest to pół-kooperacyjne wyzwanie króla wzgórza, w którym boty konstruują ścieżki poprzez dwuwymiarowy wykres siatki. Wygrywa bot, który kontroluje węzły o największym ruchu. Jednak zbudowanie ścieżki łączącej wymaga więcej niż jednego bota, więc boty będą musiały współpracować - do pewnego stopnia.
Rozgrywka
Poniżej niech N > 0
będzie liczba botów w grze.
Siatka
Gra rozgrywana jest na dwuwymiarowej siatce liczb całkowitych wielkości , której współrzędna u dołu po lewej znajduje się . Każdej współrzędnej z ma wychodzące krawędzie do trzech współrzędnych , i nad nim, przy czym -coordinates pochodzą modulo . Oznacza to, że siatka owija się wokół krawędzi wschodniej i zachodniej. Każda dolna współrzędna jest źródłem , a każda górna współrzędna jest zlewem .⌊4/3N2⌋ × ⌊4/3N2⌋
(0,0)
(x,y)
0 ≤ y < ⌊4/3N2⌋-1
(x-1,y+1)
(x,y+1)
(x+1,y+1)
x
⌊4/3N2⌋
(x,0)
(x,⌊4/3N2⌋-1)
Poniższy obrazek pokazuje 8 × 8
siatkę.
Każdy wierzchołek wykresu jest nieaktywny , aktywny lub uszkodzony . Wszystkie wierzchołki zaczynają być nieaktywne i mogą być aktywowane przez boty, które będą ich właścicielami. Ponadto boty mogą łamać wierzchołki i nie można ich naprawić.
Kolejność
Tura składa się z fazy zniszczenia i fazy aktywacji . W fazie niszczenia każdy bot może złamać jeden nieaktywny wierzchołek. Ten wierzchołek jest odtąd łamany i nikt nie może go aktywować. W fazie aktywacji każdy bot może aktywować jeden nieaktywny wierzchołek. Od tego czasu są właścicielami tego wierzchołka i nikt inny nie może go reaktywować. Kilka botów może posiadać jeden wierzchołek, jeśli wszystkie aktywują go w tej samej turze. W każdej fazie wyboru wierzchołków dokonuje się jednocześnie.
Punktacja
Jedna runda wystarcza na dokładnie zakręty. Następnie rundę ocenia się w następujący sposób. Z każdego aktywnego wierzchołka źródłowego przeprowadzamy losowe wyszukiwanie w pierwszej kolejności głębokości wzdłuż aktywnych wierzchołków (co oznacza, że dzieci każdego wierzchołka są odwiedzane w losowej kolejności). Jeśli ścieżka zostanie znaleziona od źródła do jakiegoś ujścia, wówczas dla wszystkich wierzchołków wzdłuż tej ścieżki każdy właściciel wierzchołka otrzymuje jeden punkt.N2
N
Cała gra trwa 100 rund, a zwycięzcą jest bot z największą liczbą punktów. Mogę zwiększyć tę liczbę, jeśli wariancja wyników jest zbyt wysoka.
Dodatkowe zasady
- Bez bałaganu ze sterownikiem lub innymi zgłoszeniami.
- Maksymalnie jedno zgłoszenie na uczestnika.
- Żadne zasoby zewnętrzne, z wyjątkiem jednego prywatnego pliku tekstowego, zostały wyczyszczone na początku gry.
- Nie projektuj swojego bota do pokonania lub wspierania określonych przeciwników.
- Podaj polecenia, aby skompilować i uruchomić bota. Każdy kompilator / interpreter, który jest swobodnie dostępny dla systemu Debian Linux, jest dopuszczalny.
Kontroler
Kontroler jest napisany w Pythonie 3 i można go znaleźć w GitHub . Szczegółowe instrukcje znajdują się w pliku README. Oto interfejs API na początek:
- Boty są uruchamiane na początku każdej rundy i trwają do końca rundy. Komunikuj się ze sterownikiem przez STDIN i STDOUT, używając komunikatów zakończonych znakiem nowej linii.
BEGIN [num-of-bots] [num-of-turns] [side-length]
jest wprowadzany na początku.DESTROY [turn]
jest wprowadzany na początku każdej fazy niszczenia. Twój bot odpowie alboVERTEX x,y
wybierając wierzchołek, alboNONE
.BROKEN [turn] [your-choice] [other-choices]
jest wprowadzany na końcu każdej fazy niszczenia. Kolejność innych botów jest losowa na początku każdej gry, ale pozostaje ustalona podczas jej trwania. Wybory są przedstawione jakox,y
lubN
.ACTIVATE [turn]
iOWNED [turn] [your-choice] [other-choices]
są odpowiednikami powyższego dla fazy aktywacji i mają tę samą semantykę.SCORE [your-score] [other-scores]
jest wprowadzany na końcu gry.- Twój bot ma 1 sekundę na przeanalizowanie wyników fazy i wybranie następnego wierzchołka oraz 1 sekundę na zakończenie po otrzymaniu wyniku. Przetestuję zgłoszenia na moim stosunkowo starym laptopie, więc lepiej zostawić tutaj margines.
Pamiętaj, aby opróżnić bufor wyjściowy. W przeciwnym razie kontroler może zawiesić się w niektórych środowiskach.
Tabela liderów
Zaktualizowano 3/13/2015
Peacemaker jest uruchomiony i Funnelweb również otrzymał aktualizację. Wyniki podskoczyły o rząd wielkości. Złącze przekroczyło limit czasu w dwóch grach.
Funnelweb: 30911
Connector: 18431
Watermelon: 3488
Annoyance: 1552
Explorer: 735
Checkpoint: 720
Random Builder: 535
FaucetBot: 236
Peacemaker: 80
Pełny dziennik z grafiką artystyczną ASCII można znaleźć w repozytorium kontrolera, w graphical_log.txt
.
Niektóre spostrzeżenia:
- Złącze można bardzo łatwo zatrzymać, przerywając pojedynczy wierzchołek przed nim. Podejrzewam, że często to robi. Jednak obecnie nie ma to większego sensu, ponieważ tylko Łącznik może sobie wyobrazić ścieżkę.
- Arbuz może uzyskać przyzwoity wynik, po prostu będąc na ścieżce łączącej (ponieważ DFS najprawdopodobniej użyje swoich wierzchołków).
- Explorer lubi uprawiać winorośl z arbuzów.
- Zaktualizowana Funnelweb otrzymuje naprawdę dobre wyniki, ponieważ Connector zwykle zaczepia się na nią w dolnej połowie siatki.
- Gry stają się dość długie, średnia runda trwa na moim komputerze około 25 sekund.
4/3*N^2
, a nawet tam boty miały problemy z tworzeniem prawidłowych ścieżek. Jednak Connector został tymczasowo zdyskwalifikowany z powodu błędu, a teraz, gdy został naprawiony, spodziewam się, że gry będą bardziej interesujące. Dziś wieczorem wypuszczę kolejną partię.Odpowiedzi:
Złącze (Java)
Próbuje utworzyć ścieżkę w losowej pozycji. Ponieważ nie może samodzielnie utworzyć ścieżki, szuka aktywnych komórek i używa ich. Podziękowania należą się Geobitom, od których ukradłem trochę kodu. To przesłanie jeszcze się nie zakończyło, ponieważ po prostu przestaje robić wszystko, jak tylko ścieżka zostanie zbudowana.
Edycja: Jeśli ścieżka jest zbudowana, Łącznik próbuje utworzyć wiele ścieżek wzdłuż istniejącej.
źródło
java.lang.ArrayIndexOutOfBoundsException: -1 at Connector.findExtendingPathPoint(Connector.java:166)
.Funnelweb, Python 2
wersja 1.2 - Lepszy kod dołączania, dodano nową animację
Nazwany na cześć jednego z mniej przyjaznych pająków w Australii. Ten bot najpierw buduje gniazdo w kształcie lejka w górnych rzędach, a następnie wabi inne boty do budowania ścieżek dla ruchu do gniazda.
Oto nowa animacja gry 6 botów na planszy 4 / 3N ^ 2 przedstawiająca sieć funnelweb i kilka prostszych botów:
Kod Pythona funnelweb:
Pająk biegnie z
python funnelweb.py
.źródło
Checkpoint, Java
Ten bot próbuje utworzyć punkty kontrolne, aby każda ważna ścieżka przechodziła przez jeden z moich wierzchołków. Ponieważ są N 2 zwoje, a plansza ma 2N 2 w poprzek, mogę aktywować / łamać każdy węzeł na jednej poziomej linii (zakładając, że jestem tam pierwszy). Zrób to na przemian (
x
jest zepsuty,o
jest mój):Jeśli chcesz stworzyć ścieżkę, musisz przejść przez moje punkty kontrolne :)
Teraz może napotkać kilka problemów. Po pierwsze, nie będzie dobrze, jeśli nie będzie wielu ścieżek. Ponieważ sam nie tworzy żadnych produktywnych ścieżek, naprawdę jest całkowicie zależny od konkurencji. Nawet kilku konkurentów łączących się, by stworzyć jedną ścieżkę, niewiele pomoże, ponieważ zdobywa tylko jedno miejsce za każdą znalezioną ścieżkę. To, czego potrzebuje, by zabłysnąć, to prawdopodobnie sporo botów tworzących całkiem różne ścieżki. Nawet wtedy może nie być bardzo wysoko, ale to był pomysł, który miałem na czacie, więc ...
Jeśli jedno z miejsc na linii jest już zablokowane / zajęte, po prostu szukam najbliższego miejsca, z którego mogę skorzystać (najlepiej na tej samej
x
linii, tylko przesunięty w pionie).Aby skompilować, to jest
javac Checkpoint.java
. Aby uruchomić,java Checkpoint
. Będziesz chciał dodać / zmienić ścieżkę, aby odzwierciedlała gdziekolwiek się znajduje.źródło
Arbuz, Java
Próby narysowania arbuzów na siatce.
źródło
FaucetBot (in R)
Tworzy wąskie gardło w drugiej linii i aktywuje węzły na ścieżce za nim.
Gdybym nie spieprzył, końcowa konfiguracja powinna wyglądać następująco:
Dowództwo jest
Rscript FaucetBot.R
.źródło
Peacemaker, Java
Na podstawie kodu Manu.
Strefy konfliktu w wyszukiwaniu pokoju (tj. Większość ZŁAMANEGO lub AKTYWNEGO skupienia wierzchołków) i aktywuje losowy wierzchołek w pobliżu.
źródło
while
pętliactivate
metody. Zatrzymujesz wyszukiwanie, gdy znajdziesz wierzchołek, który nie jest twój i nie jest uszkodzony - ale może być własnością innej osoby, więc nie możesz go aktywować.Random Builder, Python 3
To głupi przykładowy bot, który nigdy niczego nie niszczy i próbuje aktywować losowy wierzchołek co turę. Zauważ, że nie trzeba sprawdzać, czy wierzchołek jest nieaktywny; kontroler dba o to.
Uruchom za pomocą polecenia
Konieczne może być zastąpienie
python3
,python
zależnie od instalacji Pythona. Aby to zrobić, po prostu edytujbots.txt
plik. Zaktualizowałem kontroler i nie trzeba już bałaganić ścieżek plików.źródło
sys.stdout.flush()
ciebie możesz po prostu zrobićflush=True
jako argumentprint
.Explorer, Python 3
Strategia aktywacji:
Tworzy mapę cieplną na podstawie stanu każdego węzła (aktywny / nieaktywny / uszkodzony) i wybiera węzeł, który miałby największą oczekiwaną wartość mapy cieplnej na osobę, gdyby wybrał ten.
Strategia zniszczenia:
Nigdy niczego nie niszczy, ponieważ niewiele to pomaga botowi.
źródło
Irytacja, Bash
Próbowałem sprawić, by wynik wyglądał bardziej interesująco.
Uruchom z
bash annoyance.sh
.źródło
Middle Man
Widziałem, że niektóre boty budowane są z góry, a niektóre z dołu. To pierwszy (jak sądzę) początek w środku i praca w górę iw dół.
(nie jest testowany ze sterownikiem, więc jeśli to nie działa, daj mi znać.)
źródło