Wie kann ich die Solver-Funktionalität von Microsoft Excel (GRG Nonlinear) in C # emulieren?

9

Ich habe ein nichtlineares Optimierungsproblem mit Einschränkungen. Es kann in Microsoft Excel mit dem Solver-Add-In gelöst werden, aber ich habe Probleme beim Replizieren in C #.

Mein Problem wird in der folgenden Tabelle angezeigt. Ich löse das klassische A x = b Problem, aber mit der Einschränkung, dass alle Komponenten von x nicht-negativ sein müssen. Anstatt also die Standard-Lineare Algebra zu verwenden, setze ich Solver mit der nicht-negativen Einschränkung ein, minimiere die Summe der quadrierten Differenzen und erhalte eine vernünftige Lösung. Ich habe versucht, dies in C # zu replizieren, entweder mithilfe von Microsoft Solver Foundation oder < a href="http://www.solver.com/sdkplatform.htm"> Solver SDK . Jedoch kann ich mit ihnen nirgendwohin kommen, weil ich mit MSF nicht herausfinden kann, wie man das Ziel definiert, und mit dem Solver SDK bekomme ich immer den Status "optimal" und eine Lösung aller 0s, die definitiv nicht einmal lokal ist Minimum.

Hier ist mein Code für Solver SDK:

%Vor%

Ich habe keinen Code für Microsoft Solver Foundation, weil ich nicht glaube, dass die Zielfunktion in einer einzigen Zeile geschrieben werden kann und Delegaten wie Solver SDK nicht erlaubt.

    
Craig W 03.07.2012, 00:45
quelle

1 Antwort

2

Eine Alternative wäre, dies als LP-Problem zu formulieren:

Minimiere die Summe der Elemente in x

unterliegt Ax & gt; = b

Dies sollte relativ einfach mit Solver Foundation basierend auf einem der LP-Samples formuliert werden.

UPDATE JULI 5

Der obige Ansatz sieht auch zu komplex aus, aber vielleicht liegt das an der Frontline Solver API. Verwenden Sie Microsoft Solver Foundation, und die Summe der quadrierten Unterschiede zu minimieren, das folgende Programm:

%Vor%

erzeugt die folgende Lösung, die mit der Lösung aus der verknüpften Excel-Tabelle übereinstimmen sollte:

%Vor%

Wenn ich mich nicht irre, kann Solver Foundation im Gegensatz zu GRG allgemeine nichtlineare Constraints nicht sofort unterstützen, ich glaube, dass Sie zusätzliche Plug-Ins benötigen, um diese zu handhaben. Für dein Problem ist das natürlich kein Problem.

Um die Vollständigkeit des LP-Problems zu formulieren, tauschen Sie den Code zwischen START NLP SECTION und END NLP SECTION mit dem folgenden Code aus:

%Vor%

ergibt die folgende Ausgabe (beachten Sie, dass die Zielfunktionen in den beiden Fällen unterschiedlich sind, daher die großen Unterschiede in f ):

%Vor%     
Anders Gustafsson 03.07.2012, 19:52
quelle