#boolean #julia #julia-jump
#логическое #джулия #джулия-прыжок
Вопрос:
Я хочу реализовать ограничение в зависимости от изменения значений в моей двоичной переменной решения, x
, с течением «времени».
Я пытаюсь реализовать ограничение минимального рабочего времени для задачи оптимизации затрат на единицу для энергосистем. x
представляет активацию блока, где 0
и 1
показывает, что блок питания, n
, в определенное время, t
, соответственно, отключен или включен.
Для этого ограничения индикатора кажутся многообещающим решением, и с вдохновением от подобной проблемы реализация казалась довольно простой.
Итак, поскольку введены логические операторы ( !
и ¬
), я преждевременно хотел выразить изменение логическим способом:
@constraint(m, xx1[n=1:N,t=2:T], (!x[n,t-1] amp;amp; x[n,t]) => {next(t, 1) next(t, 2) == 2})
Говоря: если модуль был деактивирован раньше, но теперь включен, затем потребуйте, чтобы модуль был активен в течение следующих 2 раз.
Где next(t, i) = x[((t - 1 i) % T) 1]
.
Я получил следующую ошибку:
LoadError: MethodError: no method matching !(::VariableRef)
Closest candidates are:
!(!Matched::Missing) at missing.jl:100
!(!Matched::Bool) at bool.jl:33
!(!Matched::Function) at operators.jl:896
Я проверил, что ограничение индикатора работает правильно только с одним термином.
Вопрос: Возможно ли это или есть другое очевидное решение?
Устранение неполадок и обходные пути: я попробовал следующее (пожалуйста, поправьте меня, если мой диагноз неверен):
- Реализовать изменение как выражение: ограничения индикатора работают только с двоичными целочисленными переменными.
- Реализовать изменение как другую переменную, относящуюся к
x
. Я нашел решение, но оно довольно схематичное, что задокументировано в беседе с Джулией. Непосредственная проблема, обнаруженная из решения, заключается в том, что ограничения индикатора работают не как двунаправленные, а только в одну сторону,LHS->RHS
. Пожалуйста, ознакомьтесь с правильным подходом, предложенным @Oscar Dowson.
Вы можете получить рабочий код с github.
Комментарии:
1. Пожалуйста, добавьте ссылку, если вы размещаете перекрестную публикацию: discourse.julialang.org/t /…
2. Отмечено! Большое спасибо за вашу постоянную поддержку на обоих сайтах.
Ответ №1:
Хитрость заключается в том, чтобы найти ограничения, которые имеют эквивалентную таблицу истинности:
# Like
(!x[1] amp;amp; x[2]) => {z == 1}
# Is equivalent to:
z >= -x[1] x[2]
# Proof
-x[1] x[2] = sum <= z
--------------------------
- 0 0 = 0 <= 0
- 1 0 = -1 <= 0
- 0 1 = 1 <= 1
- 1 1 = 0 <= 0
Мне порекомендовали MOSEK Modeling Cookbook, чтобы помочь выработать правильную формулировку ограничений.
Смотрите, В конце концов, Поток здесь, откуда я получил ответ для получения дополнительной информации.
Комментарии:
1. Третья строка в
sum
столбце должна гласить1
.