In un precedente post abbiamo visto in cosa consiste il problema del commesso viaggiatore definito come segue: siano assegnate n città A, B, C,…, e le distanze dij fra esse esistenti , il problema consiste nella determinazione di una sequenza di città da visitare in modo che ogni città venga visitata una sola volta, minimizzando il percorso seguito e ritornando alla città di partenza. In questo post vedremo come risolvere questo problema attraverso l’utilizzo del software MapPoint prima direttamente con il programma e poi attraverso il codice. Consideriamo che con il nostro automezzo dobbiamo effettuare dieci consegne in una giornata presso nostri clienti con partenza e ritorno presso la nostra azienda. Utilizzando il programma MapPoint, importiamo i dati sulla posizione dei clienti inseriti in un file Excel attraverso il menù Dati, aggiunta guidata dati alla carta, selezioniamo l’opzione simboli, premiamo su avanti, poi selezioniamo importa dati da aggiungere alla carta, proseguiamo e selezioniamo il file da cui importare i dati ed importiamo i dati sulla carta, a questo punto selezioniamo l’area della carta su cui sono stati aggiunti i simboli, clicchiamo con il pulsante destro sull’area e selezioniamo l’opzione aggiungi simboli come soste, a questo punto clicchiamo sul deposito di partenza con il pulsante destro e selezioniamo l’opzione itinerario aggiungi come inizio e poi aggiungi come fine. Clicchiamo quindi su ogni punto della carta che rappresenta un nostro cliente e andiamo sull’opzione itinerario pianifica sosta ed indichiamo la durata della sosta. A questo punto andiamo nel menù itinerario e clicchiamo sul tasto ottimizza soste, in questo modo MapPoint risolve il problema del commesso viaggiatore, infine clicchiamo su pianifica itinerario per avere la durata del viaggio e le indicazioni stradali. Se vogliamo risolvere il problema tramite codice partiamo da una tabella in Access con i seguenti campi: CLIENTE, LONGITUDINE, LATITUDINE, DURATA SOSTA. Successivamente utilizziamo la seguente funzione per ottenere un vettore che ci restituisce l’elenco delle soste.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | Public Function TPS(TabellaDati, CampoCliente, CampoLAT, CampoLON, CampoSosta) Dim objApp As New MapPoint.Application Dim objMap As MapPoint.Map Dim objRoute As MapPoint.Route Dim db As DAO.Database Dim tabella As DAO.Recordset Set db = CurrentDb Set tabella = db.OpenRecordset(TabellaDati, dbOpenDynaset) tabella.MoveLast NumeroRighe = tabella.RecordCount tabella.MoveFirst Set objMap = objApp.ActiveMap Set objRoute = objMap.ActiveRoute objApp.Visible = False objApp.UserControl = False ReDim Point(NumeroRighe) As MapPoint.Location Do Until tabella.EOF c = c + 1 CLIENTE = tabella.Fields(CampoCliente) LAT = tabella.Fields(CampoLAT) LON = tabella.Fields(CampoLON) SOSTA = tabella.Fields(CampoSosta) Set Point(c) = objMap.GetLocation(LAT, LON) objRoute.Waypoints.Add Point(c), CLIENTE objRoute.Waypoints.Item(c).StopTime = SOSTA * geoOneMinute tabella.MoveNext Loop tabella.Close db.Close objRoute.Waypoints.Optimize objRoute.Calculate NSOSTE = objRoute.Waypoints.Count ReDim SOSTE(NSOSTE) For x = 1 To NSOSTE SOSTE(x) = objRoute.Waypoints.Item(x).Name Next x TPS = SOSTE objMap.Saved = True objApp.Quit End Function |
Public Function TPS(TabellaDati, CampoCliente, CampoLAT, CampoLON, CampoSosta) Dim objApp As New MapPoint.Application Dim objMap As MapPoint.Map Dim objRoute As MapPoint.Route Dim db As DAO.Database Dim tabella As DAO.Recordset Set db = CurrentDb Set tabella = db.OpenRecordset(TabellaDati, dbOpenDynaset) tabella.MoveLast NumeroRighe = tabella.RecordCount tabella.MoveFirst Set objMap = objApp.ActiveMap Set objRoute = objMap.ActiveRoute objApp.Visible = False objApp.UserControl = False ReDim Point(NumeroRighe) As MapPoint.Location Do Until tabella.EOF c = c + 1 CLIENTE = tabella.Fields(CampoCliente) LAT = tabella.Fields(CampoLAT) LON = tabella.Fields(CampoLON) SOSTA = tabella.Fields(CampoSosta) Set Point(c) = objMap.GetLocation(LAT, LON) objRoute.Waypoints.Add Point(c), CLIENTE objRoute.Waypoints.Item(c).StopTime = SOSTA * geoOneMinute tabella.MoveNext Loop tabella.Close db.Close objRoute.Waypoints.Optimize objRoute.Calculate NSOSTE = objRoute.Waypoints.Count ReDim SOSTE(NSOSTE) For x = 1 To NSOSTE SOSTE(x) = objRoute.Waypoints.Item(x).Name Next x TPS = SOSTE objMap.Saved = True objApp.Quit End Function