Как определить переменную решения с индексом, зависит от другого индекса той же переменной решения? - PullRequest
1 голос
/ 25 мая 2019

Представьте себе, что существует машинная среда с 5 этапами производства, и каждый из этих этапов содержит различное количество идентичных машин (так называемый цех с гибким потоком).

Теперь есть задания, которые нужно запланировать.Все задания должны начинаться на этапе 1 и обрабатываться на этапах производственной среды от этапа 1 до этапа 5. На каждом этапе только одна машина должна работать над одним заданием.Для каждой дополнительной работы требуется только максимум один компьютер на каждом этапе (некоторые задания могут пропустить этап 4, поскольку их там не нужно готовить).

У меня есть 2 ограничения с переменной решения x [j] [i] [f].

Первый говорит, что каждое задание может быть обработано макс.одна машина на сцену.Второй говорит, что каждая машина может обрабатывать только макс.одна работа одновременно.

Теперь моя задача - определить переменную решения, потому что количество машин f зависит от стадии i.Т.е.:

  • ступень i = 1: m [1] = 3 машины
  • ступень i = 2: m [2] = 2 машины
  • ...и т. д.

Таким образом, верхняя граница (т. е. m [i]) суммы обоих ограничений C5 и C6 зависит от значения i.

     // Indices
     int Nmax = ...; 
    range N = 1..Nmax; // jobs j in N

     int Mmax = ...;
    range M = 1..Mmax; // stages i in M
        {int} m[M]  = [{1,2,3},{1,2},{1,2,3,4,5},{1},{1,2,3}]; // Numbers of machines per stage
        {int} F = union(i in M) m[i];

       //decision variables:
         dvar int+ S[N][M]; // starting time of job j in stage i
         dvar int+ E[N]; // earliness of job j
         dvar int+ T[N]; // tardiness of job j.
         dvar boolean x[N][M][F]; // decision variable

      // objective function
      dexpr float Costs = sum(j in N) (E[j] + T[j]);
      minimize Costs

     subject to{
     C5: forall (j in N, i in M) sum(f in m[i])  x[j][i][f] <= 1;
     C6: forall(i in M, f in m[i]) sum(j in N)   x[j][i][f] <= 1;           
     }

К счастью, у меня больше нет сообщений об ошибках.Но кажется, что CPLEX не понимает, что число машин принадлежит этапам.

Например: как решение для переменной решения x [j] [i] [f] я получил семь 5x5-матрицы.Таким образом, одна матрица для каждой работы, которая на первый взгляд кажется правильной.Но все значения матриц равны нулю.Более того, cplex запланировал задания на этапе 2 таким образом, чтобы было как минимум 3 параллельных компьютера, но их было всего 2 ...

1 Ответ

0 голосов
/ 26 мая 2019

Я предполагаю, что

{int} m[M]  = [{1,2,3},{1,2},{1,2,3,4,5},{1},{1,2,3}];

означает, что на первом этапе доступны машины 1,2,3, на втором этапе доступны машины 1,2 и т. Д.

Поскольку вы используете F, а не m[i] в качестве индекса для x, это означает, что у вас слишком много переменных (слишком много опций) на этапах, на которых не активны все машины. Это можно исправить, принудительно установив нулевую переменную, соответствующую недоступным компьютерам (непроверенный код):

forall (stage in M)
  forall (job in N)
    forall (machine in F : !(machine in m[stage]))
      x[job][machine][stage] == 0;

Это позволяет только машинам, указанным в m, обрабатывать любые задания на этапе. При этом ваши ограничения C5 и C6 должны быть достаточными: они включают только существующие машины, а переменные, соответствующие другим машинам, равны 0.

...