Это старый вопрос, поэтому, возможно, вы нашли эвристику, которая вам уже нравится. Я сталкивался с этим вопросом, изучая способы создания совершенных панграмм, которые будут иметь наименьшее количество символов (поскольку им разрешено использовать каждую букву в алфавите только один раз). Во всяком случае, для будущих искателей, как я:
Я написал программу, которая имеет некоторый успех. Я относился к этой проблеме больше как поиск по графику, чем как установил покрытие, и использовал A * в качестве отправной точки для алгоритма. Вы можете изучить код на github .
Больше всего помогло:
Сжатие пространства состояний
Я взял словарь и преобразовал все слова в их отсортированный набор букв. Например, таким образом «BAD» и «DAB» оба сохраняются как «ABD». Сжатый словарь, который я использовал, взял ~ 250 000 слов до ~ 31 000 уникальных буквенных комбинаций, что является огромной победой.
Эвристика
Как уже упоминалось в других местах, это NP сложный, поэтому я начал использовать эвристику. Три, которые я сейчас использую:
Соотношение гласных
Когда я проверяю буквы, оставшиеся после выбора слова, я вычисляю #vowels / #unusedLetters. Мотивация для этого довольно проста - наличие большего количества гласных делает более вероятным, что я смогу выбирать слова, используя эти буквы.
Письмо общности
Когда я читаю в исходном наборе слов, я создаю словарь для каждой буквы в алфавите и подсчитываю, сколько раз каждая буква встречается во всех словах. Я использовал этот словарь, чтобы отдавать предпочтение узлам, в которых оставшиеся буквы имели более общие буквы. (Я полагаю, что OP упомянул об этом в одном из комментариев)
Общие трехбуквенные комбинации
Это похоже на эвристику общности букв. Опять же, при обработке начального набора слов я создал словарь, который содержит все трехбуквенные комбинации, которые можно составить с помощью этого слова. Так, например, у буквенного набора ABC есть только одна допустимая комбинация, но у ABCD есть [ABC, ABD, BCD]. Помните, я забочусь о отсортированных наборах букв только после сжатия исходного набора слов.
Итак, в конце, мне должна понравиться мера общности букв, у меня есть словарь, отображающий все 26, выберите 3 возможных набора букв, сопоставленных с количеством раз, когда эти комбинации появляются в моем наборе слов. Затем я использую это, чтобы предпочесть поиск узлов, где оставшиеся буквы имеют более допустимые 3-буквенные комбинации.