Angenommen, ich möchte die folgende Einschränkung lösen: y == max(x, 0)
. Was ich mir vorstellen könnte, ist Folgendes zu kodieren (in der z3py-Schnittstelle): If(x > 0, y == x, y == 0)
. Meine Fragen waren:Kann Z3 effektiv Einschränkungen mit einer maximalen Operation lösen?
- Z3 intern gehen den obigen Ausdruck in zwei Einschränkungen zu übersetzen:
x > 0 /\ y == x
undx <= 0 /\ y == 0
, und dann nimmt ein OR von ihnen und kehrt saß, wenn eine der beiden Bedingungen erfüllbar? - Wenn ja, scheint die Anzahl der Einschränkungen exponentiell mit der Anzahl der
max
Operationen zu wachsen. Ich habe ein System mit über 100max
. Gibt es eine effiziente Lösung, entweder in Z3 oder in anderen Lösungsmethoden?
Vielen Dank!
Dies ist ein schöner Trick! Aber wie würdest du 'y == max (x, 0)' tun? Gibt es eine allgemeine Möglichkeit, 'max' effektiv ohne eine Verzweigung auszudrücken? – queeten
Der prägnanteste Weg ist, wie Nikolaj sagte: 'If (x> y, x, y)'. Ich bezweifle, dass man allgemein sagen kann, ob der Suchraum verdoppelt wird, indem man solche Einschränkungen einführt. Es hängt vom Problem und den Interna des Solvers ab. Wenn 'x> y 'von anderswo im Problem bekannt ist, wird Z3' If (x> y, x, y)' mit nur 'x' oder 'y' ersetzen und es wird keine Verzweigung geben. Wenn 'x> y' nicht aus dem Kontext bestimmt werden kann, muss möglicherweise verzweigt werden. –
In dieser Art von Situation kann das Wissen über die Löser und Algorithmen Ihnen helfen zu hypothetisieren, was die Auswirkung auf die Leistung sein wird. Die Gesamtleistung eines Solvers wie Z3 ist jedoch kompliziert und hängt von vielen Faktoren ab, die gegeneinander abgewogen werden. In der Regel müssen Sie Ihre Hypothesen mit relevanten Benchmarks testen, um festzustellen, ob sie für Ihre spezifischen Probleme von Interesse sind. –