Как создавать/опубликовать и удалить/удалить ограничения во время поиска в Choco

У меня есть проект в Choco Solver, но у меня есть вопрос о внешних эффектах при поиске.

У меня есть график планирования с (скажем) BoolVars, организованными по слоям, и длительностью, назначенной слоям, что означает, что некоторые действия начинаются, а некоторые заканчиваются. Выбор переменных статичен от конца плана до начала плана (выбор действий в слое произвольный).

Я изучаю решение, которое использует симплексный алгоритм, чтобы помочь с назначением продолжительности, так как между началом и концом действия A нам нужно иметь продолжительность, равную N. Между ними есть еще некоторые ограничения.

Дополнительные ограничения создаются на основе экземпляров BoolVars, однако они организованы во внешней матрице, поэтому при добавлении завершающего действия действия A в результате добавляется дополнительная строка матрица и текущие ограничения переформулированы. При возврате мы хотели бы изменить матрицу в обратном порядке, то есть удалить строку и отменить ограничения.

Есть ли способ реализовать это сложное поведение в Choco?


person Eramol    schedule 09.04.2017    source источник


Ответы (1)


Знаете ли вы заранее, какое ограничение сработает, если для логического значения установлено значение true? Если да, используйте реификацию (создайте ограничение в начале, но свяжите его с булевыми переменными, а не публикуйте их).

Для получения профессиональной поддержки по Choco Solver вы можете обратиться по адресу https://www.cosling.com/.

person Jean-Guillaume Fages    schedule 19.04.2017
comment
овеществление не решает этого, к сожалению. Я широко использую его в своей модели, но это что-то другое. Он запускает внешнее действие при создании экземпляра и запускает обратное действие при возврате. - person Eramol; 19.04.2017
comment
1) вы должны иметь возможность динамически создавать и публиковать ограничения, используя Solver._post(false,c), чтобы они удалялись при откате (см. javadoc). 2) вы также можете инициировать настраиваемое действие (например, покрасить кнопку в красный цвет и вернуть ее в зеленый цвет при возврате), используя IOperation: IOperation(color in ref))... вы можете использовать lamda... этот код будет вызываться при возврате. В вашем случае вы будете добавлять/удалять строки вместо раскрашивания, я просто хотел показать, что вы действительно можете делать что угодно. Я чист? :-) - person Jean-Guillaume Fages; 20.04.2017