558b590810
- Aggiunta classe di calcolo per ottimizzazione ordine delle lavorazioni - Aggiunti vincoli obbligatori e dipendenze suggerite a ShortestPath.
279 lines
7.5 KiB
C++
279 lines
7.5 KiB
C++
//----------------------------------------------------------------------------
|
|
// EgalTech 2015-2015
|
|
//----------------------------------------------------------------------------
|
|
// File : ShortestPath.cpp Data : 22.12.15 Versione : 1.6l3
|
|
// Contenuto : Funzioni per il calcolo del percorso minimo.
|
|
//
|
|
//
|
|
//
|
|
// Modifiche : 22.12.15 DS Creazione modulo.
|
|
//
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
//--------------------------- Include ----------------------------------------
|
|
#include "stdafx.h"
|
|
#include "DllMain.h"
|
|
#include "ShortestPath.h"
|
|
#include "/EgtDev/Include/EGnStringUtils.h"
|
|
#include "/EgtDev/Include/EgtILogger.h"
|
|
#include <new>
|
|
|
|
using namespace std ;
|
|
|
|
//----------------------------------------------------------------------------
|
|
IShortestPath*
|
|
CreateShortestPath( void)
|
|
{
|
|
return static_cast<IShortestPath*> ( new(nothrow) ShortestPath) ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
ShortestPath::ShortestPath( void)
|
|
{
|
|
m_nType = SP_NONE ;
|
|
m_bSolved = false ;
|
|
m_dAngHAdd = 1000 ;
|
|
m_dAngHMul = 10 ;
|
|
m_dAngVAdd = 2000 ;
|
|
m_dAngVMul = 40 ;
|
|
m_dStep = 100 ;
|
|
m_nNumPnts = 0 ;
|
|
m_ObStart.nF = OB_NONE ;
|
|
m_ObEnd.nF = OB_NONE ;
|
|
m_Dists = nullptr ;
|
|
m_Available = nullptr ;
|
|
m_pMain = nullptr ;
|
|
m_pDupl = nullptr ;
|
|
m_pCheckDep = nullptr ;
|
|
m_vOrderConstr.clear() ;
|
|
m_vOrderSugg.clear() ;
|
|
m_vOrderSuggRowMap.clear() ;
|
|
m_nMaxDistSuggDep = 0 ;
|
|
m_ExtDistMat.clear() ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
ShortestPath::~ShortestPath( void)
|
|
{
|
|
if ( m_Dists != nullptr)
|
|
delete m_Dists ;
|
|
m_Dists = nullptr ;
|
|
if ( m_Available != nullptr)
|
|
delete m_Available ;
|
|
m_Available = nullptr ;
|
|
if ( m_pMain != nullptr)
|
|
delete m_pMain ;
|
|
m_pMain = nullptr ;
|
|
if ( m_pDupl != nullptr)
|
|
delete m_pDupl ;
|
|
m_pDupl = nullptr ;
|
|
if ( m_pCheckDep != nullptr)
|
|
delete m_pCheckDep ;
|
|
m_pCheckDep = nullptr ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
ShortestPath::AddPoint( double dX, double dY)
|
|
{
|
|
return AddPoint( dX, dY, 0, 0, 0, dX, dY, 0, 0, 0) ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
ShortestPath::AddPoint( double dXi, double dYi, double dXf, double dYf)
|
|
{
|
|
return AddPoint( dXi, dYi, 0, 0, 0, dXf, dYf, 0, 0, 0) ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
ShortestPath::AddPoint( double dXi, double dYi, double dZi, double dHi, double dVi,
|
|
double dXf, double dYf, double dZf, double dHf, double dVf)
|
|
{
|
|
if ( m_nNumPnts >= MAX_SPPS)
|
|
return false ;
|
|
m_Points[m_nNumPnts].dXi = dXi ;
|
|
m_Points[m_nNumPnts].dYi = dYi ;
|
|
m_Points[m_nNumPnts].dZi = dZi ;
|
|
m_Points[m_nNumPnts].dHi = dHi ;
|
|
m_Points[m_nNumPnts].dVi = dVi ;
|
|
m_Points[m_nNumPnts].dXf = dXf ;
|
|
m_Points[m_nNumPnts].dYf = dYf ;
|
|
m_Points[m_nNumPnts].dZf = dZf ;
|
|
m_Points[m_nNumPnts].dHf = dHf ;
|
|
m_Points[m_nNumPnts].dVf = dVf ;
|
|
++ m_nNumPnts ;
|
|
return true ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
ShortestPath::SetOpenBound( bool bStartVsEnd, int nFlag, double dX, double dY)
|
|
{
|
|
return SetOpenBound( bStartVsEnd, nFlag, dX, dY, 0, 0, 0) ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
ShortestPath::SetOpenBound( bool bStartVsEnd, int nFlag, double dX, double dY, double dZ, double dH, double dV)
|
|
{
|
|
// se inizio
|
|
if ( bStartVsEnd) {
|
|
switch ( nFlag) {
|
|
case OB_NONE :
|
|
m_ObStart.nF = nFlag ;
|
|
break ;
|
|
case OB_NEAR_PNT :
|
|
m_ObStart.nF = nFlag ;
|
|
m_ObStart.dX = dX ;
|
|
m_ObStart.dY = dY ;
|
|
m_ObStart.dZ = dZ ;
|
|
m_ObStart.dH = dH ;
|
|
m_ObStart.dV = dV ;
|
|
break ;
|
|
case OB_XMIN :
|
|
case OB_XMAX :
|
|
case OB_YMIN :
|
|
case OB_YMAX :
|
|
m_ObStart.nF = nFlag ;
|
|
break ;
|
|
default :
|
|
return false ;
|
|
}
|
|
}
|
|
// altrimenti fine
|
|
else {
|
|
switch ( nFlag) {
|
|
case OB_NONE :
|
|
m_ObEnd.nF = nFlag ;
|
|
break ;
|
|
case OB_NEAR_PNT :
|
|
m_ObEnd.nF = nFlag ;
|
|
m_ObEnd.dX = dX ;
|
|
m_ObEnd.dY = dY ;
|
|
m_ObEnd.dZ = dZ ;
|
|
m_ObEnd.dH = dH ;
|
|
m_ObEnd.dV = dV ;
|
|
break ;
|
|
case OB_XMIN :
|
|
case OB_XMAX :
|
|
case OB_YMIN :
|
|
case OB_YMAX :
|
|
m_ObEnd.nF = nFlag ;
|
|
break ;
|
|
default :
|
|
return false ;
|
|
}
|
|
}
|
|
|
|
return true ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
ShortestPath::SetAngularParams( double dAngHAdd, double dAngHMul, double dAngVAdd, double dAngVMul)
|
|
{
|
|
m_dAngHAdd = float( abs( dAngHAdd)) ;
|
|
m_dAngHMul = float( abs( dAngHMul)) ;
|
|
m_dAngVAdd = float( abs( dAngVAdd)) ;
|
|
m_dAngVMul = float( abs( dAngVMul)) ;
|
|
return true ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
ShortestPath::SetZzOwStep( double dStep)
|
|
{
|
|
m_dStep = float( abs( dStep)) ;
|
|
return true ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
ShortestPath::Calculate( int nType)
|
|
{
|
|
m_nType = nType ;
|
|
switch ( m_nType) {
|
|
case SP_CLOSED :
|
|
case SP_OPEN :
|
|
m_bSolved = Tsp() ;
|
|
break ;
|
|
case SP_ZIGZAG_X :
|
|
case SP_ZIGZAG_Y :
|
|
case SP_ONEWAY_XP :
|
|
case SP_ONEWAY_XM :
|
|
case SP_ONEWAY_YP :
|
|
case SP_ONEWAY_YM :
|
|
m_bSolved = ZigZag() ;
|
|
break ;
|
|
default :
|
|
m_bSolved = false ;
|
|
break ;
|
|
}
|
|
|
|
return m_bSolved ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
ShortestPath::GetOrder( INTVECTOR& vOrder)
|
|
{
|
|
// pulisco risultato
|
|
vOrder.clear() ;
|
|
// verifico sia stato risolto
|
|
if ( ! m_bSolved)
|
|
return false ;
|
|
// assegno risultato
|
|
unsigned nTot = ( ( m_nType == SP_OPEN) ? m_nNumPnts - 1 : m_nNumPnts) ;
|
|
vOrder.reserve( nTot) ;
|
|
for ( unsigned i = 0 ; i < nTot ; ++ i)
|
|
vOrder.push_back( m_nOrder[i]) ;
|
|
return true ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
ShortestPath::GetMinLength( double& dMinLen)
|
|
{
|
|
// verifico sia stato risolto
|
|
if ( ! m_bSolved)
|
|
return false ;
|
|
// assegno risultato
|
|
dMinLen = ( double)m_nMinCost ;
|
|
return true ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
bool
|
|
ShortestPath::SetDistMatrix( const INTMATRIX& mDistMatrix)
|
|
{
|
|
// Assegno la matrice suggerita
|
|
m_ExtDistMat = mDistMatrix ;
|
|
return true ;
|
|
}
|
|
|
|
/* Funzioni per _dubug_ */
|
|
// ---------------------------------------------------------------------------
|
|
// ---------------------------------------------------------------------------
|
|
// ---------------------------------------------------------------------------
|
|
void
|
|
ShortestPath::_printPath( NODE* pPath, string sFun)
|
|
{
|
|
#if ENABLE_DEBUG
|
|
{
|
|
LOG_INFO( GetENkLogger(), sFun.c_str()) ;
|
|
NODE* pCurr = pPath ;
|
|
string sText = "" ;
|
|
for ( unsigned i = 0 ; i < m_nNumPnts ; ++ i) {
|
|
sText += ( ( i == 0 ? "" : " - ") + ToString( pCurr->nPos)) ;
|
|
pCurr = pCurr->pNext ;
|
|
}
|
|
LOG_INFO( GetENkLogger(), sText.c_str()) ;
|
|
}
|
|
#else
|
|
return ;
|
|
#endif
|
|
}
|