EgtNumKernel 1.6l4 :
- aggiunta gestione ShortestPath.
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
//----------------------------------------------------------------------------
|
||||
// EgalTech 2015-2015
|
||||
//----------------------------------------------------------------------------
|
||||
// File : NN.cpp Data : 24.12.15 Versione : 1.6l4
|
||||
// Contenuto : Calcolo del percorso minimo basandosi su punto più lontano ;
|
||||
// pessima stima, utile come base per miglioramenti.
|
||||
//
|
||||
//
|
||||
// Modifiche : 24.12.15 DS Creazione modulo.
|
||||
//
|
||||
//
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
//--------------------------- Include ----------------------------------------
|
||||
#include "stdafx.h"
|
||||
#include "ShortestPath.h"
|
||||
|
||||
/*-------------------------------------------------------------------------- */
|
||||
unsigned
|
||||
ShortestPath::FarNeighbor( void)
|
||||
{
|
||||
// abilito i collegamenti tra nodi diversi e disabilito gli auto-collegamenti
|
||||
for ( unsigned i = 0 ; i < m_nNumPnts ; ++ i) {
|
||||
for ( unsigned j = 0 ; j < m_nNumPnts ; ++ j)
|
||||
m_Available[ Index( i, j)] = true ;
|
||||
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 ;
|
||||
}
|
||||
}
|
||||
|
||||
// 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)]) ;
|
||||
|
||||
// calcolo il costo del percorso
|
||||
return TotalCost( m_pMain) ;
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------- */
|
||||
unsigned
|
||||
ShortestPath::HighArc( unsigned i)
|
||||
{
|
||||
// cerco la prima destinazione libera
|
||||
unsigned j = 0 ;
|
||||
for ( ; ( j < m_nNumPnts - 1 && ! m_Available[ Index( i, j)]) ; ++ j)
|
||||
;
|
||||
// cerco la migliore destinazione libera
|
||||
for ( unsigned k = j + 1 ; k < m_nNumPnts - 1 ; ++ k) {
|
||||
if ( m_Available[ Index( i, k)])
|
||||
if ( ArcCost( i, k) > ArcCost( i, j))
|
||||
j = k ;
|
||||
}
|
||||
|
||||
return j ;
|
||||
}
|
||||
Reference in New Issue
Block a user