Včetně matice vzdáleností v CP schedulling problém

0

Otázka

Chci, aby se pokusili přidat distanční matice na jednoduché plánování problém v CPLEX pomocí CP nicméně nemohu se dostat to bez chyby v mé nové dvar sekvence.

Snažím se zahrnují nastavení časů mezi výrobky 1,2 a 3, které jsou závislé na pořadí, které produkty jsou plánované. Nastavení časů pro různé sekvence jsou uvedeny v distancematrix.Snažil jsem se definovat vzdálenost matrix jako n-tice trojice v mod souboru a jako matice v souboru dat, ale obě možnosti nejsou pro mě.

Nové nastavení dvar posloupnost pro tato nastavení času se nazývá setup, a měly by představovat posloupnost každé úlohy J na stroji. Nicméně, se zobrazí chyba, že funkce noOverlap dvarsequence,[rozsah][range] neexistuje. Já nechápu, co dělám špatně, co jsem definoval dvar násl. a matice, takže v mém chápání by to mělo fungovat

Mohl by mi někdo pomoci ven? Přilepená s tímto problémem na chvíli teď.

Níže naleznete mod. a dat. soubory.

Děkuji předem! 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

Nejlepší odpověď

1

měli byste se obrátit na matice vzdáleností do n-tice nastavit.

Viz příklad z Jak se s OPL ?

TSP (Problém obchodního Cestujícího) v OPL s plánování, Programování s Omezujícími podmínkami, nebo odstranit obvody a 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

Snažil jsem se vytvořit n-tice, nastavit jako no, nicméně jsem přemýšlel, jestli je možné vytvořit n-tice, triplet s Úkoly, které je definované jako string { int loc1; int loc2; int value; }; {trojice} transitionTimes = { <i,j, ftoi(abs(i-j))> | i v Úkolech, j Úkolů }; Když Úkoly je definován jako řetězec Úkolů = {"Kečup", "Mayo","BBQ","KetchLight"}; Nebo může n-tice množin být vyráběna pouze s ne řetězec typy?
Willem B

Dokumentace říká : volitelné přechodové matice M (v podobě nezáporné celé číslo n-tice set) může být předán k noOverlap omezení, což znamená, že pokud ai se objeví před aj v pořadí, pak minimální vzdálenost M[typei,typej] musí být dodržena mezi koncem ai a začátek aj (typei a typej označují typy ai a aj v pořadí).
Alex Fleischer

Díky Alexi! Teď vidím, jak mohu nastavit můj vlastní n-tice pomocí pouze celá čísla! Nicméně, když se snažím vytvořit nespočet nastavit pro přechod matrix, nahradí int loc1 a int loc2 s (string job1 a řetězec job2), dostanu chybu v noOVerlap line: Argument neshoda typu volání funkce noOverlap(dvar posloupnost,{n-tice-typ}):boolean s argumenty dvar posloupnost, {Matrix}'. To znamená, že mohu použít pouze n-tice set, který existuje non-záporná celá čísla dílů na všechny n-tice? To je stále ještě není zcela jasné, pro mě.. možná bys to Mohl potvrdit?
Willem B

V jiných jazycích

Tato stránka je v jiných jazycích

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