Я видел несколько других постов, касающихся этой игры, но ни один из них не был сосредоточен на типе алгоритма, который я выбрал, по крайней мере, пока не в подробностях. Это также предлог для меня, чтобы узнать больше о графах (например, с igraph пакет). Излишне говорить, что я не призываю людей обманывать в любой ситуации. Это действительно трудная задача, которую я ставлю перед собой — часто именно благодаря этим вещам я больше всего узнаю в конце.
Мой план включает в себя некоторую подготовительную работу помимо очевидного набора французского словаря.
Первым большим шагом было создание igraph, который выглядит следующим образом, иллюстрируя допустимые связи между буквами Boggle. (Для тех, кто не знаком с Boggle, вы можете создавать слова только из непосредственно соседних букв, в том числе по диагонали. И чем длиннее слова, тем больше награды).
Следующий шаг (который может быть не идеальным, но я не мог понять, как добиться этого непосредственно из пакета igraph). В любом случае, нужно было сгенерировать все перестановки с помощью gtools:
permutations(n=16, r=3)
permutations(n=16, r=4)
а затем использовать функцию igraph::neigbourhood
для "проверки" каждой отдельной перестановки, чтобы увидеть, будут ли они законными в игре Boggle. Из приведенных ниже цифр видно, что чем больше «выборка» (чем длиннее слова, если хотите), тем больше перестановок отвергается. Таким образом, требуется много вычислительной мощности, чтобы получить очень мало дополнительной информации. Явно не оптимально. И когда r становится выше 7, начинается ад (моих 8 Гб ОЗУ все еще мало!)
4 letter permutations - total : 43680
legit : 1764 (4.0%)
6 letter permutations - total : 5765760
legit : 22672 (0.4%)
and so forth
Так что теперь я хотел бы найти способ генерировать эти перестановки более разумным способом (возможно, их можно было бы назвать «путями» или «траекториями»), возможно, с помощью такого инструмента, как igraph, чтобы я не поджарил свои материнская плата для того, чтобы иметь слишком много удовольствия. Работа с графами для меня в новинку, поэтому она может стоять прямо у меня перед носом, но я не вижу ничего вроде «сгенерировать все траектории, проходящие через N соседних узлов на графе» или что-то подобное в Документах. Может быть, он и существует, но он называется «Алгоритм какого-то парня», парень, о котором я, к сожалению, никогда раньше не слышал.
Я очень доволен результатами, когда вся подготовительная работа завершена. Это достаточно быстро и абсолютно точно. Я просто застрял со словами из 7 букв (5 жалких баллов, хе-хе-хе). Я мог бы разместить его на GitHub в какой-то момент, если люди заинтересованы. Я думаю, что люди, которые достаточно разбираются в графиках, должны быть в состоянии указать мне правильное направление, поэтому я не думаю, что какое-либо кодирование длин будет служить здесь какой-либо цели.
Заранее спасибо!
(Для полноты картины, после того как вычислены «допустимые перестановки», я сравниваю получившиеся слова со словарными записями и откладываю те, которые соответствуют. Я использую RSQLite и работаю с фрагментами слов возрастающей длины; разделяю вещи. таким образом делает код довольно простым для понимания, а также делает поиск в базе данных довольно быстрым.)
igraph::neighbors
для рекурсивного добавления чисел к вектору до тех пор, пока не будет достигнута определенная длина. Тогда каждое подмножество результирующих векторов будет путями для меньшихr
. - person Zelazny7   schedule 19.02.2015graph.lattice
в качестве основы, затем извлек матрицу смежности с помощьюget.adjacency
и вручную добавил диагонали к последней, а затем использовалgraph.adjacency
для построения окончательного igraph из измененной матрицы смежности. Я уверен, что есть несколько лучших способов сделать это, но это все равно работает! - person Dominic Comtois   schedule 20.02.2015