558b590810
- Aggiunta classe di calcolo per ottimizzazione ordine delle lavorazioni - Aggiunti vincoli obbligatori e dipendenze suggerite a ShortestPath.
104 lines
3.6 KiB
C++
104 lines
3.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 ;
|
|
}
|
|
|
|
// 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)]) ;
|
|
}
|
|
// 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 ;
|
|
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) ;
|
|
}
|
|
|
|
/*-------------------------------------------------------------------------- */
|
|
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 ;
|
|
}
|