Files
EgtNumKernel/Fn.cpp
T
SaraP ec9e4b4c76 EgtNumKernel 2.3k1 :
- in ShortestPath aumentato il numero max di punti consentiti.
2021-11-18 09:34:24 +01:00

79 lines
2.6 KiB
C++

//----------------------------------------------------------------------------
// 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"
/*-------------------------------------------------------------------------- */
long long 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 ;
}