【问题标题】:Find the right Google OR-Tools algorithm找到合适的 Google OR-Tools 算法
【发布时间】:2022-01-20 02:35:04
【问题描述】:

我必须找到最小化这个目标函数的integers 集合:

成本约束是:

  • 每个x 必须是非负的integer

TABdouble 已知数字。

为了解决这个问题,我一直在研究 OR-Tools C++ 库,特别是 CP-SAT 求解器。

  • 它是解决此类问题的正确工具吗?
  • 如果是,将目标函数中的所有double 转换为int 是否可行?
  • 如果不是,您还有什么建议? (我也对其他开源 C++ 库开放)

【问题讨论】:

  • btw 带有黑色文字的透明图片不能很好地配合深色主题

标签: c++ or-tools cp-sat-solver


【解决方案1】:

它将适合 CP-SAT 求解器。您需要将浮点系数缩放为整数。

目标函数接受浮点系数。 但是,如果保持这种方式而不是 A1^2 + 2 * A1 * x1 + x1^2,则 (x1 + A1)^2 会传播得更好。如果您使用临时变量 sx1 = x1 * x1,则符合 CP-SAT 的线性双系数限制。

然后确保为此使用至少 8 名工人。 (参数 num_search_workers:8)。

现在,我相信有更适合此的最小二乘求解器。

【讨论】:

  • 你确定我可以在目标函数中使用小数吗?这来自指南:“为了提高计算速度,CP-SAT 求解器在整数上工作。这意味着所有约束和目标都必须具有整数系数。”这意味着通过将系数乘以一些 n*10 来消除十进制值,我需要在 X 中添加一个约束以仅接受整数解
  • 自上一个版本以来,目标函数本机接受带有整数变量的浮点系数。
  • 所以在那种情况下我会最小化 obj func 2A1x1 + sx1 ... ,对吗?如何创建变量 sx1 并使其等于 x1 * x1?
  • 使用 model.AddMultiplicationEquality().
  • 但我会做model.AddMultiplicationEquality(t1, [1000 * a1 + 1000 * x1, 1000 * a1 + 1000 * x1])model.Add(sum(1000 * bi * ai) <= 1000 * Tmodel.Minimize(sum(ti) * 1.0 / 1e6)
猜你喜欢
  • 2019-04-28
  • 2021-01-05
  • 2022-06-30
  • 2015-03-05
  • 2020-04-21
  • 2021-10-15
  • 2019-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多