Wskazówka prędkości
Cluedo / Clue to klasyczna gra planszowa z nieodpartym elementem dedukcyjnym. Speed Clue to wariant dla 3-6 graczy, który podkreśla ten element, używając tylko kart. W rezultacie jedyna różnica między standardowym Cluedo i Speed Clue polega na tym, że każdy gracz, który nadal bierze udział w grze, może przedstawić w swojej turze wszelkie sugestie, które mu się podobają, zamiast czekać na dotarcie do określonego pokoju dzięki łasce rzutu kostką i sugestiom innych graczy. Jeśli nigdy wcześniej nie grałeś w Cluedo lub chcesz mieć pewność wyraźnych różnic między obiema wersjami, możesz znaleźć tutaj kompletną regułę Wskazówki prędkości .
Cel
Napisz i prześlij program AI, aby zagrać w Speed Clue przed 15 maja 2014 r. 00:00 GMT. Po tym czasie poprowadzę turniej z wykorzystaniem wszystkich legalnych zgłoszeń. Uczestnik, którego AI wygra najwięcej gier w turnieju, wygrywa wyzwanie.
Specyfikacje AI
Możesz pisać swoją sztuczną inteligencję w prawie każdym wybranym języku, używając dowolnych technik, o ile tylko ściśle używa protokołu aplikacji przez połączenie TCP / IP do grania w gry z serwerem. Szczegółowe objaśnienie wszystkich ograniczeń można znaleźć tutaj .
Jak grać
Zacznij od rozwidlenia repozytorium GitHub konkursu . Dodaj katalog do
entries
katalogu nazwanego przy użyciu nazwy użytkownika StackExchange i opracuj kod w tym folderze. Kiedy będziesz gotowy, aby przesłać zgłoszenie, poproś o wycofanie ze swoimi poprawkami, a następnie postępuj zgodnie z tymi instrukcjami, aby ogłosić swój wpis na tej stronie.
Podałem trochę kodu i plików JAR w core
katalogu na początek; zapoznaj się z moją witryną, aby uzyskać przybliżony przewodnik po materiałach. Ponadto inni gracze przesyłają kod pomocnika oprócz swoich wpisów, aby pomóc ci rozpocząć pracę. Poświęć trochę czasu na zapoznanie się z wpisami i nie zapomnij przetestować wpisu pod kątem wpisów innych przed przesłaniem!
Wyniki
Place | User | AI | Result
------+--------------+--------------------+-------------------------------------------------------
1 | gamecoder | SpockAI | 55.75%
2 | Peter Taylor | InferencePlayer | 33.06%
3 | jwg | CluePaddle | 20.19%
4 | Peter Taylor | SimpleCluedoPlayer | 8.34%
5 | gamecoder | RandomPlayer | 1.71%
---- | ray | 01 | Player "ray-01" [3] sent an invalid accuse message: ""
Powyższe wyniki pokazują procent wygranych, które każda zakwalifikowana AI miała z 25 200 ważnych meczów, w których uczestniczyła. W sumie było 30 000 meczów, które wliczały się do wyników, i 6100 lub więcej, które zostały zdyskontowane, gdy 01
zostały zdyskwalifikowane.
Wyróżnienie musi znaleźć się w 01
AI ray . Moje początkowe testy wykazały, że był najsilniejszy i spodziewałem się, że wygra konkurencję. Wydaje się jednak, że ma bardzo sporadyczny błąd, który, o ile mogę się domyślić, prowadzi go do wyeliminowania wszystkich możliwych rozwiązań. Turniej zakończył wszystkie trzyosobowe mecze i rozpoczął czteroosobowe mecze (12 000 meczów w!), Kiedy 01
wykryto błąd. Jeśli wezmę pod uwagę tylko wyniki trzech graczy, wyniki wyglądają następująco:
Place | User | AI | Result
------+--------------+--------------------+--------
1 | ray | 01 | 72.10%
2 | gamecoder | SpockAI | 51.28%
3 | Peter Taylor | InferencePlayer | 39.97%
4 | Peter Taylor | SimpleCluedoPlayer | 17.65%
5 | jwg | CluePaddle | 16.92%
6 | gamecoder | RandomPlayer | 2.08%
Planowałem przeprowadzić eksplorację danych dotyczących wyników, ale jestem wyczerpany. Miałem trudności techniczne z uruchomieniem konkurencji przez cały czas (awarie zasilania, ponowne uruchomienie systemu), co wymagało całkowitego przepisania serwera konkursowego w celu zapisania jego postępu. Skomentuję i zatwierdzę wszystkie zmiany w kodzie ze wszystkimi plikami wyników, które zostały wygenerowane na wypadek, gdyby ktoś był nadal zainteresowany. Jeśli zdecyduję się również na eksplorację danych, moje wyniki zostaną również dodane do repozytorium.
Dzięki za grę!
źródło
you must accept two port numbers: the first will be the port to which your program will listen, and the second will be the port to which your program will send.
, Dlaczego dwa porty?Odpowiedzi:
AI01 - Python 3
Nie mogę jeszcze znaleźć dla niego lepszej nazwy :-P.
Identyfikator : ray-ai01
Technologia : Python 3
Wybrane : tak
Argumenty :
ai01.py identifier port
Opis : Praca przez wnioskowanie. Kiedy liczba kart, których właściciel nie jest znany, jest mniejsza niż próg, AI zaczyna eliminować wszystkie niemożliwe rozwiązania poprzez rekurencyjne globalne wnioskowanie. W przeciwnym razie używa wnioskowania lokalnego.
Kod AI można znaleźć tutaj .
źródło
SpockAI
. Działa całkiem dobrze przeciwko01
. Nie wiem, czy wygra konkurencję, ale cieszę się, że Twoja wygrana została zmniejszona; )SimpleCluedoPlayer.java
Ta klasa używa
AbstractCluedoPlayer
, która obsługuje wszystkie operacje we / wy i pozwala logice pracować z prostym typem interfejsu. Cała sprawa jest na githubie .To z dużym prawdopodobieństwem pokonuje losowego gracza (w najgorszym przypadku potrzeba 15 sugestii, podczas gdy losowy gracz przyjmuje średnio 162), ale łatwo go pokonać. Oferuję to, aby piłka się toczyła.
źródło
SpockAI
Identyfikator:
gamecoder-SpockAI
Wpis repo: kliknij tutaj
Wybrane: tak
Technologia: Java 7 oparta na
com.sadakatsu.clue.jar
Argumenty:
{identifier} portNumber [logOutput: true|false]
Opis:
SpockAI
jest graczem Speed Clue opartym na klasieKnowledge
, którą napisałem. TheKnowledge
Klasa reprezentuje wszystkie możliwe stany, że gra może być podane co działo się do tej pory. Reprezentuje rozwiązania gry i możliwe ręce graczy jako zestawy i wykorzystuje iteracyjne dedukcje, aby zredukować te zestawy tak dalece, jak to możliwe, za każdym razem, gdy coś się uczy.SpockAI
używa tej klasy do ustalenia, które sugestie mają zapewnić najbardziej pomocne wyniki w najgorszym przypadku, i losowo wybiera jedną z tych sugestii na swoją kolej. Kiedy musi obalić sugestię, próbuje albo pokazać kartę, która już pokazała sugerującą sztuczną inteligencję, albo pokazać kartę z kategorii, dla której ograniczył najmniej możliwości. Robi oskarżenie tylko wtedy, gdy zna rozwiązanie.Heurystyka, której użyłem do ustalenia najlepszej sugestii, jest następująca. Po wyciągnięciu wszystkich informacji z sugestii, możliwe rozwiązanie i możliwe zestawy kart gracza zostaną zmniejszone (chyba że sugestia nie ujawni żadnych nowych informacji). Teoretycznie najlepszą sugestią jest ta, która najbardziej zmniejsza liczbę możliwych rozwiązań. W przypadku remisu zakładam, że lepsza jest sugestia, która najbardziej zmniejsza liczbę możliwych rozdań dla graczy. Tak więc dla każdej sugestii próbuję każdego możliwego wyniku, który nie prowadzi do sprzeczności w wiedzy. Zakłada się, że którykolwiek wynik ma najmniejszą poprawę w liczeniu rozwiązań / rozdań, będzie wynikiem sugestii. Następnie porównuję wyniki wszystkich sugestii i wybieram, który z nich ma najlepszy wynik. W ten sposób gwarantuję optymalny zysk w najgorszym przypadku.
Rozważam dodanie analizy kombinacji sił brutalnych możliwych rozwiązań i możliwych rąk gracza
SpockAI
jeszcze silniejszym, ale ponieważSpockAI
jest to już najwolniejszy, najbardziej wymagający zasobów wpis, prawdopodobnie to pominę.Zrzeczenie się:
Zamierzałem wypuścić AI na ten konkurs kilka tygodni temu. W tej chwili nie mogłem zacząć pisać AI aż do piątku w zeszłym tygodniu i ciągle znajdowałem śmieszne błędy w kodzie. Z tego powodu jedynym sposobem, w jaki mogłem zabrać się
SpockAI
do pracy przed upływem terminu, było użycie dużej puli wątków. Efektem końcowym jest to, że (obecnie) SpockAI może osiągnąć + 90% wykorzystanie procesora i 2 GB + użycie pamięci (choć obwiniam za to śmieciarz). Zamierzam wziąć udziałSpockAI
w konkursie, ale jeśli inni uznają, że jest to naruszenie zasad , przyznam tytuł „zwycięzcy” drugiemu miejscu, abySpockAI
wygrać. Jeśli czujesz się w ten sposób, zostaw komentarz do tego efektu na tej odpowiedzi.źródło
InferencePlayer.java
Pełny kod na Github (uwaga: używa tego samego,
AbstractCluedoPlayer
co mój wcześniejSimpleCluedoPlayer
).Prawdziwym rdzeniem tego gracza jest jego
PlayerInformation
klasa (tutaj lekko przycięta):Ujednolica informacje na temat sugestii, których gracz nie odrzucił (wskazując, że nie ma żadnej z tych kart), sugestii, które odrzucił (wskazując, że posiadają przynajmniej jedną z tych kart) oraz kart, których lokalizacja jest pewna. Następnie iteracyjnie stosuje kilka podstawowych zasad, aby zagęścić te informacje w swojej istocie.
Nie sądzę, aby można było uzyskać więcej deterministycznych informacji (z wyjątkiem fałszywych oskarżeń, które, jak zakładam, są zbyt rzadkie, aby się tym przejmować), chociaż mogłem coś przeoczyć. Nie jest potencjał dla bardziej wyrafinowanego odtwarzacza do prawdopodobieństw szacują, że gracz ma karty X Y ...
Innym obszarem, który prawdopodobnie dopuszcza znaczną poprawę, jest podjęcie decyzji, którą sugestię wprowadzić. Próbuję zmaksymalizować zdobywanie informacji przy użyciu dość niezgrabnego podejścia o dużej sile, ale jest wiele źle uzasadnionych heurystów w ocenie względnych zalet wiedzy uzyskanej z różnych hipotetycznych podejrzeń. Nie zamierzam jednak stroić heurystyki, dopóki ktoś inny nie wystawi godnego przeciwnika.
źródło
/tmp
. Powinien to być prosty patch; Zajmę się tym wkrótce.CluePaddle (ClueStick / ClueBat / ClueByFour) - C #
Napisałem ClueBot, klient C #, dla którego łatwo jest zaimplementować AI i różne AI, w tym najpoważniejszą próbę o nazwie CluePaddle. Kod znajduje się na https://github.com/jwg4/SpeedClueContest/tree/clue_paddle z prośbą o ściągnięcie, aby scalić go w górę.
ClueStick to proof-of-concept, który w zasadzie zgaduje i ignoruje większość tego, co się dzieje. ClueBat to kolejna głupia sztuczna inteligencja, z tym wyjątkiem, że próbuje wykorzystać lukę w ClueStick, aby zmusić ją do fałszywych oskarżeń. ClueByFour jest rozsądną sztuczną inteligencją, ponieważ zawiera rozsądne sugestie i zapamiętuje karty, które pokazali inni.
CluePaddle jest najbardziej inteligentny. Próbuje dowiedzieć się, kto ma to, co opiera się nie tylko na tym, jakie zaoferowano odrzucenia, ale także na podstawie tego, którzy gracze nie zaoferowali odrzucenia danej sugestii. Nie bierze pod uwagę liczby kart, które każdy gracz ma w bankomacie, ale należy to naprawić. Zawiera kilka dość długich klas, więc nie opublikuję tutaj całego kodu, ale poniższa metoda nadaje smak.
Jeśli czwórka gra przeciwko sobie, CluePaddle wygrywa zdecydowanie najwięcej gier, a ClueByFour jest drugi, a pozostałe dwie nigdzie.
Tylko CluePaddle jest konkurencyjnym wejściem (jak dotąd). Stosowanie:
Jeśli ktoś chce mieć C # AI, tylko utworzyć projekt ConsoleApplication w soltution, wdrożenie
IClueAI
interfejsu w klasie, a następnie dokonaćProgram
pochodzą odProgramTemplate
i skopiować to, co dla innych projektów zrobićMain()
. Jedyną zależnością jest NUnit do testowania jednostkowego i możesz łatwo usunąć wszystkie testy z kodu (ale nie, po prostu zainstaluj NUnit).źródło
CluePaddle
Projekt nie kompiluje, twierdząc, żeNUnit
nie jest zainstalowany, mimo że inne projekty zrobić kompilacji. Te, które się kompilują, kończą się przeciąganiem podczas testowania, a Java zgłasza błąd resetowania połączenia. Czy możesz mi pomóc ustalić, czy mogłem zrobić coś złego?ClueStick
to jedyna sztuczna inteligencja, która zatrzymuje się, gdy próbuję ją uruchomić. Pozostała dwójka bierze udział w turnieju próbnym i ostatecznie zostaje zdyskwalifikowana za te same naruszenia.ClueByFour
zostaje zdyskwalifikowany za to, że nie powtórzy niezapowiedzianej sugestii, którą wysuwa jako oskarżenie, gdy nie posiada żadnej z kart.ClueBat
zostaje zdyskwalifikowany za oskarżanie, że ma karty, które albo został pokazany, albo ma na ręce. Sprawdź poprawione ograniczenia AI, aby zapewnić zgodność.CluePaddle
. Zrobię to później.