Gecode: ограничение целочисленных переменных с использованием значения с плавающей точкой

#c #constraint-programming #gecode

#c #ограничение-программирование #gecode

Вопрос:

Я использую 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 ?

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

Комментарии:

1. Пожалуйста, укажите на документацию по методу ‘sum’. Кажется, что ваши переменные неявно преобразуются, что создает проблему.

Ответ №1:

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

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

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

Ответ №2:

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

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

Предполагая, что gmin является значением с плавающей точкой.

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

Комментарии:

1. Sum — это функция в Gecode, которая (в данном случае) возвращает значение IntExpr, которое не может быть приведено к значению с плавающей точкой.

2. Это то, о чем я думал, но я не смог легко найти документ на сайте gecode, поэтому я попросил ссылку.