GRASS logo

NOME

v.net.salesman - Crea un ciclo connettendo i nodi dati (TSP - problema del commesso viaggiatore). Da notare che TSP è NP-hard, e in questo modulo viene utilizzato un algoritmo euristico per cui il ciclo creato può essere sub-ottimale

PAROLE CHIAVE

vettoriale, rete, salesman

SINOSSI

v.net.salesman
v.net.salesman help
v.net.salesman [-g] input=nome output=nome [type=string[,string,...]] [alayer=integer] [nlayer=integer] [acolumn=string] ccats=range [--overwrite] [--verbose] [--quiet]

Flag:

-g
Usa il calcolo geodetico per le location longitudine-latitudine
--overwrite
Sovrascrive i file esistenti
--verbose
Output verboso del modulo
--quiet
Output quieto del modulo

Parametri:

input=nome
Nome della mappa vettoriale di input
output=nome
Nome della mappa vettoriale di output
type=string[,string,...]
Tipo di arco
Opzioni: line,boundary
Predefinito: line,boundary
alayer=integer
Numero del layer
Layer degli archi
Predefinito: 1
nlayer=integer
Numero del layer
Layer dei nodi (usato per le città)
Predefinito: 2
acolumn=string
Colonna dei costi per gli archi (per entrambe le direzioni)
ccats=range
Valori delle categorie
Categorie dei punti ('città') sui nodi (il layer è definito da nlayer)

DESCRIZIONE

v.net.salesman calcola il percorso ottimale per visitare i nodi su una rete vettoriale.

I costi possono rappresentare la lunghezza delle linee oppure attributi salvati in una tabella di database. I valori di questi attributi sono considerati come costi dell'intero segmento, e non come costi per attraversare un'unità di lunghezza (p.es. metri) del segmento. Per esempio, se il limite di velocità è 100 Km/h, il costo per attraversare un segmento lungo 10 Km dev'essere calcolato come lungh/vel = 10 Km/(100 Km/h) = 0.1 h. Sono possibili assegnazioni di costo sia per gli archi che per i nodi, e anche costi diversi per le due direzioni di una linea vettoriale. Per le aree i costi vengono calcolati lungo i bordi.

Il vettoriale in ingresso dev'essere preparato con v.net operation=connect per collegare i punti che rappresentano i centri (nodi) alla rete.

I punti specificati come categorie devono stare esattamente sui nodi della rete,e il vettoriale in ingresso dev'essere preparato con v.net operation=connect.

NOTE

Gli archi possono essere chiusi assegnado un costo = -1.

ESEMPIO

Itinerario del commesso viaggiatore per 6 nodi digitalizzati (Spearfish):

Percorso più breve, su strade dissestate:

v.net.salesman example using distance

Percorso più veloce, su autostrade:

v.net.salesman example using time

Ricescare il percorso più breve utilizzando la distanza, e il percorso più veloce utilizzando il tempo d percorrenza secondo i limiti di velocità dei diversi tipi di strada:

# Spearfish

g.copy vect=roads,myroads

# si devono visitare 6 luoghi
echo "1|601653.5|4922869.2|a
2|608284|4923776.6|b
3|601845|4914981.9|c
4|596270|4917456.3|d
5|593330.8|4924096.6|e
6|598005.5|4921439.2|f" | v.in.ascii in=- cat=1 x=2 y=3 out=centers col="cat integer, \
                         east double precision, north double precision, label varchar(43)"

# verificare la preparazione dei dati
v.db.select centers
v.category centers op=report
# type       count        min        max
# point          6          1          6


# creare una mappa di linee che connettono i punti alla rete (sul layer 2)
v.net myroads points=centers out=myroads_net op=connect thresh=500
v.category myroads_net op=report
# Layer / table: 1 / myroads_net
# type       count        min        max
# line         837          1          5
#
# Layer: 2
# type       count        min        max
# point          6          1          5

# trovare il percorso più breve
v.net.salesman myroads_net ccats=1-6 out=mysalesman_distance

# definire i costi come tempo di percorrenza

# creare una categoria diversa per ogni strada nel layer 3
v.category in=myroads_net out=myroads_net_time opt=add cat=1 layer=3 type=line

# aggiungere una nuova tabella per il layer 3
v.db.addtable myroads_net_time layer=3 col="cat integer,label varchar(43),length double precision,speed double precision,cost double precision"

# copiare il tipo di strada sul layer 3
v.to.db myroads_net_time layer=3 qlayer=1 opt=query qcolumn=label columns=label

# inserire la lunghezza delle strade in miglia
v.to.db myroads_net_time layer=3 type=line option=length col=length unit=miles

# definire i limiti di velocità in miglia/ora
v.db.update myroads_net_time layer=3 col=speed val="5.0"
v.db.update myroads_net_time layer=3 col=speed val="75.0" where="label='interstate'"
v.db.update myroads_net_time layer=3 col=speed val="75.0" where="label='primary highway, hard surface'"
v.db.update myroads_net_time layer=3 col=speed val="50.0" where="label='secondary highway, hard surface'"
v.db.update myroads_net_time layer=3 col=speed val="25.0" where="label='light-duty road, improved surface'"
v.db.update myroads_net_time layer=3 col=speed val="5.0" where="label='unimproved road'"

# definire i costi di viaggio come tempo di percorrenza in minuti:
v.db.update myroads_net_time layer=3 col=cost val="length / speed * 60"

# trovare il ercorso più veloce
v.net.salesman myroads_net_time alayer=3 nlayer=2 acol=cost ccats=1-6 out=mysalesman_time
Per vedere il risultato eseguire, per esempio:
# Vedere i risultati
g.region vect=myroads_net

#pPercorso più breve
d.mon x0
d.vect myroads_net
d.vect centers -c icon=basic/triangle
d.vect mysalesman_distance col=green width=2
d.font Vera
d.vect centers col=red disp=attr attrcol=label lsize=12

# percorso più veloce
d.mon x1
d.vect myroads_net
d.vect centers -c icon=basic/triangle
d.vect mysalesman_time col=green width=2
d.font Vera
d.vect centers col=red disp=attr attrcol=label lsize=12

VEDI ANCHE

d.path, v.net, v.net.alloc, v.net.iso, v.net.path, v.net.steiner

AUTORE

Radim Blazek, ITC-Irst, Trento, Italy
Documentation: Markus Neteler, Markus Metz

Last changed: $Date: 2011-11-08 10:42:51 +0100(mar, 08 nov 2011) $


Main index - vector index - Full index

© 2003-2011 GRASS Development Team