2016-12-23 3 views
0

Versuchen, eine einfache lineare Funktion mit Linprog zu minimieren. Die Koeffizienten sind die Elemente von arr2 multipliziert mit -1. Es gibt nur Ungleichheitsbedingungen für jede Variable, wie zum Beispiel -1 < = x1 < = 1, -2 < = x2 < = 2 und so weiter.Python SciPy Linprog Optimierung schlägt fehl mit Status 3

Wenn ein nicht wählen Grenzen in linprog angeben:

from scipy.optimize import linprog 
import numpy as np 
import pandas as pd 

numdim = 28 

arr1 = np.ones(numdim) 
arr1 = - arr1 

arr2 = np.array([ 
19.53, 
128.97, 
3538, 
931.8, 
0.1825, 
150.88, 
10315, 
0.8109, 
3.9475, 
3022, 
31.77, 
10323, 
110.93, 
220, 
2219.5, 
119.2, 
703.6, 
616, 
338, 
84.67, 
151.13, 
111.28, 
29.515, 
29.67, 
158800, 
167.15, 
0.06802, 
1179 
]) 

constr_a = [] 

for i in range(numdim): 

    constr_default = np.zeros(numdim) 
    constr_default[i] = 1 
    constr_a.append(constr_default) 

for i in range(numdim): 

    constr_default = np.zeros(numdim) 
    constr_default[i] = -1 
    constr_a.append(constr_default) 

constr_a = np.asarray(constr_a) 
constr_b = np.arange(1, 2*numdim + 1, 1) 
constr_b[numdim:] = constr_b[:numdim] 

print linprog(np.transpose(arr1 * arr2), constr_a, constr_b, bounds=(None, None)) 

ich folgendes Ergebnis:

Spaß: -4.327.476,2887400016 Meldung: ‚Optimierung fehlgeschlagen. Das Problem scheint unbegrenzt zu sein. " Status: 3

habe ich versucht, auf die letzte Zeile zu ändern:

print linprog(np.transpose(arr1 * arr2), constr_a, constr_b, bounds=(-1000, 1000)) 

die Zahlen als Grenzen festgelegt sind zufällig. Die Ausgabe lautet:

Spaß: -4.327.476,2887400296 Nachricht: 'Optimierung erfolgreich beendet.' Status: 0

, die uns ein etwas anderes Ergebnis und den gewünschten Status gibt. Meine Frage ist, missbrauche ich die Bibliothek und auf welche Weise? Welche Antwort ist richtig? Es wurde erwartet, dass dieser Code funktioniert, ohne den Parameter 'bounds' anzugeben. Ich kann diesen Parameter nicht verwenden, da diese einfachen Einschränkungen für jede Variable eindeutig sind.

Ich benutze Python 2.7 und Scipy 0.17.1. Vielen Dank im Voraus.

Aktl

constr_a sollte eine Matrix gemäß der Dokumentation (https://docs.scipy.org/doc/scipy/reference/optimize.linprog-simplex.html) und ist eigentlich im Code. Um sicher zu gehen, dass die Syntax korrekt ist, können wir die Anzahl der Dimensionen auf 2:

und dies wird funktionieren.

Antwort

0

Die constr_a Liste ist nicht richtig gebildet. Es ist ein Array von Arrays, anstatt ein Array von Skalaren zu sein. Dies könnte zu einer falschen unteren Grenze führen, wodurch die Optimierung fehlschlägt.

Vielleicht sollte

constr_a.append(constr_default) 

sein
constr_a.append(constr_default[i]) 

inspizieren sowohl die gebundenen Arrays sicherzustellen, dass sie die richtige Form und Werte haben.

+0

'constr_a' ist eine Matrix (2n, n), unbekannte Variablen Array ist (n, 1), Matrix-Multiplikation ergibt Array' constr_b', was (2n, 1) ist. Scheint mir, kein Fehler hier. – Inna

+0

@Inna drucken und überprüfen Sie die ersten paar Elemente von 'constr_a' – tihom

+0

Vielen Dank für Ihre Vorschläge. Beantwortet in der Post. – Inna

Verwandte Themen