Джулия (переход): ограничения индикатора с несколькими условными значениями (возможно ли логическое выражение?)

#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 .