Оптимизатор Z3 не обрабатывает нелинейные задачи. И действительно, именно поэтому он печатает unknown
. Когда вы видите, что check
возвращает unknown
, это точно означает, что: Z3 не знает, является ли проблема выполнимой или нет, не говоря уже о том, нашел ли она оптимальное решение.
Если вы добавите:
print(opt.reason_unknown())
после звонка на check
вы увидите:
(incomplete (theory arithmetic))
В этих случаях вызов model
вернет некоторый промежуточный результат z3
, полученный при работе над проблемой, но ни в коем случае он не будет гарантированно оптимальным.
Ваша проблема нелинейная, потому что вы умножаете переменные. (w
, b
и l
.) Z3 может решать нелинейные задачи выполнимости по реалам, но не задач оптимизации. См., Например, здесь: z3Opt оптимизирует нелинейную функцию, используя qfnra-nlsat
(Обратите внимание, что нелинейная оптимизация представляет собой значительно более сложную проблему для реальных, а не просто удовлетворяемости. Таким образом, это не просто вопрос "не реализовал ее пока".)