Расширяем комментарий vzn в ответ: стандартное сокращение от CNF-SAT до покрытия вершин довольно просто: создайте вершину для каждого члена (переменную или ее отрицание), соедините каждую переменную с ее отрицанием ребром, сделайте клик для каждого предложения и соедините каждую вершину в клике с вершиной для одного из условий в предложении. Если вы начнете с задачи выполнимости с известным удовлетворяющим присваиванием, это даст вам задачу покрытия вершин с известным оптимальным решением (выберите вершины термина, заданные присваиванием, и в каждом пункте клики выберите все, кроме одной вершины, так, чтобы вершина предложения, которая не выбрана, смежна с вершиной термина, которая выбрана).
Так что теперь вам нужно найти проблемы удовлетворяемости, которые имеют известное удовлетворяющее назначение, но где решение трудно найти. Существует много известных способов генерации трудных проблем выполнимости (например, генерировать случайные экземпляры k-SAT, близкие к порогу выполнимости), но дополнительное требование, чтобы вы знали, что удовлетворяющее назначение ограничивает возможности. Одна вещь, которую вы можете сделать здесь, - это пройти еще один уровень сокращения - от криптографически сложной проблемы, такой как факторизация. Т.е. выберите два больших простых числа p и q, установите булеву схему для умножения p и q на двоичные числа и переведите ее в формулу CNF, в которой есть переменная для каждого входа (p и q) и для каждого промежуточного значения на провод в цепи, пункт для каждого выхода, заставляющий его иметь правильное значение, и пункт для каждого шлюза, заставляющий входы и выходы шлюза быть согласованными друг с другом. Затем переведите эту формулу CNF в покрытие вершин.
Для более простой стратегии сначала выберите удовлетворительное назначение для формулы 3CNF, а затем сгенерируйте случайные предложения, сохраняя только те предложения, которые соответствуют назначению, а затем преобразуйте в покрытие вершин. Если предложения имеют одинаковую вероятность, это будет уязвимо для эвристики, основанной на градусах (вершины термина, которые соответствуют выбранному назначению, будут иметь более низкую степень, чем вершины термина, которые этого не делают), но этого недостатка можно избежать, регулируя вероятности предложений в зависимости от того, сколько условий пункта соответствует выбранному назначению. Вероятно, это уязвимо для некоторой атаки за полиномиальное время, но, возможно, она не является естественной для покрытия вершин, поэтому она может создать хороший набор тестовых экземпляров, несмотря на отсутствие достаточной гарантии твердости.