Как определить ограничение, зависящее от последовательности?

Я хочу смоделировать ограничение, где я хочу сказать, если режим 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);
    }
;}

person Alex    schedule 23.04.2019    source источник
comment
Привет, вы пробовали sameSequence? noreferrer"> noreferrer. ibm.com/support/knowledgecenter/en/SSSA5P_12.9.0/   -  person Alex Fleischer    schedule 23.04.2019
comment
Привет, Алекс, в моем случае я хочу запустить другой режим (m2) в другой последовательности, например, mchs [2] после того, как mchs [1] в последовательности mchs [1] завершится. Это работает с sameSequence ??   -  person Alex    schedule 23.04.2019


Ответы (1)


Конечно, вы можете опубликовать ограничение вроде (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))? и т.п.

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

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

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

  • кажется, что для данной машины M, если мы обозначим 'op_i1' -> 'op_i2' -> 'op_i3'… последовательность операций на машине, то соответствующие подготовительные действия 'Prep_i1', 'prepare_i2', 'prepare_i3 ',… Также должны быть заказаны таким же образом (даже если они не обязательно выполняются на одной машине). Это правда? А также может быть так, что вам дополнительно нужен порядок: «Prep_i1» -> «op_i1» -> «Prep_i2» -> «op_i2» -> «Prep_i3» -> «op_i3»…?
  • если нет, и если проблема заключается только в том, что подготовительные действия "Prep_i" дополнительно требуют некоторых дополнительных ресурсов, доступных в ограниченном количестве, почему бы вам просто не смоделировать эти дополнительные ресурсы с помощью функции cumul (или другого noOverlap, если вам также необходимо обрабатывать распределение этих ресурсов), чтобы ограничить количество подготовительных действий, которые могут выполняться параллельно?
person Philippe Laborie    schedule 24.04.2019
comment
Итак, в моем случае каждое задание состоит из двух режимов (m1 = предварительная подготовка и m2 = сама операция). Подготовку можно выполнить как на машине (1), так и на другой машине (2). Итак, я хочу заморозить модель, согласно которой подготовка следующего задания (j2) не может быть запущена на параллельной машине (2), пока не завершен режим работы 2 job1. Допустим, это связано с тем, что у вас есть только ограниченное количество саффов, но со следующим кодом он не работает. Итак, это скомпилировано, но не сделано. В чем моя ошибка? - person Alex; 24.04.2019
comment
forall (m1 в режимах, m2 в режимах, m3 в режимах: m1.opId == 2 && m2.opId == 3 && m3.opId == 4 && m1.mch == m2.mch && m1.mch == 1 && m2 .mch == 2) {(endOf (mode [m1]) ‹= startOf (mode [m3])) =› (endOf (mode [m1]) ‹= startOf (mode [m2])); } - person Alex; 24.04.2019