Метод генерации разнобуквиц
Первый блин.
Цех НТВ мяк - бди, пой! Чащу эф шлю - съёжь! Грыз.
Генерация осуществляется путём решения задачи целочисленного
линейного программирования. Буквы рассматриваются как 'ресурсы'.
Каждое слово обладает своим набором 'ресурсов'.
Нужно выбрать слова так, чтобы в наборе слов всех 'ресурсов' (букв)
было ровно по одному.
При постановке задачи можно задавать желаемые количества
(или интервалы) существительных, глаголов, прилагательных и т д.
А также выкидывать нежелательные слова.
Решение задачи ЦЛП с 340 тыс. переменных (разнобуквенных слов)
и с 35-36 ограничениями (буквы-ресурсы плюс дополнительные ограничения)
с помощью пакета LP_SOLVE занимает около 5 минут на ноутбуке Lenovo W510.
К сожалению, выдаются пока не все решения, а одно.
Чтобы получить другое, нужно изменить условия и запустить снова.
Но в дальнейшем попробую получить максимум комбинаций из
одного прогона задачи (такая возможность в пакете существует).
Промежуточный результат экспериментов.
Не удалось найти комбинацию слов разнобуквицы меньше
чем 5 слов. То есть, задача минимизации количества
слов разнобуквицы дала результат 5 слов.
На имеющемся словаре в 2534 тыс. слов это результат абсолютный.
При решении было использовано подмножество разнобуквенных
слов количеством около 340 тыс. слов, так как по понятным причинам
при поиске разнобуквицы можно сразу отбрасывать слова
содержащие более двух вхождений одной буквы.
Максимальное кол-во слов разнобуквицы - 17, но это
конечно бессмысленный набор слов, в котором 7 одно-буквенных
слов и 6 двух-буквенных.
В принципе так можно найти любую анаграмму. Например, анаграмму
двойного алфавита - где каждая буква ровно по два раза.
Или вообще - анаграмму на любой текст. Но для длинных текстов
это нерационально, так как даст (как водится) не очень осмысленный текст.
Для построения анаграммы длинного текста можно взять любой
осмысленный текст длиной меньше, чем исходный (и включает в себя
набор букв 'меньший', чем исходный) и на остаток-разницу
между текстами построить уже короткую анаграмму.
Еще один простой способ генерации разнобуквиц.
Делим алфавит на три части по ~ 11 букв.
Для каждой из них построить все анаграммы можно
ограниченным перебором, так как в каждой не будет
(обычно) более четырёх слов. Вопрос - как производить
первоначальное деление.
1. Произвольно случайно.
2. Взять существующую разнобуквицу и поделить алфавит на части
по ее словам.
3. Разделить алфавит на три части, таким образом чтобы в сумме они
позволяли произвести наибольшее количество комбинаций.
(для этого нужно решить отдельную задачу)
Свидетельство о публикации №113070803585