Matriz de problema com endbefore iniciar no CPLEX

0

Pergunta

Estou tentando adicionar um Endbeforestartconstraint para o meu contrained problema de programação. No entanto, recebo um erro dizendo que o meu fim beforestart não é um tipo de matriz. Eu não entendo isso como eu quase copiado a restrição e dados do sched_seq exemplo, no CPLEX, eu apenas mudei para números inteiros.

O que eu tento fazer com a restrição, é que a tarefa 3 tarefa e 1 será executada antes da tarefa 2 vai começar.

Como posso corrigir a matriz de erro para essa restrição?

Por favor, veja abaixo as partes relevantes do meu código

tuple Precedence {int pre;int post;};

{Precedence} Precedences = {<3,2>,<1,2>};

dvar interval task[j in Jobs] in release..due;
dvar interval opttask[j in Jobs][m in Machines] optional size duration[j][m];

dvar sequence tool[m in Machines] in all(j in Jobs) opttask[j][m]
dexpr int makespan = max(j in Jobs, m in Machines)(endOf(opttask[j][m]));
minimize makespan;
 
subject to {
  // Each job needs one unary resource of the alternative set s (28)
  forall(j in Jobs){
    alternative(task[j], all(m in Machines) opttask[j][m]);
     
    }     
  // No overlap on machines
  forall(j in Jobs)
    forall(p in Precedences)
    endBeforeStart(opttask[j][p.pre],opttask[j][p.post]);
   
   forall(m in Machines){
     noOverlap(tool[m],transitionTimes);
       }     
    
};

execute {
  writeln(task);

dat.

nbMachines = 2;
nbJobs = 3;


duration = [
        [5,6], 
        [4,4],
        [5,8]
            ];

release = 1;

due = 30;
2

Melhor resposta

1

Existem vários erros no seu modelo, em faixas ou em invertido índices. Além disso, da próxima vez, por favor, poste um programa completo, mostrando o problema, e não apenas parcial, isto pode ajudá-lo a obter respostas mais rápidas. Um programa corrigido:

using CP;

int nbMachines = 2;
int nbJobs = 3;


range Machines = 0..nbMachines-1;
range Jobs = 0..nbJobs-1;

int duration[Jobs][Machines] = [
        [5,6], 
        [4,4],
        [5,8]
            ];

            
int release = 1;
int due = 30;

tuple Precedence {int pre;int post;};

{Precedence} Precedences = {<2,1>,<0,1>};

dvar interval task[j in Jobs] in release..due;
dvar interval opttask[j in Jobs][m in Machines] optional size duration[j][m];

dvar sequence tool[m in Machines] in all(j in Jobs) opttask[j][m];

dexpr int makespan = max(j in Jobs, m in Machines)(endOf(opttask[j][m]));
minimize makespan;
 
subject to {
  // Each job needs one unary resource of the alternative set s (28)
  forall(j in Jobs){
    alternative(task[j], all(m in Machines) opttask[j][m]);
     
    }     
  // No overlap on machines
  forall(m in Machines)
    forall(p in Precedences)
    endBeforeStart(opttask[p.pre][m],opttask[p.post][m]);
};

execute {
  writeln(task);
  }
2021-11-26 11:06:37
0

Você deve ter valores de p.pré ou p.post que estão fora da matriz de indexação gama.

2021-11-22 13:52:49

Oi @rdu , eu adicionei o dat. arquivo que eu usei . Espero que isso o torna um pouco mais claro para você
Willem B

O que eu não entendo é como os valores de p.pré ou p.o post pode ser fora do índice de matriz, como eles representam simplesmente um trabalho que está no intervalo 1..nbjobs. O tamanho da matriz de precedência assume no valor que representa pré e um valor que representa post.
Willem B

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................