W tym wyzwaniu otrzymujesz ograniczoną ilość informacji o konkretnej grze w szachy i musisz przewidzieć, kto wygrał .
Otrzymujesz dwa zestawy danych:
- Liczy się liczba sztuk (jakie części wciąż żyją)
- Kolory planszy (Kolor elementów na planszy)
Co ważniejsze, ty nie wiesz, gdzie znajdują się kawałki . Musisz ustalić, kto Twoim zdaniem wygra.
Gry są wybierane ze wszystkich wydarzeń wymienionych na PGNMentor od 2010 roku do chwili obecnej. Wybrałem 10% wszystkich pozycji na planszy z każdej gry, która kończy się wygraną lub przegraną. Pozycje na planszy będą zawsze mieć co najmniej 30 ruchów w grze. Przypadki testowe można znaleźć tutaj . (Białe wygrane są wymienione jako pierwsze, a następnie czarne wygrane)
Wejście
Liczba sztuk będzie ciągiem składającym się ze znaku dla każdego kawałka: k
ing, q
ueen, r
ook, k n
ight, b
ishop lub p
awn. Małe litery oznaczają czarny, wielkie litery są białe. Plansza będzie ciągiem 64 znaków (8 rzędów na 8 kolumn). B
reprezentuje czarny kawałek, W
reprezentuje biały kawałek i .
przedstawia puste miejsce. Próba:
W..WB......W.BB....W..B..W.WWBBB..W...B....W..BBWWW...BB.W....B.,BBKPPPPPPPQRRbbkpppppppqrr
reprezentowałby następującą radę
...B.BB.
.BBBBBBB
.B.B....
B..W....
WWWW.W..
....W.W.
...W..WW
W.....W.
i gdzie oba kolory mają 2 Biskupów, 1 Króla, 7 Pionków, 1 Królową, 2 Wieże
Wynik
Musisz zwrócić liczbę zmiennoprzecinkową z zakresu od 0 do 1 (włącznie), aby określić prawdopodobieństwo, że białe wygrywają. Próba:
0.3 (30% chance that white wins)
Więcej szczegółów:
- Każdy przypadek testowy jest wart 1 punkt. Twój wynik będzie,
1 - (1-Output)^2
jeśli biały wygra lub1 - (Output)^2
czarny wygra. - Twój końcowy wynik będzie sumą dla wszystkich przypadków testowych.
- Jeśli uważam, że zgłoszenia są na stałe zakodowane, zastrzegam sobie prawo do zmiany przypadków testowych. (Jeśli je zmienię, będą miały skrót SHA-256
893be4425529f40bb9a0a7632f7a268a087ea00b0eb68293d6c599c6c671cdee
) - Twój program musi uruchamiać przypadki testowe niezależnie. Brak zapisywania informacji z jednego przypadku testowego do drugiego.
- Jeśli korzystasz z uczenia maszynowego, bardzo polecam szkolenie na temat pierwszych 80% danych, a testowanie z wykorzystaniem pozostałych 20% . (Lub niezależnie od tego, jaki procent użyjesz). Używam tych gier wiele razy w danych, ale zestawiam te same gry sekwencyjnie.
- AKTUALIZACJA: Dodałem ponad milion przypadków testowych do celów testowych i edukacyjnych. Są one podzielone na części czarno-białe ze względu na ograniczenia rozmiaru repozytorium github.
Powodzenia i miłej zabawy!
źródło
Odpowiedzi:
Java 8 + Weka, 6413 punktów, 94,5%
Ta odpowiedź wykorzystuje podejście uczenia maszynowego. Musisz pobrać bibliotekę Weka , w szczególności
weka.jar
iPackageManager.jar
.Tutaj używam wielowarstwowego perceptronu jako klasyfikatora; możesz zastąpić
mlp
dowolnymClassifier
klasą Weka, aby porównać wyniki.Niewiele majstrowałem przy parametrach MLP i po prostu spojrzałem im w oczy (jedna ukryta warstwa 50 neuronów, 100 epok, 0,2 szybkości uczenia się, 0,1 pędu).
Przekraczam próg wartości wyjściowej MLP, więc tak naprawdę wyjście wynosi 1 lub 0, jak zdefiniowano w wyzwaniu. W ten sposób liczba poprawnie sklasyfikowanych instancji wydrukowanych przez Weka jest bezpośrednio naszym wynikiem.
Konstrukcja wektora cechy
Przekształcam każdą instancję z łańcucha na wektor 76 elementów, gdzie:
1
jest biały kawałek,-1
jest czarny kawałek i0
jest pustą komórką.0
czyli „brak części tego typu”). Można zastosować normalizację, aby dopasować te wartości od -1 do 1, ale prawdopodobnie nie jest to tutaj bardzo pomocne.Liczba wystąpień szkoleniowych
Jeśli wykorzystam wszystkie podane przypadki testowe do wyszkolenia mojego klasyfikatora, udało mi się uzyskać 6694 (tj. 98,6588%) poprawnie sklasyfikowanych instancji . Nie jest to oczywiście zaskakujące, ponieważ testowanie modelu na tych samych danych, których użyłeś do treningu, jest zbyt łatwe (ponieważ w takim przypadku dobrze jest, że model się przerasta).
Używając losowego podzbioru 80% instancji jako danych treningowych, otrzymujemy 6413 (tj. 94,5173%) poprawnie sklasyfikowanych instancji zgłoszonych w nagłówku (oczywiście ponieważ ten podzbiór jest losowy, możesz uzyskać nieco inne wyniki). Jestem pewien, że model działałby przyzwoicie na nowych danych, ponieważ testowanie na pozostałych 20% instancji (które nie były używane do szkolenia) daje 77,0818% poprawnej klasyfikacji, co pokazuje, że modele dość dobrze się generalizują (zakładając, że przedstawione nam przykłady są reprezentatywne dla nowych przypadków testowych, które otrzymalibyśmy).
Wykorzystując połowę instancji do treningu, a drugą połowę do testowania, otrzymujemy 86,7502% zarówno na danych szkoleniowych, jak i testowych oraz 74,4988% tylko na danych testowych.
Realizacja
Jak powiedziałem, ten kod wymaga
weka.jar
iPackageManager.jar
od Weka.Za pomocą można kontrolować procent danych wykorzystywanych w zestawie treningowym
TRAIN_PERCENTAGE
.Parametry MLP można zmienić tuż poniżej
TRAIN_PERCENTAGE
. Można wypróbować inne klasyfikatory Weka (np.SMO
Dla SVM), po prostu zastępującmlp
je innym klasyfikatorem.Ten program drukuje do zestawów wyników, z których pierwszy znajduje się w całym zestawie (w tym dane użyte do treningu), co jest wynikiem zdefiniowanym w tym wyzwaniu, a drugi dotyczy tylko danych, które nie zostały użyte do treningu.
Dane wprowadza się, przekazując ścieżkę pliku zawierającego je jako argument do programu.
źródło
GNU sed + bc,
43365074,5 punktów,6475%Aktualizacja: OP dał nowy sposób obliczenia wyniku prognozy dla pojedynczego przypadku testowego. Używając Wolfram Alpha , narysowałem oba zestawy wzorów, aby zobaczyć różnice.
Obecny sposób stanowi silną zachętę do generowania rzeczywistych prawdopodobieństw, a nie tylko skrajności, 0 i 1, dla których nowe formuły dają taki sam maksymalny wynik jak poprzednio. Właśnie dlatego niezmieniony algorytm poniżej ma teraz lepszy współczynnik predykcji, w rzeczywistości świetny współczynnik, biorąc pod uwagę jego prostotę.
Istnieje jednak także wada związana z nowymi formułami, jak wyjaśniono w „Edycji 1”.
Jest to proste oszacowanie oparte jedynie na przewadze / wadach materiałowych, ignorujące faktyczne rozmieszczenie elementów. Byłem ciekawy, jak to się potoczy. Powodem, dla którego używam sed, a nie jakiegoś języka, który może to zrobić w jednym wierszu, jest to, że jest to mój ulubiony język ezoteryczny.
Zastosowane standardowe wartości sztuk:
Obliczam materiał dla obu stron i odejmuję materiał czarnego od białego. Dane wyjściowe dla każdego przypadku testowego oparte są na tej różnicy w następujący sposób:
To jest mój jedyny ułamkowy wynik, stąd przyczyna ulepszenia, jak wyjaśniono powyżej.
Wskaźnik prognozy dla tej metody wynosił 64%. Teraz jest 75% dzięki nowym formułom.
Edycja 1: wada
Trywialnym rozwiązaniem jest uzyskanie 0,5 dla każdego przypadku testowego, ponieważ w ten sposób zdobyłeś pół punktu niezależnie od tego, kto wygrał. Dla naszych przypadków testowych oznaczało to łączny wynik 3392,5 punktu (50%).
Ale dzięki nowym formułom 0,5 (co daje wynik, jeśli nie jesteś zdecydowany, kto wygra) jest konwertowane na 0,75 punktu. Pamiętaj, że maksymalny wynik, jaki można uzyskać za przypadek testowy, wynosi 1, co daje 100% zaufania do zwycięzcy. W związku z tym nowy całkowity wynik dla stałej wartości 0,5 wynosi 5088,75 punktów, czyli 75%! Moim zdaniem zachęta jest w tym przypadku zbyt silna.
Ten wynik jest lepszy, choć marginalnie, niż mój algorytm oparty na przewadze materialnej. Powodem tego jest fakt, że algorytm podaje prawdopodobieństwo 1 lub 0 (brak zachęty), zakładane wygrane lub straty, więcej razy (3831) niż daje 0,5 (zachęta), zakładane remisy (2954). Metoda jest w końcu prosta i jako taka nie ma wysokiego odsetka poprawnych odpowiedzi. Przyspieszenie od nowej formuły do stałej 0,5 udaje się sztucznie osiągnąć ten odsetek.
Edycja 2:
Jest znany fakt, wspomniany w książkach szachowych, że zwykle lepiej jest mieć parę biskupów niż parę rycerzy. Jest to szczególnie prawdziwe w środkowej i końcowej fazie gry, gdzie znajdują się przypadki testowe, ponieważ jest bardziej prawdopodobne, że ma otwartą pozycję, w której zwiększa się zasięg biskupa.
Dlatego zrobiłem drugi test, ale tym razem zastąpiłem wartość biskupów z 3 do 3,5. Wartość rycerza pozostała 3. Jest to osobista preferencja, więc nie ustawiłem jej jako domyślnego poddania się. Łączny wynik w tym przypadku wyniósł 4411 punktów (65%). Zaobserwowano tylko 1 punkt procentowy wzrostu.
Dzięki nowym formułom łączny wynik wynosi 4835 punktów (71%). Teraz ważony biskup osiąga gorsze wyniki. Ale efekt jest wyjaśniony, ponieważ metoda ważona daje teraz jeszcze więcej razy zakładane wygrane lub straty (5089), niż zakładane remisy (1696).
źródło
Python 3 - 84,6%, 5275 punktów w zestawie sprawdzania poprawności
Jeśli oszukujemy i wykorzystujemy wszystkie dane, możemy osiągnąć dokładność 99,3% i wynik 6408
Po prostu prosta duża MLP z rezygnacją za pomocą Keras
źródło
Python 3 - dokładność 94,3%, 6447 punktów na zestawie walidacyjnym 20% danych
Wykorzystuje 3 sieci neuronowe, regresor najbliższych sąsiadów, losowy las i wzmocnienie gradientu. Prognozy te są łączone z losowym lasem, który również ma dostęp do danych.
źródło
Python 3 - 4353,25 / 6785 punktów - 64%
Pracowałem nad tym głównie wczoraj. Moja pierwsza gra w golfa i używam pytona dopiero od około tygodnia, więc wybacz mi, jeśli nie wszystko jest zoptymalizowane.
Skończyłem na tej samej ścieżce, co odpowiedź seshoumary na początek. Ale duża liczba przypadków testowych, które zawierały nawet liczbę sztuk, sprawiła, że byłem niezadowolony.
Więc przejrzałem cechy, które decydują o tym, kto wygrywa w szachach (sam nie gram) i zauważyłem, że pozycja na planszy, szczególnie kontrola środkowa, jest duża. Tam właśnie wchodzi ten bit.
Obie połówki łącznie służą do znalezienia wyniku (0,0, 0,25, 0,50, 0,75, 1,0)
Bardzo interesujące jest to, że ta dodatkowa pozycja na tablicy wydaje się nie zwiększać szansy na odgadnięcie zwycięzcy.
Jeśli upuścisz przypadki testowe w niektórych plikach, oto testowanie.
Wiem, że to nie jest wyzwanie golfowe, ale wszelkie wskazówki i porady w tym zakresie są mile widziane!
źródło