Gecode: ограничение целочисленных переменных с использованием значения с плавающей запятой - PullRequest
0 голосов
/ 14 марта 2019

Я использую Gecode через C++ API в своего рода учебном контексте с положительными и отрицательными примерами.В этом контексте у меня есть два BoolVarArray: positive_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_ только 2, 3, ... раз больше, чем negative_bags_, но мне нужно, чтобы в моих экспериментах было определено, например, gmin как 1.5,

Я проверил документацию и не нашел определения linear, в котором используются переменные Boolean / Integer и Float.

Есть ли способ определить это ограничение с помощью числа с плавающей запятой gmin?

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 14 марта 2019

Если ваш коэффициент gmin можно выразить как достаточно малое рациональное n/d (3/2 в вашем примере), то вы можете использовать

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

в качестве ограничения.Если нет подходящего небольшого рационального аргумента, вам нужно направить ваши переменные в FloatVars и использовать линейное ограничение FloatVar .

0 голосов
/ 14 марта 2019

Если неявное приведение типов является проблемой, вы можете попробовать:

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

Предполагая, что gmin является float.

Неявное приведение преобразует ваш float в int.Если вы хотите контролировать, какой тип округления вы хотите применить, оберните результат в <math.h> s roundf или функцию округления по вашему выбору в зависимости от типа.

...