EgtNumKernel :
- Aggiunta classe di calcolo per ottimizzazione ordine delle lavorazioni - Aggiunti vincoli obbligatori e dipendenze suggerite a ShortestPath.
This commit is contained in:
@@ -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 ;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user