2017-06-18 8 views
0

Sehr gelegentlich bekomme ich diesen Fehler beim Ausführen von Pyomo: "FEHLER: Evaluieren Objekt als numerischen Wert: 0.0". Es sieht ein wenig wie der Fehler aus, der sich ergibt, wenn einige Solver zurückgeben, zum Beispiel 0.0 statt 0, und dies führt dann zu einem Fehler bei der Wiederverwendung der Ergebnisse mit dem Beispiel innerhalb = Binär Schlüsselwort Argument der Var-Funktion. Ich glaube nicht, dass dies hier der Fall ist. Kann mir jemand eine Idee geben, was diesen Fehler verursachen könnte? Ich habe zu der Zeit glpk benutzt.Was könnte diesen pyomo-Fehler verursachen: "FEHLER: Objekt als numerischen Wert auswerten"?

Hier sind einige weitere Informationen. Ich löse ein Optimierungsproblem der Reihe nach, Tag für Tag. Die Lösung von gestern wird somit zum Input für das heutige Problem. Hier sind einige vereinfachte Code spinets:

results = manager.solve(instance, kwargs...) 
instance.solutions.load_from(results) 
states_dict = get_next_states(instance, time, args...) 

def get_next_states(instance, time, args...): 
    states_dict = {} 
    for state in states: 
     var = getattr(instance, state) 
     for a in a_list: 
      value = var[a, time].value 
      states_dict[state, a] = force_domain(value, integer, tolerance) 
    return states_dict 

force_domain Kräfte Wert ganze Zahl zu sein und/oder nicht-negativ, abhängig von den Ganzzahl- und Toleranz Argumente. Der Code schlägt fehl, wenn force_domain ausgewertet wird; manchmal mit dem obigen Fehler und manchmal mit einer TypeError-Ausnahme: TypeError: nicht korrigierbare Typen: NoneType() < int(). Hier ist force_domain:

def force_domain(x, integer, nonnegative): 
    y = x 
    if x < 0 and nonnegative: 
     y = chop_tiny(y, nonnegative) 
    if integer: 
     y = round_if_int(y) 
    return y 

def chop_tiny(x, tol): 
    if abs(x) > tol or isinstance(x, int): 
     return x 
    else: 
     return 0.0 

def round_if_int(x): 
    if isinstance(x, float) and (x).is_integer(): 
     return int(x) 
    else: 
     return x 

Diese Fehler treten in weniger als 1 in 2000 ausgeführt.

Hilft Ihnen diese zusätzliche Information, meine Frage zu beantworten?

+1

Willkommen bei StackOverflow! Können Sie bitte den Code angeben, der sich als hilfreich bei der Beantwortung der Frage erweisen wird? Ich schlage vor, [Wie man eine gute Frage stellt] (https://stackoverflow.com/questions/how-to-ask). Beachten Sie auch die [Tour] (https://stackoverflow.com/tour). –

+0

Ja, bitte zeigen Sie etwas Code, damit wir Ihnen eine informiertere Antwort geben können. –

Antwort

0

Ich habe es geschafft, den Fehler zu isolieren und zu reproduzieren. Es stellte sich heraus, dass dies auf eine numerische Instabilität in GLPK v4.57 zurückzuführen war, die zu einem Absturz führte. Diese numerische Instabilität scheint in GLPK v4.60 behoben worden zu sein. Siehe https://lists.gnu.org/archive/html/info-gnu/2016-04/msg00000.html.

Verwandte Themen