EgtNumKernel :

- Aggiunta classe di calcolo per ottimizzazione ordine delle lavorazioni
- Aggiunti vincoli obbligatori e dipendenze suggerite a ShortestPath.
This commit is contained in:
Riccardo Elitropi
2025-04-23 10:09:41 +02:00
parent d9818970e7
commit 558b590810
13 changed files with 1552 additions and 172 deletions
+50 -26
View File
@@ -26,34 +26,59 @@ ShortestPath::NearNeighbor( void)
m_Available[ Index( i, i)] = false ;
}
// cerco il nodo con il più corto arco che se ne diparte
unsigned nCurr = 0 ;
unsigned nNew = CheapArc( nCurr) ;
for ( unsigned i = 1 ; i < m_nNumPnts ; ++ i) {
unsigned j = CheapArc( i) ;
if ( ArcCost( i, j) < ArcCost( nCurr, nNew)) {
nCurr = i ;
nNew = j ;
// se non ho dipendenze
if ( ! ExistConstraints()) {
// cerco il nodo con il più corto arco che se ne diparte
unsigned nCurr = 0 ;
unsigned nNew = CheapArc( nCurr) ;
for ( unsigned i = 1 ; i < m_nNumPnts ; ++ i) {
unsigned j = CheapArc( i) ;
if ( ArcCost( i, j) < ArcCost( nCurr, nNew)) {
nCurr = i ;
nNew = j ;
}
}
// imposto il nodo corrente come base del percorso
NODE* pPath = m_pMain ;
pPath->nPos = nCurr ;
// ciclo
do {
// imposto tutti gli archi non disponibili al nodo corrente
for ( unsigned i = 0 ; i < m_nNumPnts ; ++ i)
m_Available[ Index( i, nCurr)] = false ;
// aggiungo un nuovo nodo al percorso
pPath = pPath->pNext ;
pPath->nPos = nNew ;
// imposto il nuovo nodo come nodo corrente
nCurr = nNew ;
// cerco il nuovo nodo all'estremo dell'arco più corto dal nodo corrente
nNew = CheapArc( nCurr) ;
} while ( m_Available[ Index( nCurr, nNew)]) ;
}
// imposto il nodo corrente come base del percorso
NODE* pPath = m_pMain ;
pPath->nPos = nCurr ;
// ciclo
do {
// imposto tutti gli archi non disponibili al nodo corrente
for ( unsigned i = 0 ; i < m_nNumPnts ; ++ i)
m_Available[ Index( i, nCurr)] = false ;
// aggiungo un nuovo nodo al percorso
pPath = pPath->pNext ;
// se esistono dipendenze
else {
// cerco il primo nodo da cui iniziare
unsigned nNew = -1 ;
if ( ! ChooseFirstNode( nNew))
return MAXDIST ;
// imposto il nodo corrente come base del percorso
NODE* pPath = m_pMain ;
pPath->nPos = nNew ;
// imposto il nuovo nodo come nodo corrente
nCurr = nNew ;
// cerco il nuovo nodo all'estremo dell'arco più corto dal nodo corrente
nNew = CheapArc( nCurr) ;
} while ( m_Available[ Index( nCurr, nNew)]) ;
unsigned nSize = 1 ;
// ciclo
do {
// imposto tutti gli archi non disponibili al nodo corrente
for ( unsigned i = 0 ; i < m_nNumPnts ; ++ i)
m_Available[ Index( i, nNew)] = false ;
// cerco il nuovo nodo all'estremo dell'arco più corto dal nodo corrente
if ( ! ChooseNextNode( pPath, nSize, nNew, true))
return MAXDIST ;
// aggiungo un nuovo nodo al percorso
pPath = pPath->pNext ;
pPath->nPos = nNew ;
++ nSize ;
} while ( nSize < m_nNumPnts) ;
}
// calcolo il costo del percorso
return TotalCost( m_pMain) ;
@@ -73,6 +98,5 @@ ShortestPath::CheapArc( unsigned i)
if ( ArcCost( i, k) < ArcCost( i, j))
j = k ;
}
return j ;
}