Y compris une matrice de distance en CP schedulling problème

0

La question

Je veux essayer d'ajouter une matrice de distance à un simple problème d'ordonnancement dans CPLEX à l'aide de CP cependant je n'arrive pas à obtenir ce sans une erreur dans mon nouveau dvar séquence.

Je suis en train d'essayer d'inclure des temps de configuration entre les produits 1, 2 et 3, qui dépendent de la séquence que les produits sont prévues. Le temps de configuration pour les différentes séquences sont donnés dans une distancematrix.J'ai essayé de définir la matrice de distance comme un n-uplet triplet dans le fichier mod et comme une matrice dans le fichier dat mais les deux options ne fonctionnent pas pour moi.

La nouvelle configuration dvar séquence pour ce temps d'installation est appelé le programme d'installation, qui devrait représenter la séquence de tous les emplois que J sur une machine. Cependant, je reçois l'erreur que " la fonction noOverlap dvarsequence,[plage][gamme] n'existe pas. Je ne comprends pas ce que je fais de mal, car j'ai défini le dvar seq et la matrice ainsi dans ma compréhension, il doit travailler

Quelqu'un pourrait-il m'aider ici? Bloqué avec ce problème pendant un certain temps maintenant.

Veuillez trouver ci-dessous le mod. et dat. les fichiers.

Je vous remercie à l'avance! mod.


using CP;

// Number of Machines (Packing + Manufacturing)
int nbMachines = ...;
range Machines = 1..nbMachines;

// Number of Jobs
int nbJobs = ...;
range Jobs = 1..nbJobs;

int duration[Jobs,Machines] = ...;

int release = ...;
int due     = ...;

int distanceMatrix[1..nbJobs][1..nbJobs] = ...;
 
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];
dvar sequence setup[j in Jobs] in all (m in Machines,j in Jobs)opttask[j][m];      

execute {
        cp.param.FailLimit = 5000;
}


// Minimize the total processing cost (24)

 dexpr int day = sum(j in Jobs, m in Machines) duration[j][m] * presenceOf(opttask[j][m]);
 minimize  day;
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]);
     noOverlap(setup[j],distanceMatrix);
   }     
  // No overlap on machines
   forall(m in Machines){
     noOverlap(tool[m]);
   }     
  // forall(m in Machines,j in Jobs)
     
};

execute {
  writeln(task);
};
 

dat.

nbMachines = 2;

nbJobs = 3;

duration = [
        [5,1], 
        [3,4],
        [5,7]
            ];

release = 1;

due = 30;

distanceMatrix = [
1:[0,2,0],
2:[4,0,6],
3:[0,2,0]
]};
1

La meilleure réponse

1

vous devez tourner à la matrice de distance dans un tuple ensemble.

Voir un exemple de Comment avec OPL ?

C. à thé (Problème du voyageur de commerce) dans la BPO avec la planification, avec la Programmation par contraintes, ou à retirer des circuits et des MTZ

using CP; 
int     n       = ...;
range   Cities  = 1..n;

int realCity[i in 1..n+1]=(i<=n)?i:1;



// Edges -- sparse set
tuple       edge        {int i; int j;}
setof(edge) Edges       = {<i,j> | ordered i,j in 1..n};
setof(edge) Edges2       = {<i,j> | i,j in 1..n+1};  // node n+1 is node 1

int         dist[Edges] = ...;
int         dist2[<i,j> in Edges2]=(realCity[i]==realCity[j])?0:
((realCity[i]<realCity[j])?dist[<realCity[i],realCity[j]>]:dist[<realCity[j],realCity[i]>]);


dvar interval itvs[1..n+1] size 1;


dvar sequence seq in all(i in 1..n+1) itvs[i]; 

execute
{

cp.param.TimeLimit=60;
var f = cp.factory;
  cp.setSearchPhases(f.searchPhase(seq));
}

tuple triplet { int c1; int c2; int d; };
{triplet} Dist = { 
    <i-1,j-1,dist2[<i ,j >]>
           |  i,j in 1..n+1};
           
           
minimize endOf(itvs[n+1]) - (n+1);           
subject to
{
    startOf(itvs[1])==0; // break sym
    noOverlap(seq,Dist,true);   // nooverlap with a distance matrix
    last(seq, itvs[n+1]); // last node
}
2021-11-20 18:49:09

J'ai essayé de construire un n-uplet définir ainsi, cependant je me demandais si il était possible de construire un n-uplet de triplet avec des Tâches est définie comme une chaîne de caractères { int loc1; int loc2; int valeur; }; {triplet} transitionTimes = { <i,j, ftoi(abs(i-j))> | i dans les Tâches, j dans les Tâches }; Lorsque des Tâches est définie comme une chaîne de Tâches = {"Ketchup", "Mayo","BARBECUE","KetchLight"}; Ou peut-tuple ne peuvent être construits avec pas de chaîne types?
Willem B

La documentation dit : Une option de matrice de transition M (sous la forme d'un entier non négatif tuple set) peut être transmis à la noOverlap contrainte de sens que si l'ia s'affiche avant d'aj dans la séquence, puis à une distance minimale M[typei,typej] doit être respecté entre la fin de l'ia et le début de l'aj (typei et typej désigner les types de ai et aj dans la séquence).
Alex Fleischer

Merci Alex! Je vois maintenant comment je peux créer ma propre tuple en utilisant uniquement des entiers! Néanmoins, lorsque j'essaie de construire un n-uplet d'ensemble de la matrice de transition, en remplacement int loc1 et int loc2 avec (string tâche1 et chaîne job2), j'obtiens l'erreur dans le noOVerlap ligne: type d'Argument incompatibilité de fonction d'appel noOverlap(dvar séquence,{n-uplet de type}):boolean avec des arguments dvar séquence, {Matrix}'. Est-ce à dire que je ne peux utiliser un tuple ensemble de ce qui existe des entiers non négatifs pour toutes les parties de la tuple? Il n'est pas encore complètement clair pour moi.. Pourriez-vous le confirmer?
Willem B

Dans d'autres langues

Cette page est dans d'autres langues

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