Gecode:使用浮点值限制整数变量

Gecode: constraining integer variables using a float value

本文关键字:整数 变量 Gecode      更新时间:2023-10-16

i在具有正面和负面示例的学习上下文中,通过其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的定义。

是否有某种方法可以使用Float gmin定义此约束?

预先感谢!

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

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

作为您的约束。如果没有合适的理性,那么您需要将变量引导到floatvars并使用floatvar线性约束。

如果隐式类型铸造是一个问题,则可以尝试:

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

假设Gmin是浮点。

隐式铸造将使您的浮子转换为int。如果要控制要应用哪种类型的舍入,请将结果包装到<math.h>roundf或您选择的圆形功能中,具体取决于类型。