python - 是否可以仅使用一个整数变量使用 or-tools 来计算 argmax?

标签 python or-tools

部分模型目标由标量列表中的项目加权。

我通过使用 0-1 范围变量的列表来解决这个问题,然后使用 LinearExpr.ScalProd 来加权目标。

有没有办法只用一个整数变量(目标变量除外)来做到这一点,我可以在其中使用 lambda 或其他一些机制来查找表中变量的值?

这是我的一些示例代码,尽管我正在尝试确定它是否可以变得更简洁。

def argmax(
    model: cp_model.CpModel, values: List[int]
) -> Tuple[List[cp_model.IntVar], cp_model.IntVar]:
    objective_var = model.NewIntVar(0, 1000000, "objective_var")
    ret_vars = [model.NewIntVar(0, 1, "x(%i)" % i) for i in range(len(values))]
    model.Add(sum(ret_vars) == 1)
    model.Add(objective_var == cp_model.LinearExpr.ScalProd(ret_vars, values))

    return [ret_vars, objective_var]

最佳答案

这可以使用 model.AddElement 来完成。

def AddElement(self, index, variables, target)

我发现 AddElement 的文档有点晦涩难懂,所以我会尝试用我认为更简单的术语来整理它。

它声明:添加元素约束:variables[index] == target。

  • 索引 -> 您要查找的变量。
  • 变量 -> 查找值表。
  • 目标 -> 您希望它等于的值。

如果有的话,阅读 C++ 代码会使它更容易理解。

Constraint CpModelBuilder::AddElement(IntVar index,
                                      absl::Span<const int64> values,
                                      IntVar target) {

将所有这些放在一起,我们得到:

def argmax(
    model: cp_model.CpModel, values: List[int]
) -> Tuple[cp_model.IntVar, cp_model.IntVar]:
    objective_var = model.NewIntVar(0, 1000000, "objective_var")
    ret_var = model.NewIntVar(0, len(values) - 1, "x")
    model.AddElement(ret_var, values, objective_var)

    return [ret_var, objective_var]

关于python - 是否可以仅使用一个整数变量使用 or-tools 来计算 argmax?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57010302/

相关文章:

python - 使用 vim 编码 python 时自动缩进不起作用

python - 在 or-tools python 中向调度问题添加软约束

python - 如果特定列中的值不是 pandas 数据框中的整数,则删除行

python - or-tools:简单的问题在 cpp 中不可行,但在 python 中有效

python - OR 针对 Protocol Buffer 版本 3.5.1 编译的工具,与已安装的版本不兼容

python - N 皇后区对称性破坏 Google OR 工具

java - 使用 Makefile 使用 Gradle 编译模块

具有多个误差条的 Python 线性拟合

python - 如何使用 python 二进制分发发送数据文件?

python - 在 Django 1.8 的 Mysql 中使用自定义用户数据库结构