Ortools 无法评估 LinearExpr 边缘情况

问题描述 投票:0回答:1

我在 CP 模型中遇到了特定的边缘情况。我所有的变量都是基于 int 的,但目标是基于 float 的。

在我的模型的大量使用中,这样做没有问题。但在一个特定的实例中,我在评估目标时遇到了错误。

评估函数出现错误:

# The librairie function
def evaluate_linear_expr(
    expression: LinearExprT, solution: cp_model_pb2.CpSolverResponse
) -> int:
    """Evaluate a linear expression against a solution."""
    if isinstance(expression, IntegralTypes):
        return int(expression)
    if not isinstance(expression, LinearExpr):
        raise TypeError("Cannot interpret %s as a linear expression." % expression)

    value = 0
    to_process = [(expression, 1)]
    while to_process:
        expr, coeff = to_process.pop()
        if isinstance(expr, IntegralTypes):
            value += int(expr) * coeff
        elif isinstance(expr, _ProductCst):
            to_process.append((expr.expression(), coeff * expr.coefficient()))
        elif isinstance(expr, _Sum):
            to_process.append((expr.left(), coeff))
            to_process.append((expr.right(), coeff))
        elif isinstance(expr, _SumArray):
            for e in expr.expressions():
                to_process.append((e, coeff))
            value += expr.constant() * coeff
        elif isinstance(expr, _WeightedSum):
            for e, c in zip(expr.expressions(), expr.coefficients()):
                to_process.append((e, coeff * c))
            value += expr.constant() * coeff
        elif isinstance(expr, IntVar):
            value += coeff * solution.solution[expr.index]
        elif isinstance(expr, _NotBooleanVariable):
            value += coeff * (1 - solution.solution[expr.negated().index])
        else:
            # It raises here !
            raise TypeError(f"Cannot interpret {expr} as a linear expression.")

    return value

错误:

TypeError: Cannot interpret 4000000.0 as a linear expression.

这是我在调试中看到的内容:

> expression
(7.209805335255949e-08 * (((((((3000 * (VAR300 + (quotient + has_remainder))) + (93000 * VAR879)) + (60000 * VAR300)) + ((1500 * VAR564) + (25000 * VAR780))) + ((2000 * VAR578) + (140000 * VAR781))) + ((9570.300000000001 * VAR832) + (40000 * VAR882))) + 4000000.0))

> type(expression)
<class 'ortools.sat.python.cp_model._ProductCst'>

> type(expr)
<class 'float'>

我觉得应该由图书馆处理...或者我做错了什么?

使用的版本:Python 3.9.0;或工具 9.11.4210

python or-tools constraint-programming
1个回答
0
投票

LinearExprT 不能包含浮点值。

有一个 ObjLinearExprT 可以实现这一点。但它没有评估器功能。

© www.soinside.com 2019 - 2024. All rights reserved.