python - DOCPLEX:添加一个对两个变量求和的约束

标签 python error-handling keyerror docplex

我正在通过 DOCPLEX 在 Python 中使用 CPLEX 求解器。

除其他限制外,我想说明以下限制:

 cnrt_10 = {
        (w, w1, j-1, j): opt_model.add_constraint(ct=opt_model.sum(X_var[p, w, c, j-1] for c in range(1, len(operation_cost[w-1]) + 1)) + opt_model.sum(X_var[p1, w1, c, j] 
        for c in range(1, len(operation_cost[w-1]) + 1)) <= 1 + T_var[w, w1, j-1, j], ctname="cnrt10_{0}_{1}_{2}_{3}".format(w, w1, j-1, j)) 
        for w in range(1, len(operation_cost) + 1) 
        for w1 in range(1, len(operation_cost) + 1) 
        for c in range(1, len(operation_cost[w-1]) + 1) 
        for p in range(1, len(operation_cost[w-1][c-1]) + 1) 
        for p1 in range(1, len(operation_cost[w-1][c-1]) + 1) 
        for j in range(2, len(operation_cost[w-1][c-1]) + 1)
        }

我也试着写了下面的。在其中我将每个变量的 sum() 分开:
 cnrt_10 = {
        (w, w1, j-1, j): opt_model.add_constraint(ct=opt_model.sum(X_var[p, w, c, j-1] + X_var[p1, w1, c, j] for c in range(1, len(operation_cost[w-1])) <= 1 + T_var[w, w1, j-1, j], ctname="cnrt10_{0}_{1}_{2}_{3}".format(w, w1, j-1, j)) 
        for w in range(1, len(operation_cost) + 1) 
        for w1 in range(1, len(operation_cost) + 1) 
        for c in range(1, len(operation_cost[w-1]) + 1) 
        for p in range(1, len(operation_cost[w-1][c-1]) + 1) 
        for p1 in range(1, len(operation_cost[w-1][c-1]) + 1) 
        for j in range(2, len(operation_cost[w-1][c-1]) + 1)
        }

但在这两种情况下,我都会收到 KeyError。我想在这种情况下,这意味着我正在寻找一个不存在的 key 。

我声明了一个类似的约束,它不需要函数 sum 并且运行良好,没有返回错误:
cnrt_11 = {
    (w, c, c1, j-1, j): opt_model.add_constraint(ct=X_var[p, w, c, j-1] + X_var[p1, w, c1, j] <= 1 + A_var[w, c, c1, j-1, j],
                                                 ctname="cnrt10_{0}_{1}_{2}_{3}_{4}".format(w, c, c1, j-1, j))
    for w in range(1, len(operation_cost) + 1) 
    for w1 in range(1, len(operation_cost) + 1)
    for c in range(1, len(operation_cost[w-1]) + 1) 
    for c1 in range(1, len(operation_cost[w-1]) + 1)
    for p in range(1, len(operation_cost[w-1][c-1])+1) 
    for p1 in range(1, len(operation_cost[w-1][c-1])+1) 
    for j in range(2, len(operation_cost[w-1][c-1]) + 1)
    }

因此,我假设问题出在使用 sum() 函数对两个变量求和时。

有人可以帮我解决这个问题吗?我看到 docplex 中还有其他类型的 sum() 函数,但我不知道哪一个更适合我的情况。

提前致谢,

最佳答案

KeyError 意味着您尝试使用未知的元组键访问 X_var 字典,因此有助于了解您如何构建 X_var 字典。 Model.sum() 不是这里的问题。

查看带有 KeyError 的消息也会有所帮助:您应该看到导致错误的元组。

关于python - DOCPLEX:添加一个对两个变量求和的约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58484654/

相关文章:

python - 如何执行多查询 fql 语句?

java - 在 ANTLR4 中遍历解析树时处理错误的惯用方法是什么?

python-3.x - 我的 python 代码中有一个错误 key 错误 ['logo_url' ] 不在索引中

Python 的 C++ 名称修改库

python - 无法弄清楚如何让 BS4 检索/videos 页面上的 youtube 观看次数

reactjs - 我正在尝试通过 yarn 运行 react 项目,但它给了我错误我现在该怎么办?

python - Pandas 错误 : __setitem__() doesnt recognize dictionary values as a list of column names

python: pandas.DataFrame,如何避免keyerror?

python - 转移到Python?

PowerPoint 中功能区的 VBA 仅在使用 SaveAs/SaveCopyAs 后工作一次