Un albero di Steiner viene usato per calcolare la rete vettoriale di minimo costo che connette un certo numero di nodi finali in una struttura a rete. Per esempio, può essere usato per trovare il percorso, lungo un sistema di strade, che minimizza la quantità di cablaggi di fibre ottiche necessari per connettere una serie di uffici satelliti.
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.
I punti che rappresentano i nodi devono stare esattamente sui nodi della rete,e il vettoriale in ingresso dev'essere preparato con v.net operation=connect.
Percorso più breve, su strade dissestate:
Percorso più breve, su autostrade:
# Spearfish g.copy vect=roads,myroads # si devono ottimizzare 6 siti 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)" 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 # 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" # Percorso più breve v.net.steiner myroads_net_time alayer=3 nlayer=2 tcats=1-6 out=mysteiner_distance # Percorso più veloce v.net.steiner myroads_net_time alayer=3 nlayer=2 acol=cost tcats=1-6 out=mysteiner_time
# vedere i risultati g.region vect=myroads_net # Percorso più breve d.mon x0 d.vect myroads_net d.vect -c centers icon=basic/triangle d.font Vera d.vect centers col=red disp=attr attrcol=label lsize=12 d.vect mysteiner_distance col=blue width=2 # Percorso più veloce d.mon x1 d.vect myroads_net d.vect -c centers icon=basic/triangle d.font Vera d.vect centers col=red disp=attr attrcol=label lsize=12 d.vect mysteiner_time col=blue width=2
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