【问题标题】:Gecode: constraining integer variables using a float valueGecode:使用浮点值约束整数变量
【发布时间】:2019-03-14 10:41:25
【问题描述】:

我通过它的C++ API 使用Gecode 在一种带有正面和负面例子的学习环境中。 在这种情况下,我有两个BoolVarArraypositive_bags_negative_bags_

而我想做的似乎很简单:我想根据用户参数gmin 以最小的增长率约束来约束这些袋子。

因此,约束应如下所示:sum(positive_bags_) >= gmin * sum(negative_bags_)。 它使用rel 函数定义如下:rel(*this, sum(positive_bags_) >= gmin * sum(negative_bags_)) 但我的问题是在我的情况下gmin 是一个浮点数,但被rel 转换为整数。

因此,我只能将 positive_bags_ 限制为 23、... 比 negative_bags_ 大几倍,但我需要在实验中将 gmin 定义为 1.5

我检查了文档并没有找到同时使用Boolean/IntegerFloat 变量的linear 的定义。

有没有办法使用浮点gmin 来定义这个约束?

提前致谢!

【问题讨论】:

  • 请指向“sum”方法的文档。似乎您的变量正在被隐式转换,这会产生问题。

标签: c++ constraint-programming gecode


【解决方案1】:

如果您的因子gmin可以表示为一个相当小的有理n/d(在您的示例中为3/2),那么您可以使用

d * sum(positive_bags_) >= n * sum(negative_bags_)

作为你的约束。如果没有合适的小理性,那么您需要将您的变量channel 到 FloatVars 并使用 FloatVar linear constraint

【讨论】:

    【解决方案2】:

    如果隐式类型转换是一个问题,您可以尝试:

    (float) sum(positive_bags_) >= (gmin * (float) sum(negative_bags_))
    

    假设 gmin 是一个浮点数。

    隐式转换会将您的浮点数转换为整数。如果您想控制要应用的舍入类型,请将结果包装到 <math.h>roundf 或根据类型选择的舍入函数。

    【讨论】:

    • Sum 是 Gecode 中的一个函数,它(在这种情况下)返回一个 IntExpr,它不能转换为浮点数。
    • 我就是这么想的,但是我在gecode网站上找不到文档,所以我要求一个链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多