2017-06-18 2 views
0

Très rarement j'obtiens cette erreur lors de l'exécution de pyomo: "ERREUR: évaluation de l'objet comme valeur numérique: 0.0". Cela ressemble un peu à l'erreur qui se produit lorsque certains solveurs retournent, par exemple, 0.0 au lieu de 0, ce qui conduit à une erreur lors de la réutilisation des résultats avec, par exemple, within = argument binaire de la fonction Var. Je ne crois pas que ce soit le cas ici. Quelqu'un peut-il me donner quelques idées sur ce qui peut causer cette erreur? J'utilisais glpk à l'époque.Ce qui pourrait causer cette erreur pyomo: "ERREUR: évaluation de l'objet comme valeur numérique"?

Voici quelques informations supplémentaires. Je résous un problème d'optimisation de manière séquentielle, un jour à la fois. Donc, la solution d'hier devient une contribution au problème d'aujourd'hui. Voici quelques spinets de code simplifié:

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 valeur forces à entier et/ou non négatif, en fonction des arguments entiers et tolérance. Le code échoue lors de l'évaluation de force_domain; parfois avec l'erreur ci-dessus, et parfois avec une exception TypeError: TypeError: types non modifiables: NoneType() < int(). Voici 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 

Ces erreurs se produisent dans moins de 1 dans 2000 exécutions.

Est-ce que cette information supplémentaire vous aide à répondre à ma question?

+1

Bienvenue dans StackOverflow! Pouvez-vous s'il vous plaît fournir le code car il s'avérera utile pour répondre à la question. Je suggère de lire [Comment poser une bonne question] (https://stackoverflow.com/questions/how-to-ask). Assurez-vous également de prendre le [tour] (https://stackoverflow.com/tour). –

+0

Oui, s'il vous plaît montrer un code afin que nous puissions vous donner une meilleure réponse. –

Répondre