#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, поэтому я попросил ссылку.