Chciałem zobaczyć odpowiedzi na to (obecnie nieistniejące) pytanie , ale nigdy nie zostało ono poprawione / poprawione.
Biorąc pod uwagę zestaw 6-stronnych kostek Boggle (konfiguracja skradziona z tego pytania ), określ w ciągu dwóch minut czasu przetwarzania, która konfiguracja planszy pozwoli uzyskać najwyższy możliwy wynik. (tj. które kości, w której lokalizacji, z której strony do góry pozwala na największą pulę słów punktowanych?)
CEL
Twój kod powinien działać przez nie więcej niż 2 minuty (120 sekund). W tym czasie powinien automatycznie przestać działać i wydrukować wyniki.
Ostatecznym wynikiem wyzwania będzie średni wynik Boggle z 5 przebiegów programu.
- W przypadku remisu zwycięzcą zostanie wybrany algorytm, który znajdzie więcej słów.
- W przypadku remisu zwycięzcą zostanie wybrany algorytm, który znajdzie więcej długich (8+) słów.
ZASADY / OGRANICZENIA
To jest wyzwanie kodowe; długość kodu nie ma znaczenia.
Odwołaj się do tego linku, aby uzyskać listę słów (użyj
ISPELL "english.0"
listy - na liście SCOWL brakuje niektórych dość popularnych słów).- Ta aukcja może być odsyłana / importowana / czytana w twoim kodzie w dowolny sposób.
- Liczone
^([a-pr-z]|qu){3,16}$
będą tylko słowa pasujące do wyrażenia regularnego . (Jedynie małe litery, 3-16 znaków, qu muszą być użyte jako jednostka.)
Słowa powstają przez połączenie sąsiednich liter (poziomej, pionowej i ukośnej), aby przeliterować słowa we właściwej kolejności, bez użycia jednej kości więcej niż raz w jednym słowie.
- Słowa muszą składać się z 3 liter lub więcej; krótsze słowa nie przyniosą punktów.
- Duplikaty liter są dopuszczalne, ale nie kości.
- Słowa, które rozciągają się między krawędziami / krzyżują się z jednej strony planszy na drugą, są niedozwolone.
Ostateczny wynik Boggle ( nie wyzwanie ) to suma wartości punktowych dla wszystkich znalezionych słów.
- Wartość punktowa przypisana do każdego słowa zależy od jego długości. (patrz poniżej)
- Normalne zasady Boggle odejmują / dyskontują słowa znalezione przez innego gracza. Załóżmy, że nie bierze w tym udziału żaden inny gracz, a wszystkie znalezione słowa liczą się do całkowitego wyniku.
- Jednak słowa znalezione więcej niż jeden raz w tej samej siatce należy liczyć tylko raz.
Twoja funkcja / program musi ZNAJDŹ układ optymalny; zwykłe zakodowanie z góry ustalonej listy nie wystarczy.
Twój wynik powinien stanowić siatkę 4x4 idealnej planszy do gry, listę wszystkich znalezionych słów dla tej planszy oraz wynik Boggle odpowiadający tym słowom.
KONFIGURACJA UMIERA
A A E E G N
E L R T T Y
A O O T T W
A B B J O O
E H R T V W
C I M O T U
D I S T T Y
E I O S S T
D E L R V Y
A C H O P S
H I M N Qu U
E E I N S U
E E G H N W
A F F K P S
H L N N R Z
D E I L R X
STANDARDOWY TABELA PUNKTOWANIA BOGGLE
Word length => Points
<= 2 - 0 pts
3 - 1
4 - 1
5 - 2
6 - 3
7 - 5
>= 8 - 11 pts
*Words using the "Qu" die will count the full 2 letters for their word, not just the 1 die.
PRZYKŁADOWA WYDAJNOŚĆ
A L O J
V U T S
L C H E
G K R X
CUT
THE
LUCK
HEX
....
140 points
Jeśli potrzebne są dalsze wyjaśnienia, zapytaj!
źródło
4527
(1414
suma słów), znaleziony tutaj: ai.stanford.edu/~chuongdo/boggle/index.html^([a-pr-z]|qu){3,16}$
(które niepoprawnie wykluczałoby 3-literowe słowa z qu, ale nie ma żadnych).Odpowiedzi:
C, średnio
500+15001750 punktówJest to stosunkowo niewielka poprawa w stosunku do wersji 2 (patrz uwagi na temat poprzednich wersji poniżej). Istnieją dwie części. Po pierwsze: Zamiast losowego wybierania plansz z puli, program wykonuje teraz iterację po każdej planszy w puli, używając każdej z nich przed powrotem na szczyt puli i powtarzania. (Ponieważ pula jest modyfikowana podczas tej iteracji, nadal będą deski wybierane dwa razy z rzędu lub gorzej, ale nie jest to poważny problem.) Druga zmiana polega na tym, że program śledzi teraz zmiany puli , a jeśli program działa zbyt długo bez poprawiania zawartości puli, określa, że wyszukiwanie „utknęło w martwym punkcie”, opróżnia pulę i zaczyna od nowa. Nadal robi to, dopóki nie miną dwie minuty.
Początkowo myślałem, że zastosuję jakieś wyszukiwanie heurystyczne, aby wyjść poza zakres 1500 punktów. Komentarz @ mellamokb na temat 4527-punktowej tablicy doprowadził mnie do wniosku, że jest dużo miejsca do poprawy. Używamy jednak stosunkowo małej listy słów. Tablica z 4527 punktami zdobywała punkty za pomocą YAWL, która jest najbardziej inkluzywną listą słów dostępną na rynku - jest nawet większa niż oficjalna lista słów Scrabble w USA. Mając to na uwadze, ponownie zbadałem tablice znalezione przez mój program i zauważyłem, że wydaje się, że istnieje ograniczony zestaw tablic powyżej około 1700. Na przykład miałem wiele przebiegów, które odkryły tablicę z wynikiem 1726, ale zawsze była to dokładnie ta sama tablica, która została znaleziona (ignorując obroty i odbicia).
Jako kolejny test uruchomiłem mój program, używając YAWL jako słownika, i po kilkunastu uruchomieniach znalazłem tablicę 4527-punktową. Biorąc to pod uwagę, wysuwam hipotezę, że mój program znajduje się już w górnej granicy przestrzeni wyszukiwania, a zatem planowane przeze mnie przepisywanie wprowadziłoby dodatkową złożoność przy bardzo niewielkim zysku.
Oto moja lista pięciu najlepszych tablic, które mój program znalazł za pomocą listy
english.0
słów:Wierzę, że „grep board” z 1772 r. (Jak to nazywałem), z 531 słowami, jest tablicą z największą liczbą możliwych punktów przy tej liście słów. Ponad 50% dwuminutowych uruchomień mojego programu kończy się na tej płycie. Zostawiłem też program uruchomiony na noc, nie znajdując nic lepszego. Więc jeśli istnieje tablica o wyższej punktacji, prawdopodobnie musiałaby mieć jakiś aspekt, który pokona technikę wyszukiwania programu. Na przykład plansza, w której każda możliwa mała zmiana układu powoduje ogromny spadek wyniku, może nigdy nie zostać wykryta przez mój program. Mam przeczucie, że taka tablica prawdopodobnie nie istnieje.
Uwagi do wersji 2 (9 czerwca)
Oto jeden ze sposobów wykorzystania początkowej wersji mojego kodu jako punktu wyjścia. Zmiany w tej wersji składają się z mniej niż 100 linii, ale potroiły średni wynik gry.
W tej wersji program utrzymuje „pulę” kandydatów, składającą się z N najwyżej ocenianych tablic wygenerowanych do tej pory przez program. Za każdym razem, gdy generowana jest nowa plansza, jest ona dodawana do puli i usuwana jest tablica o najniższych wynikach w puli (która może równie dobrze być właśnie dodaną tablicą, jeśli jej wynik jest niższy niż obecny). Pula jest początkowo zapełniana losowo generowanymi płytkami, po czym utrzymuje stały rozmiar przez cały czas działania programu.
Główna pętla programu polega na wybraniu losowej planszy z puli i zmianie jej, określeniu wyniku nowej planszy, a następnie umieszczeniu jej w puli (jeśli osiąga wystarczającą liczbę punktów). W ten sposób program nieustannie udoskonala tablice z najlepszymi wynikami. Główną czynnością jest wprowadzanie stopniowych, przyrostowych ulepszeń, ale wielkość puli pozwala również programowi znajdować wieloetapowe ulepszenia, które tymczasowo pogarszają wynik tablicy, zanim będzie ona w stanie poprawić.
Zazwyczaj ten program dość szybko znajduje dobre maksimum lokalne, po którym przypuszczalnie jakiekolwiek lepsze maksimum jest zbyt odległe, aby je znaleźć. I tak po raz kolejny nie ma sensu uruchamiać programu dłużej niż 10 sekund. Można to poprawić, np. Wykrywając tę sytuację przez program i rozpoczynając nowe wyszukiwanie od nowej puli kandydatów. Przyniosłoby to jednak jedynie niewielki wzrost. Właściwa heurystyczna technika poszukiwania byłaby prawdopodobnie lepszą drogą eksploracji.
(Uwaga dodatkowa: Widziałem, że ta wersja generuje około 5 tys. Tablic / s. Ponieważ pierwsza wersja zazwyczaj generowała 20 tys. Tablic / s, początkowo byłem zaniepokojony. Po profilowaniu odkryłem jednak, że spędziłem dodatkowy czas na zarządzaniu listą słów. Innymi słowy, było to całkowicie spowodowane tym, że program znalazł o wiele więcej słów na tablicę. W związku z tym rozważałem zmianę kodu w celu zarządzania listą słów, ale biorąc pod uwagę, że ten program używa tylko 10 z przydzielonych 120 sekund, takich optymalizacja byłaby bardzo przedwczesna).
Uwagi do wersji 1 (2 czerwca)
To bardzo, bardzo proste rozwiązanie. Wszystko, co robi, generuje losowe plansze, a następnie po 10 sekundach generuje tę z najwyższym wynikiem. (Domyślnie ustawiłem 10 sekund, ponieważ dodatkowe 110 sekund dozwolone przez specyfikację problemu zazwyczaj nie poprawia ostatecznego rozwiązania, na które warto było czekać.) Jest to więc bardzo głupie. Ma jednak całą infrastrukturę, aby stanowić dobry punkt wyjścia do bardziej inteligentnego wyszukiwania, a jeśli ktoś chce skorzystać z niej przed upływem terminu, zachęcam go do tego.
Program rozpoczyna się od odczytania słownika w strukturze drzewa. (Forma nie jest tak zoptymalizowana, jak mogłaby być, ale jest wystarczająca do tych celów.) Po innej podstawowej inicjalizacji zaczyna generować tablice i oceniać je. Program sprawdza około 20 000 płyt na sekundę na mojej maszynie, a po około 200 000 płyt losowe podejście zaczyna działać na sucho.
Ponieważ w danym momencie oceniana jest tylko jedna tablica, dane punktacji są przechowywane w zmiennych globalnych. To pozwala mi zminimalizować ilość stałych danych, które muszą być przekazywane jako argumenty do funkcji rekurencyjnych. (Jestem pewien, że da to niektórym ludziom pokrzywkę i przepraszam.) Lista słów jest przechowywana jako drzewo wyszukiwania binarnego. Każde znalezione słowo należy wyszukać na liście słów, aby duplikaty słów nie były liczone dwukrotnie. Lista słów jest jednak potrzebna tylko podczas procesu oceny, więc jest odrzucana po znalezieniu wyniku. Dlatego pod koniec programu wybrana tablica musi zostać ponownie oceniona, aby można było wydrukować listę słów.
Ciekawostka: średni wynik losowo wygenerowanej planszy Boggle, według oceny
english.0
, wynosi 61,7 punktu.źródło
VBA (średnia obecnie wynosi 80-110 punktów, niedokończone)
Oto mój proces pracy, ale nie jest on najlepszy z możliwych; moja absolutnie najlepsza ocena znaleziona na dowolnej planszy po wielu testowych testach wynosi około 120. Nadal musi być jakiś lepszy ogólny porządek i jestem pewien, że w wielu miejscach można uzyskać większą wydajność.
Prawdopodobnie niektórym z was wygląda to okropnie, ale jak powiedziałem, WIP. Jestem bardzo otwarty na konstruktywną krytykę! Przepraszam za bardzo długie ciało ...
Moduł klasy kości :
Moduł klasy drzewa :
Moduł klasy TreeNode :
Moduł główny :
źródło
Szybkie spojrzenie na rozmiar przestrzeni wyszukiwania.
Zmniejszenie, aby wykluczyć powtórzenie na każdej kości.
@breadbox przechowuje słownik jako sprawdzanie tabeli mieszania O (1).
EDYTOWAĆ
Best Board (do tej pory byłem świadkiem)
źródło
Mój wpis znajduje się tutaj na Dream.In.Code ~ 30ms na przeszukiwanie płyty (na maszynie 2-rdzeniowej, powinno być szybsze z większą liczbą rdzeni)
źródło
:
inhttp://
. ;-).NET
abyVBA
nie jest zbyt trudne.