minimização do z3 e tempo limite

Eu tento usar o resolvedor z3 para um problema de minimização. Eu estava tentando obter um tempo limite e retornar a melhor solução até agora. Eu uso a API python e a opção de tempo limite "smt.timeout" com

set_option("smt.timeout", 1000) # 1s timeout

Na verdade, isso expira após cerca de 1 segundo. No entanto, um tempo limite maior não fornece um objetivo menor. Acabei ligando a verbosidade com

set_option("verbose", 2)

E acho que o z3 avalia sucessivamente valores maiores do meu objetivo, até que o problema seja satisfatório:

(opt.maxres [0:6117664])
(opt.maxres [175560:6117664])
(opt.maxres [236460:6117664])
(opt.maxres [297360:6117664])
...
(opt.maxres [940415:6117664])
(opt.maxres [945805:6117664])
...

Portanto, tenho as duas perguntas:

Por outro lado, posso dizer ao z3 para começar com o limite superior e retornar modelos sucessivamente com um valor menor para a minha função objetivo (como, por exemplo, as anotações do Minizincindomain_max http://www.minizinc.org/2.0/doc-lib/doc-annotations-search.html)Ainda parece que o solucionador retorna uma instância satisfatória do meu problema. Como é encontrado? Se estiver tentando avaliar valores maiores do meu objetivo sucessivamente, ainda não deveria ter encontrado uma instância satisfatória quando o tempo limite ocorrer ...

editar: No log opt.maxres, o limite superior nunca diminui.

Para o registro, encontrei uma descrição mais detalhada das opções na fonte aquiopt_params.pyg

Editar Desculpe incomodar, estive mergulhando nisso recentemente mais uma vez. De qualquer forma, acho que isso pode ser útil para os outros. Descobri que na verdade tenho que ligar para oOptimize.upper para obter o limite superior e o modelo ainda não é o que corresponde a esse limite superior. Consegui adicioná-lo como uma nova restrição e chamar um solucionador (sem otimização, apenas SAT), mas essa provavelmente não é a melhor idéia. Pela leituraesta Eu sinto que deveria ligarOptimize.update_upper após o tempo limite do solucionador, mas a interface python não possui esse método (?). Pelo menos eu posso obter o limite superior e o modelo correspondente agora (ao custo de cálculos desnecessários, eu acho).

questionAnswers(1)

yourAnswerToTheQuestion