什么可能导致这个pyomo错误:“错误:将对象评估为数值”?

时间:2017-06-18 05:04:50

标签: pyomo

运行pyomo时偶尔出现此错误:“错误:将对象评估为数值:0.0”。它看起来有点像某些求解器返回时产生的错误,例如,0.0而不是0,然后在使用Var函数的in = Binary关键字参数重新使用结果时会导致错误。我不相信这是这种情况。任何人都可以给我一些关于可能导致此错误的想法吗?我当时正在使用glpk。

这里有更多信息。我正在按顺序解决一个优化问题,一次一天。因此,昨天的解决方案成为今天问题的输入。这是一些简化的代码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强制值为整数和/或非负,具体取决于整数和容差参数。评估force_domain时代码失败;有时会出现上述错误,有时会出现TypeError异常:TypeError:unorderable types:NoneType()< INT()。这是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

这些错误在2000次运行中少于1次。

这些额外信息可以帮助您回答我的问题吗?

1 个答案:

答案 0 :(得分:0)

我设法隔离并重现错误。事实证明,由于GLPK v4.57中的数值不稳定导致了崩溃。这种数值不稳定性似乎已在GLPK v4.60中得到修正。请参阅https://lists.gnu.org/archive/html/info-gnu/2016-04/msg00000.html