scritto da | on | Nessun commento

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

Lascia un Commento

News