2016-04-06 6 views
1

Ich habe eine Domain-Problem-Formulierung in MathProg, wo die Kostenfunktion geometrische Abstände verwendet. Die Datensätze enthalten nur X-, Y-Koordinaten und nicht die tatsächlichen Abstände. Gerade jetzt, berechnet meine Formulierung, die die Abstände direkt:"Vorberechnung" einer Matrix in mathprog

minimize total: sum{(f, c) in S} x[f, c] * sqrt(((facilityXs[f] - customerXs[c])**2) + ((facilityYs[f] - customerYs[c])**2)); 

Und ich möchte wissen, ob der MathProg Compiler ist intelligent genug, um zu sehen, dass der Ausdruck in sqrt konstant ist und somit das Ganze kann vorberechnet werden, oder ob es berechnet den Ausdruck jedes Mal neu und wie kann ich es eleganter schreiben.

Antwort

1

Ja der MathProg 'Compiler' ist schlau genug. Es wird alle Gleichungen vorberechnen, die ausschließlich Parameter enthalten (und dann eine Berechnungsmatrix erstellen, die nur einen numerischen Wert pro Zelle enthält). Wenn Sie Variablen in nicht lineare Funktionen wie sqrt() eingeben, schlägt die Vorberechnung fehl.

Ein eleganterer Weg besteht darin, Ihren Kernsatz von Gleichungen linear zu halten. Ich benutze oft separate Parameter, die durch "Präqualifikationen" berechnet werden, um die wichtigsten Formulierungen sauber und einfach zu halten.

param distance{(f,c) in S} := sqrt(((facilityXs[f] - customerXs[c])**2) + ((facilityYs[f] - customerYs[c])**2); 

minimize total: sum{(f, c) in S} x[f, c] * distance[f,c]); 
+0

Akzeptiert um zu zeigen, wie die Entfernung "Matrix" erstellt wird. (Obwohl ich es in der Zwischenzeit herausgefunden habe) – Xarn

1

Wenn der Ausdruck in sqrt keine Variablen enthält, wird er in der Übersetzungsstufe ausgewertet und als Konstante an den Löser gesendet (Koeffizient x[f, c]).