Я пытаюсь оптимизировать с помощью Z3py экземпляр Set Covering Problem (SCP41) на основе минимизации.
Результаты следующие:
С использованием
(1) Я знаю, что Z3 поддерживает оптимизацию (https://rise4fun.com/Z3/tutorial/optimization). Много раз я добирался до оптимума в SCP41 и других случаях, но не у всех.
(2) Я понимаю, что если я буду использовать Z3py API без модуля оптимизации, мне придется выполнять типичный последовательный поиск, описанный в (Минимальное и максимальное значения целочисленной переменной) от @Leonardo de Moura. Это никогда не дает мне результатов.
Мой подход
(3) Я попытался улучшить подход к последовательному поиску, внедрив бинарный поиск, аналогичный тому, как он объясняет @Philippe в (Поддерживает ли Z3 проблемы с оптимизацией), когда я запускаю свой алгоритм, он ждет, и я не получаю никакого результата.
Я так понимаю, что бинарный поиск должен быть быстрее и работать в этом случае? Я также знаю, что экземпляр SCP41 — это что-то большое, и что генерируется много ограничений, и он становится чрезвычайно комбинаторным, это мой полный код (Код большого экземпляра), и это мой двоичный поиск:
def min(F, Z, M, LB, UB, C):
i = 0
s = Solver()
s.add(F[0])
s.add(F[1])
s.add(F[2])
s.add(F[3])
s.add(F[4])
s.add(F[5])
r = s.check()
if r == sat:
UB = s.model()[Z]
while int(str(LB)) <= int(str(UB)):
C = int(( int(str(LB)) + int(str(UB)) / 2))
s.push()
s.add( Z > LB, Z <= C)
r = s.check()
if r==sat:
UB = Z
return s.model()
elif r==unsat:
LB = C
s.pop()
i = i + 1
if (i > M):
raise Z3Exception("maximum not found, maximum number of iterations was reached")
return unsat
И это еще один экземпляр (Краткий экземпляр кода), который я использовал в первоначальных тестах, и это работало хорошо в любом случае.
Что такое некорректный бинарный поиск или какая-то концепция Z3 применена неправильно?
С уважением, Алекс