EgtNumKernel :
- Aggiunta classe di calcolo per ottimizzazione ordine delle lavorazioni - Aggiunti vincoli obbligatori e dipendenze suggerite a ShortestPath.
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
// EgalTech 2015-2015
|
||||
//----------------------------------------------------------------------------
|
||||
// File : NN.cpp Data : 24.12.15 Versione : 1.6l4
|
||||
// Contenuto : Calcolo del percorso minimo basandosi su punto più lontano ;
|
||||
// Contenuto : Calcolo del percorso minimo basandosi su punto più lontano ;
|
||||
// pessima stima, utile come base per miglioramenti.
|
||||
//
|
||||
//
|
||||
@@ -15,7 +15,7 @@
|
||||
#include "stdafx.h"
|
||||
#include "ShortestPath.h"
|
||||
|
||||
/*-------------------------------------------------------------------------- */
|
||||
/* ------------------------------------------------------------------------- */
|
||||
long long unsigned
|
||||
ShortestPath::FarNeighbor( void)
|
||||
{
|
||||
@@ -26,34 +26,59 @@ ShortestPath::FarNeighbor( void)
|
||||
m_Available[ Index( i, i)] = false ;
|
||||
}
|
||||
|
||||
// cerco il nodo con il più corto arco che se ne diparte
|
||||
unsigned nCurr = 0 ;
|
||||
unsigned nNew = HighArc( nCurr) ;
|
||||
for ( unsigned i = 1 ; i < m_nNumPnts ; ++ i) {
|
||||
unsigned j = HighArc( 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 = HighArc( nCurr) ;
|
||||
for ( unsigned i = 1 ; i < m_nNumPnts ; ++ i) {
|
||||
unsigned j = HighArc( 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 = HighArc( 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 = HighArc( 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ù lungo dal nodo corrente
|
||||
if ( ! ChooseNextNode( pPath, nSize, nNew, false))
|
||||
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) ;
|
||||
|
||||
Reference in New Issue
Block a user