Как определить зависимое от последовательности ограничение? - PullRequest
1 голос
/ 23 апреля 2019

Я хочу смоделировать ограничение, в котором я хочу сказать, если режим mode1 запланирован для последовательности перед другим режимом mode2, тогда режим mode3 на параллельной рабочей машине (то есть в другой последовательности) не можетначинаться до конца mode1 в другой последовательности.Так что более или менее я хочу закодировать блок if (before ...) для этого.Как это работает правильно?

forall(m1 in Modes, m2 in Modes, m3 in Modes: 
       m1.opId==1 && m2.opId==2 && 
       m3.opId==3 && m1.mch==m2.mch==1) {
    if (before(mchs[1], modes[m1], modes[m3]) == 1) {
        endBeforeStart(modes[m1],modes[m2);
    }
;}

1 Ответ

1 голос
/ 24 апреля 2019

Конечно, вы можете разместить ограничение как (H - большое число):

(endOf(mode1,H) <= startOf(mode2,-H)) => (endOf(mode1,-H) <= startOf(mode3,H))

Объяснение:

  • если mode1, mode2и mode3 все присутствуют, ограничение: (endOf(mode1) <= startOf(mode2)) => (endOf(mode1) <= startOf(mode3))
  • , если mode1 или mode2 отсутствует, из-за констант H левая сторона импликации ложна, поэтомурежим без ограничений3
  • , если отсутствует mode1 или mode3, правая часть импликации верна, поэтому она не ограничивает mode2

Теперь, если выесть много триплетов (mode1,mode2,mode3), на которых распространяется это ограничение, будет очень полезно рассмотреть более глобальную формулировку, которая также использует другие ограничения проблемы: что общего у mode2 и mode3, так что если mode2выполняется после mode1, затем mode3 также должно выполняться после?Есть ли какая-то другая временная зависимость между mode2 и mode3?Есть ли какие-то логические ограничения внизу (например, presenceOf(mode1)==presenceOf(mode2))?и т.д.

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

  • каждая работа, которую я состоит из двух действий: 'prep_i', за которой следует 'op_i'
  • и операции 'подготовка' и 'операция' должны быть выделены длянекоторые машины (машина может выполнять только одно действие за один раз)
  • возможно, что «подготовка» и «операция» данного задания выполняются на одной и той же машине, но это не требуется

Теперь, что еще не ясно:

  • кажется, что для данной машины M мы обозначаем 'op_i1' -> 'op_i2' -> 'op_i3'…последовательность операций на машине, а затем соответствующие подготовительные операции 'prep_i1', 'prep_i2', 'prep_i3',… также должны быть упорядочены таким же образом (даже если они не обязательно выполняются на одной машине).Это правда?А также может случиться так, что вы дополнительно захотите упорядочить: 'prep_i1' -> 'op_i1' -> 'prep_i2' -> 'op_i2' -> 'prep_i3' -> 'op_i3'…?
  • , если нети если проблема только в том, что для подготовительных действий 'prep_i' дополнительно требуются некоторые дополнительные ресурсы, доступные в ограниченном количестве, почему бы вам просто не смоделировать эти дополнительные ресурсы с помощью функции cumul (или другого noOverlap, если вам также необходимо обрабатыватьвыделение этих ресурсов) для ограничения количества подготовительных мероприятий, которые могут выполняться параллельно?
...