S I S T E R R KBSS - REALAZIONE-RIEP-13132.doc 1 S I S T E R R SISTEMA INTEGRATO DI GESTIONE DEI...

41
ANOVA KBSS - REALAZIONE-RIEP-13132.doc 1 S I S T E R R SISTEMA INTEGRATO DI GESTIONE DEI RIFIUTI SOLIDI E RISANAMENTO DEI SITI CONTAMINATI Sottotema di Ricerca del Progetto VALAMB Linea 1.3.1.3. - A) Fase 1.3.1.3.2. Individuazione dei modelli Sviluppo di un prototipo di procedura automatica di calcolo per la pianificazione e la gestione delle attività di raccolta e trasporto dei rifiuti solidi urbani INDIVIDUAZIONE DEI MODELLI RELAZIONE RIEPILOGATIVA Fase 1.3.1.3.2. Data: ________________ Referente ANOVA: ___________________________ (dott. Paolo Sabatino)

Transcript of S I S T E R R KBSS - REALAZIONE-RIEP-13132.doc 1 S I S T E R R SISTEMA INTEGRATO DI GESTIONE DEI...

ANOVA KBSS - REALAZIONE-RIEP-13132.doc 1

S I S T E R R SISTEMA INTEGRATO DI GESTIONE DEI RIFIUTI SOLIDI

E RISANAMENTO DEI SITI CONTAMINATI Sottotema di Ricerca del Progetto VALAMB

Linea 1.3.1.3. - A) Fase 1.3.1.3.2. Individuazione dei modelli

Sviluppo di un prototipo di procedura automatica di calcolo per la pianificazione e la gestione delle attività di

raccolta e trasporto dei rifiuti solidi urbani

INDIVIDUAZIONE DEI MODELLI

RELAZIONE RIEPILOGATIVA Fase 1.3.1.3.2.

Data: ________________ Referente ANOVA: ___________________________ (dott. Paolo Sabatino)

ANOVA KBSS - REALAZIONE-RIEP-13132.doc 2

INDICE

1. IL QUADRO DI RIFERIMENTO PROGETTUALE 3

1.1 Riferimenti Generali

1.2 Obiettivi e Problematiche

2. LE ATTIVITÀ SVOLTE 5

2.1 Analisi dei Requisiti del Prototipo di Procedura Automatica

2.2 Progettazione e Sviluppo delle Procedure di Input

2.3 Progettazione e Sviluppo delle Procedure di Output

2.4 Ingegnerizzazione e Testing del Prototipo di Procedura

3. METODOLOGIE, CRITERI E STRUMENTI ADOTTATI 15

3.1 - Definizione dei nodi 3.2 - Definizione parametri di input 3.3 - Procedure di Calcolo

4. RISULTATI 20

MODELLI DI BASE ADOTTATI NEL PROTOTIPO

A) MODELLO DEL MINIMO PERCORSO (per modulo/zona - singolo automezzo)

B) MODELLO EURISTICO DEL MASSIMO RISPARMIO (per zona - più automezzi)

C) LISTATI DEI PROGRAMMI DELLE PROCEDURE

ANOVA KBSS - REALAZIONE-RIEP-13132.doc 3

1. IL QUADRO DI RIFERIMENTO PROGETTUALE

1.1 - Riferimenti Generali

Il PARCO SCIENTIFICO E TECNOLOGICO DI SALERNO E DELLE AREE INTERNE DELLA CAMPANIA (denominato PST-Salerno) ha promosso e conseguito l'affidamento, da parte del Ministero dell'Università e della Ricerca Scientifica e Tecnologica (MURST), della realizzazione del Progetto di ricerca "Valorizzazione della qualità delle risorse ambientali e produttive del sistema economico locale e riqualificazione delle peculiari interazioni" - VALAMB. Questo progetto si articola in due sottotemi di ricerca denominati "Sistema Integrato di Monitoraggio e Gestione dell'Ambiente e del Territorio" - SISTERR e "Impiego dell'osmosi inversa per la concentrazione di succhi di frutta ed ortaggi" - OSMINV.

Per l'esecuzione della ricerca sul sottotema SISTERR, e precisamente per la linea 1.3.1.3. denominata "Sistema di monitoraggio dei bacini idrografici" e le relative fasi 1.3.1.3.2. e 1.3.1.3.3., il PST ha inteso avvalersi della collaborazione di ANOVA sas per la fornitura di servizi di consulenza esperta, analisi, sviluppo e affiancamento per le attività relative alle predette fasi.

Pertanto, In data 8 febbraio 2000, il PST-Salerno ed ANOVA s.a.s. hanno sottoscritto la CONVEZIONE per l'espletamento delle suddette prestazioni. Documentazione di Riferimento:

a) CONVENZIONE PST-Salerno ANOVA S.a.s. b) ALLEGATI Tecnici A-B

Gruppo di Lavoro: Per ANOVA:

dott. Paolo Sabatino (Referente) ing. Domenico Cianniello

Per PST-Salerno: ing. Marcello Malangone

ANOVA KBSS - REALAZIONE-RIEP-13132.doc 4

1.2 - Obiettivi e Problematiche

La presente RELAZIONE RIEPILOGATIVA si riferisce all'espletamento delle attività per lo sviluppo di un prototipo di procedura automatica di calcolo per la pianificazione e la gestione delle attività di raccolta e trasporto dei rifiuti solidi urbani (Fase 1.3.1.3.2.), funzionale all’attività di “Confronto fra i modelli per l’analisi di rete e scelta dei vincoli e del modello da adottare per la raccolta differenziata dei rifiuti”. Il problema affrontato riguarda, in particolare, lo sviluppo di una procedura in grado di risolvere il problema della razionalizzazione del servizio di raccolta dei R.S.U., nell'ambito di una rete viaria cittadina complessa, attraverso la ricerca di percorsi ottimali degli automezzi preposti, tali da consentire la minimizzazione di una funzione obiettivo. A tal fine si è progettato un modello di calcolo che, interpretando la rete viaria, comprensiva di tutti i vincoli presenti, è in grado di definire mediante metodologie euristiche percorsi tendenti all’ottimale in relazione ai tempi di percorrenza e/o al chilometraggio percorso. Lo studio è stato condotto sulle basi della ricerca operativa. Le principali difficoltà risiedono nell’applicare le metodologie teoriche di ricerca ad una realtà complessa come può essere quella di un centro urbano. Nella realizzazione del modello di calcolo è stata soddisfatta l’esigenza di disporre di una metodologia il più possibile flessibile ed allo stesso tempo sufficientemente rapida da fornire in tempi computazionali accettabili la risposta al problema, gestendo un numero elevato di dati dipendente dalle dimensioni dei ambiti di operatività dei mezzi di raccolta. Per le città con elevato numero di abitanti (elevata quantità di RSU distribuiti su un'ampia area geografica), la raccolta RSU viene organizzata secondo una "zonizzazione" dell'abitato, secondo criteri legati alla densità di popolazione, al tipo di rifiuto prodotto, ecc. Ogni zona è suddivisa a sua volta in un certo numero di “moduli” (sottoreti di raccolta) coincidenti con l’area di operatività di un singolo automezzo di differente capacità. L’estensione dei moduli è legata al numero dei cassonetti presenti che dipende dalla capacità dei mezzi di raccolta, scelto sulla base delle dimensioni delle strade che compongono la rete viaria dell’area da servire.

ANOVA KBSS - REALAZIONE-RIEP-13132.doc 5

2. LE ATTIVITÀ SVOLTE Le attività svolte per l'individuazione dei modelli (Fase 1.3.1.3.2.) sono riportate qui di seguito.

2.1 - Analisi dei Requisiti del Prototipo di Procedura Automatica di Calcolo

2.1.1. - Analisi della documentazione del PST-Salerno

Con riferimento alla documentazione del PST-Salerno, riguardante precedenti esperienze su questo tipo di problematiche (v. estratto dalla Tesi "Analisi delle Tecniche di Ottimizzazione dei Sistemi di Raccolta Differenziata" e "Metodologie Euristiche per la Risoluzione del Problema della Ricerca di un Percorso Ottimale: applicazione ad una zona della città di Roma" - A.Misiti, G.Molinas, P.Viotti), si sono analizzati gli aspetti peculiari della problematica dell'utilizzazione di metodologie euristiche e deterministiche rispetto applicazioni reali.

Si sono potuti mettere a fuoco così, alcuni aspetti "limitanti" degli approcci metodologici già utilizzati per il tipo di problematiche in esame (capacità dei modelli di adattarsi alle esigenze reali di calcolo, tempi di esecuzione, ecc.), di cui tener debitamente conto nella definizione dei modelli per il presente progetto.

2.1.2 - Analisi dello Stato dell'Arte sulla Modellistica disponibile dalla Ricerca Operativa

Il problema dell’ottimizzazione dei percorsi, ovvero della ricerca del più breve collegamento tra diversi punti mediante tecniche euristiche, è stato oggetto di molteplici studi. Secondo la letteratura del settore due sono i principali tipi di approccio ai problemi riconducibili al caso qui trattato: 1) il primo largamente usato e ormai inserito nei metodi della Ricerca Operativa, è quello

di schematizzare la rete viaria come un grafo orientato G = (N, A), dove con grafo G si intende un insieme N di nodi collegati da un insieme A di archi;

2) il secondo considera i nodi come punti posizionati in uno spazio cartesiano, fornendo una sequenza di nodi da visitare senza tenere conto della rete viaria che viene associata in un secondo momento.

La scelta della metodologia è dipendente dalla funzione obiettivo che ci si propone di massimizzare o minimizzare, nonché della realtà fisica del problema che è largamente influenzato dal particolare servizio a cui è applicato, sia esso di raccolta che di consegna.

La complessità dello studio, inoltre, cresce notevolmente all’aumentare dei "clienti" da visitare, ed è ulteriormente aggravata se risulta elevata la densità di distribuzione dei clienti sul territorio in esame. In quest’ultimo caso, in particolare la rete viaria, con i vincoli che presenta, può diventare il parametro fondamentale al quale il sistema deve rapportarsi.

Le prime due fondamentali metodologie di approccio al problema, utilizzate in molteplici applicazioni reali sono riportate qui di seguito.

Il Vehicle Routing Problem (V.R.P.)

Il V.R.P. è il nome dato ad una metodologia per la trattazione di un’intera serie di problemi che coinvolgono un servizio di distribuzione con una certa periodicità.

ANOVA KBSS - REALAZIONE-RIEP-13132.doc 6

In esso un insieme di clienti dislocato su una vasta area geografica è servito da un gruppo di veicoli che partono da un punto fisso in modo tale da rendere minimi alcuni obiettivi ed allo stesso tempo massimizzare alcune priorità, ad esempio:

a. massimizzare la somma delle priorità dei clienti che possono essere visitati dall’insieme dei veicoli

b. minimizzare i costi fissi relativi ai veicoli

c. minimizzare i costi variabili dei tragitti.

Possono anche essere considerati obiettivi composti quali:

1. minimizzazione del costo fisso dei veicoli impiegati con la massimizzazione delle priorità (a+b);

2. minimizzazione dei percorsi e del tempo, cioè dei costi variabili, con la massimizzazione delle priorità (a+c);

3. minimizzazione del costo fisso dei veicoli impiegati insieme alla minimizzazione dei costi variabili e alla massimizzazione delle priorità (a+b+c).

La minimizzazione dei soli costi (b+c) non viene presa in esame perché comporterebbe la soluzione banale 0. Il V.R.P. è quindi, per la sua impostazione, adatto in genere per definire le “zone di operatività” dei diversi mezzi necessari per l’espletamento del servizio, ed è una metodologia impiegata generalmente su grandi aree geografiche ove è possibile trascurare i vincoli imposti dalla viabilità.

Il Travelling Salesman Problem (T.S.P)

Definito un grafo non orientato (definito come un grafo in cui l’arco che collega due nodi Ni e Nj può essere percorso da Ni a Nj e viceversa) G = (N, A), con N l’insieme dei nodi e con A l’insieme degli archi, il problema del Commesso Viaggiatore è quello di determinare il ciclo hamiltoniano di tempo, costo o lunghezza minima, dove per ciclo hamiltoniano si intende un ciclo che visita tutti gli n nodi del grafo una e una sola volta. La generalizzazione del T.S.P., conosciuta come G.T.S.P., si ottiene quando, oltre al tempo di percorrenza sugli archi del grafo, si ha anche un “punteggio” associato ad ogni nodo ed un tempo massimo di percorrenza del ciclo (o cammino). In tal modo, poiché non risulta sempre possibile visitare tutti i nodi, la soluzione a cui si arriva è l’individuazione di un percorso con il massimo “punteggio”. Se nell’ambito di questo percorso si prende in considerazione anche la finalità tempo, si giunge all’individuazione di un cammino che massimizza la differenza tra il punteggio associato ai nodi visitati nel ciclo e quello associato al tempo di percorrenza. Metodologie Euristiche e Algoritmi di costruzione dei percorsi

Per la soluzione dei problemi applicativi generalmente ci si avvale di procedure euristiche che forniscono soluzioni approssimate. Le euristiche presenti in letteratura possono essere raggruppate in tre classi:

a. euristiche di costruzione del cammino: mediante un criterio di scelta vengono inseriti nuovi nodi nel percorso, verificando sempre che sia mantenuta l’ammissibilità;

b. euristiche di miglioramento: dato un cammino ammissibile, cercano di determinarne uno migliore

c. euristiche miste che implicano entrambe le precedenti metodologie.

La complessità di tali euristiche può essere considerata di ordine variabile tra O(n2) e O(n3logn). La procedura di risoluzione del problema può essere considerata divisa in due parti sequenziali:

1) la prima basata su criteri di scelta che definisce il nodo o i nodi da inserire nel percorso;

ANOVA KBSS - REALAZIONE-RIEP-13132.doc 7

2) la seconda è la costruzione vera e propria della sequenza di nodi che costituiscono il tragitto.

La metodologia per la costruzione mediante queste procedure di una soluzione tendente all’ottimale potrà essere quindi basata, come propone la letteratura del settore, sui seguenti criteri:

a) risparmi

b) extrachilometraggio

c) extratempo

Il Criterio del Risparmio è stato trattato da Clarke-Wright e si basa su semplici considerazioni. Sia E un insieme di clienti xi con i=1,…,n. Supponiamo inizialmente di impiegare n veicoli, ognuno dei quali serva un solo cliente. In queste condizioni, se x0 è la posizione del deposito da cui partono i mezzi e d(x0, xi) è la distanza tra il deposito ed il cliente xi, la lunghezza totale del percorso sarà quindi:

Se si ipotizza ora che un mezzo può servire solo 2 clienti: nel caso di un viaggio solo per ogni cliente si avrà, nel caso di un unico viaggio:

avremo quindi, che il risparmio è:

i clienti da servire xi e xj saranno quindi scelti sulla base del massimo valore di R(xi, xj).

In realtà, il risparmio così ottenuto non è corretto quando il grafo orientato non risulta

completamente connesso, perché in generale d(xi, xj) d(xj, xi) i,j. Pertanto, la dtot come calcolata da Clarke-Wright non è più valida, e deve essere sostituita da:

quindi, il risparmio diventa:

da cui in generale R(xi, xj) R(xj, xi).

Diversa è l’impostazione data dal Criterio dell’Extrachilometraggio. Consideriamo anche adesso un deposito x0 e un insieme di clienti xi con i=1,…,n. Nell’ipotesi in cui ogni veicolo servisse due clienti consecutivi, anche se inseriti già in un percorso, si consideri la maggiorazione di percorso che comporterebbe il servizio ad un terzo cliente. Si può ottenere l’algoritmo semplicemente calcolando la differenza tra il percorso base e quello aggiornato.

Il percorso base iniziale, considerando solo il servizio ai due clienti xi e xj:

n

i

itot xxdL1

0 ),(2

),(2),(2 00 jitot xxdxxdd

),(),(),(' 00 xxdxxdxxdd jjiitot

),(),(),('),( 00 jijitottotji xxdxxdxxdddxxR

),(),(),(),( 0000 xxdxxdxxdxxdd jjiitot

),(),(),(),( 00 jijiji xxdxxdxxdxxR

),(2 ji xxdl

ANOVA KBSS - REALAZIONE-RIEP-13132.doc 8

il percorso aggiornato considerando l’inserimento di xk:

l’extrachilometraggio, perciò, risulta:

Questa definizione che troviamo in letteratura ha lo stesso problema della definizione del risparmio, e deve essere corretta se abbiamo un grafo orientato non completamente connesso. Infatti, risulta:

pertanto, l’extrachilometraggio diventa:

Il Criterio dell’Extratempo risulta essere una estensione del criterio precedente ed è funzione della variabile tempo. Infatti alle distanze vengono associate le velocità di percorrenza corrispondenti alla fascia oraria in cui il mezzo transita nell’arco, e vengono determinate le maggiorazioni temporali necessarie a servire il cliente k inserito tra i nodi i e j. L’extratempo si esprime nella seguente forma:

La costruzione del percorso, una volta individuato il nodo o la sequenza di nodi da inserire avviene con procedure che possono essere di due tipi:

a. procedure parallele;

b. procedure sequenziali.

Le procedure parallele costruiscono più tragitti contemporaneamente fino ad ottenere il percorso finale. Queste possono essere divise principalmente in due categorie:

1. viene fissato a priori il numero k di tragitti, con kn, dove n è il numero dei nodi; i tragitti crescono simultaneamente per l’immissione ad ogni fase di un altro cliente fino a che tutti i clienti sono inseriti in un tragitto;

2. vengono costruiti percorsi brevi tra il nodo ingresso ed ogni altro cliente, e poi vengono uniti per formarne uno più grande; in questo modo non è possibile stabilire a priori il numero di tragitti risultante.

Le procedure sequenziali costruiscono il tragitto inserendo i nodi in forma sequenziale, secondo la funzione obiettivo e con l’ausilio di uno dei criteri riportati, fino a che tutti i clienti non sono inseriti nel tragitto.

),(),(),(' ikkjji xxdxxdxxdl

),(),(),('),,( jiikkjkji xxdxxdxxdllxxxec

),(),( ijji xxdxxdl

),(),(),(),,( ijikkjkji xxdxxdxxdxxxec

ijijikikkjkjkji vxxdvxxdvxxdxxxet ,,, /),(/),(/),(),,(

ANOVA KBSS - REALAZIONE-RIEP-13132.doc 9

2.2 - Progettazione e Sviluppo delle Procedure di Input

In generale, i dati indispensabili per lo sviluppo di opportuni algoritmi per la risoluzione del problema posto, derivano dalla:

Caratterizzazione delle utenze

Caratterizzazione della rete

Caratterizzazione della raccolta.

2.2.1 - Caratterizzazione delle utenze

La caratterizzazione delle utenze ha come principali parametri di riferimento la popolazione servita e le caratteristiche di produzione dei rifiuti. In particolare è possibile schematizzare tali informazioni in relazione a:

Numero di abitanti e tipologia di utenza suddivisi per zone aventi densità demografica omogenea; utenze domestiche (centro storico, zone residenziali), utenza non domestica (esercizi commerciali, ristoranti, uffici), fluttuazioni stagionali;

Stima e composizione qualitativa dei rifiuti prodotti per ogni singola utenza e strutturati per ogni sottoarea individuata.

2.2.2. - Caratterizzazione della raccolta

La caratterizzazione della raccolta richiede la definizione completa della tipologia di raccolta a cui gli algoritmi sono applicati, le caratteristiche dei mezzi di raccolta, la frequenza della raccolta, la presenza di eventuali stazioni di compattazione.

In particolare, si ritiene di rendere il sistema in progetto applicabile alle seguenti metodologie di raccolta:

Sistema a tre cassonetti: indifferenziato, F.O.R.S.U., R.D.M., integrato con campane per la raccolta del vetro e/o della carta;

Sistema a due cassonetti: indifferenziato, F.O.R.S.U., integrato con campane per la raccolta del vetro e/o della carta;

Sistema tradizionale con la raccolta indistinta di tutti i R.S.U..

I sistemi di raccolta elencati possono inoltre essere previsti mediante servizio stradale, con posizionamento dei contenitori lungo l'asse stradale o nel caso di servizio a grandi utenze presso le singole utenze. La flessibilità del sistema previsto è inoltre tale da prevederne un possibile utilizzo anche in relazione alle problematiche di compattazione e trasporto.

2.2.3 - Caratterizzazione della rete

La caratterizzazione della rete richiede la definizione delle caratteristiche intrinseche quali le caratteristiche delle strade, le caratteristiche dei cassonetti e di quelle correlate a fattori esterni come la caratterizzazione della velocità di percorrenza, della potenzialità dei mezzi di raccolta e dei costi di percorso per unità.

La rappresentazione completa del grafo stradale richiede una strutturazione in relazione a nodi ed archi a cui vanno collegate una serie di dati ed informazioni relative alle caratteristiche geometriche, di viabilità e di velocità media di percorrenza.

Lo sviluppo degli algoritmi non può prescindere dalla definizione di alcune scelte metodologiche preliminari:

suddivisione del territorio urbano in aree contraddistinte per omogeneità su quantità e tipologia di rifiuti prodotti e caratteristiche del tessuto urbano;

scelta del tipo di raccolta da adottare per ogni sottoarea individuata (domiciliare, stradale, monomateriale, multimateriale (due o tre cassonetti));

numero di contenitori che è necessario posizionare al fine di garantire il servizio per ogni utenza o gruppo individuato;

ANOVA KBSS - REALAZIONE-RIEP-13132.doc 10

posizionamento dei cassonetti e individuazione dei bacini di utenza e dei carichi gravanti su di essi;

frequenza minima della raccolta per ogni tipologia di rifiuto e di sistema operativo di raccolta adottato.

Il problema della considerevole quantità di dati da caricare per la caratterizzazione topologica e geometrica della rete (e in visione di una implementazione SIT la possibilità di completamento con dati georeferenziati) è risolto con un sistema di caricamento dati di tipo CAD, su cui ottenere la possibilità di una verifica di congruenza dei dati caricati.

I dati che caratterizzano il sistema di raccolta (utenza, rete, mezzi) sono organizzate in tabelle relazionate, nelle quali vengono riportati: dati che servono specificamente per la fase di input dell'algoritmo e dati che servono esclusivamente per la rappresentazione grafica del sistema o che contengono altri tipi di informazione.

Dati relativi all’utenza

Utenza Parametri principali di riferimento Altro Domestica densità popolazione residente

incidenza su arco incidenza su nodo

Tipologia di rifiuto associata, parametro di caratterizzazione quantitativo, Possibilità di tarare il sistema sulla base dei dati storici e di esercizio riscontrabili

Esercizi commerciali

Superficie Tipologia di rifiuto associata

Esercizi di ristorazione

numero di coperti Tipologia di rifiuto associata

Uffici numero di impiegati Tipologia di rifiuto associata

Per quanto riguarda i parametri che caratterizzano il tipo di utenza e il tipo di rifiuto ad essa associato non è prevista una procedura che fornisca tali dati come input bensì è possibile collegare ad ogni cassonetto (ID cassonetto) il tipo di utenza servita (identificandola ognuna con un colore diverso) e indicare, ad esempio, il numero di utenti serviti (nel caso di utenza domestica) con un cerchio il cui diametro è proporzionale agli utenti stessi. In questo modo è possibile attraverso una rappresentazione grafica vedere per un determinato cassonetto quale area o zona della rete copre e verificare, sempre graficamente, se è stata effettuata una corretta distribuzione dei cassonetti sulla rete.

Le informazioni che riguardano la tipologia e la quantità di rifiuti prodotti possono essere organizzate in tabelle, divise per tipo di utenza, dove vengono registrati i dati che si ritengono più affidabili relativamente alla realtà territoriale in esame. Nella fase iniziale è possibile caricare dati bibliografici per le utenze domestiche e dati derivanti dal MUD per utenze non domestiche, salvo aggiornamento derivante da specifiche analisi di campo (previste nella fase successiva).

Relazioni Cassonetto-Utenza

ID

CASSONETTO TIPO DI UTENZA

Parametro riferimento

Colore identificativo

AREA INFLUENZA

001 Domestica1 (centro storico)

Densità abitativa [n ab/m

2]

Rosso R2

df

g

p

114.3

cr Vcass.

ANOVA KBSS - REALAZIONE-RIEP-13132.doc 11

dove: r: raggio dell'area da servire (supposta circolare) [m]

Vcass: volume cassonetto [m3]

p: peso specifico rifiuto [kg/m3]

g: produzione di rifiuto giornaliera procapite c: coeff. di utilizzazione del cassonetto f: frequenza di raccolta [operazioni/giorno] d: densità abitativa della zona [ab/m

2].

Dati relativi alla raccolta e alla rete

NODI: i nodi possono indicare la posizione di un cassonetto, un incrocio stradale, un punto di ingresso alla rete (inizio percorso di raccolta), un punto finale della rete (impianto di trasformazione, ecc.). Per il nodo incrocio, ovviamente, il volume è pari a zero e il tempo di svuotamento corrisponde al tempo di attraversamento; per il nodo finale il tempo può indicare i minuti necessari per lo scarico dei rifiuti ed eventualmente il tempo per tornare sul circuito di raccolta (nell'ultima colonna è specificato quale delle informazioni va fornita in input all'algoritmo di risoluzione dei percorsi ottimi):

INPUT ALGORITMO

ID nodo [num] 001 SI

Tipo di nodo [stringa] cassonetto SI

Tipo raccolta [stringa] R.D.M. NO

Tipo o numero utenti serviti [num] 200 abitanti NO

X [num] 32 m NO

Y[num] 100 m NO

Volume netto utilizzabile [num] 25 mc SI

Frequenza di rimozione [num] 2 volte/settimana NO

Superficie servita [num] 500 mq NO

Tempo di sosta [num] 1.5 min. SI

Nome strada [stringa] Via Roma NO

Queste informazioni sono organizzate in una tabella dei nodi che, come si nota, è composta da informazioni che servono per la sola rappresentazione grafica ed altre informazioni necessarie come input dell'algoritmo. Altre informazioni supplementari possono riguardare lo stato del cassonetto, la data d'acquisto, le caratteristiche di svuotamento, ecc.

ARCHI: individuati da caratteristiche topologiche e funzionali:

INPUT ALGORITMO

ID arco [num] 001 SI

Identificazione [stringa] Via Roma NO

Nodo iniziale [ID nodo] 001 SI

Nodo finale [ID nodo] 002 SI

Lunghezza [num] 650 SI

Costo di percorrenza [num] 1000 Lit/Km SI

Tempo di percorrenza [num] 3 minuti SI

MEZZI: i mezzi sono caratterizzati da proprietà tecniche (volume, tipo di raccolta) e da proprietà economiche (costi fissi); ad esempio: INPUT ALGORITMO

ID mezzo [num] 01

Caratteristiche tecniche

SI

Capacità utile [num (m3)] 20 SI

Tipo raccolta [stringa] R.D.M. NO

Numero operatori [num] 2 NO

Costo d'investimento, ammort. e reint. [num]

150

Caratteristiche economiche (costi fissi)

NO

Costo operatori [num] 50 NO

Costo di gestione [num] 1 NO

ANOVA KBSS - REALAZIONE-RIEP-13132.doc 12

Il diagramma delle relazioni tra queste e le altre tabelle del database:

2.3 - Progettazione e Sviluppo delle Procedure di Output

Gli output del sistema dovranno consentire la scelta ottimale delle attività di dimensionamento e di gestione della raccolta e trasporto su di un territorio a scala provinciale.

Il dimensionamento comporterà la definizione delle infrastrutture minime necessarie ed il confronto fra opzioni diverse (tipologia di raccolta, mezzi, numero dei cassonetti, collocazione, ecc.) sulla base delle procedure di ottimizzazione dei costi.

Il controllo sulle attività di gestione invece permetterà l’individuazione dei minimi costi di gestione sulla base delle informazioni di input, delle infrastrutture disponibili, della topologia della rete, ecc. e consentirà il confronto dei percorsi e dei risultati in funzione di scelte diverse, dell’interposizione di stazioni di compattazione, ecc.

Gli output numerici e grafici consentiranno una immediata leggibilità dei percorsi.

Gli output grafici saranno costituiti dalla visualizzazione diretta sulla mappa stradale del percorso o dei percorsi ottenuti, evindenziati con colori opportuni.

Gli output numerici saranno organizzati in finestre che riportano: caratteristiche dei mezzi scelti, tempo presunto per la raccolta, volume totale di rifiuti raccolti organizzati per tipologia, numero di cassonetti visitati, lunghezza totale del percorso, costo presunto per ogni circuito. Un ulteriore output numerico riporterà in sequenza i cassonetti da visitare, con informazioni riguardanti il nome della strada dove è situato, il volume ed eventualmente distanza progressiva e parziale del percorso da effettuare.

ANOVA KBSS - REALAZIONE-RIEP-13132.doc 13

2.4 - Ingegnerizzazione e Testing del Prototipo di Procedura Automatica di Calcolo 2.4.1 - Implementazione del Modello di Calcolo (v. Codice in Allegato)

Il problema da affrontare è, come già enunciato, la razionalizzazione del servizio di raccolta dei R.S.U. mediante la ricerca di percorsi ottimali per gli automezzi preposti, tali da consentire la minimizzazione di una funzione obiettivo. A tal fine si è progettato un modello di calcolo che, interpretando la rete viaria, comprensiva di tutti i vincoli presenti, è in grado di definire mediante metodologie euristiche percorsi tendenti all’ottimale in relazione ai tempi di percorrenza e/o al chilometraggio percorso e/o dei costi.

Lo studio è stato condotto sulle basi della ricerca operativa; le principali difficoltà da superare consistono nell’applicare le metodologie teoriche di ricerca ad una realtà complessa come può essere quella di un centro urbano.

Schematicamente il problema che si presenta allo studio è il seguente: data un’area geografica dove sono situati n nodi (clienti o cassonetti) collegati tra loro da una rete viaria complessa, trovare il minimo percorso del mezzo di raccolta necessario a visitare almeno una volta ciascun nodo.

Nella realizzazione del modello di calcolo è stata soddisfatta l’esigenza di disporre di una metodologia il più possibile flessibile ed allo stesso tempo sufficientemente rapida, tali da fornire in tempi computazionali accettabili, la risposta al problema. Il modello deve gestire un numero elevato di dati dipendente dalle dimensioni dei moduli o della zona di raccolta, a seconda se si vuole trovare il percorso ottimale sul modulo singolo predefinito, o se si desidera ricercare i percorsi che permettano la raccolta su un’intera zona, che non sia stata suddivisa in moduli.

Il linguaggio utilizzato per l'implementazione dell'algoritmo è Visual Basic per la possibilità di combinare la costruzione visiva dell'applicazione, disegnando direttamente le finestre dei dati necessari alla rappresentazione e i loro componenti.

I dati relativi ai parametri necessari per la definizione del sistema sono organizzati in tabelle richiamabili attraverso delle finestre di tipo user-friendly (ad esempio finestra degli utenti, dei nodi, dei cassonetti, dei mezzi) con la possibilità, per semplificare le procedure di input da parte dell'utente di selezionare il numero ed il tipo di veicoli che intende utilizzare, tra quelli disponibili, visualizzati in una apposita maschera di interfaccia che riporta le informazioni relative ai mezzi selezionati. Inoltre è possibile per l’utente aggiornare o modificare i dati contenuti nelle finestre.

Una possibilità di organizzazione dei dati è riportata nella seguente tabella:

RACCOLTA R.D.M. MEZZI

Mezzo Capacità [mc]

Numero Operatori

Costo [Lit*10^

6]

Mezzi scelti per la raccolta

01 14 2 100 Mezzo 2 - 20 mc

02 20 3 200

03 … … …

I tabulati (reports) che il programma è in grado di generare oltre alla sequenza dei nodi visitati, riporta per ciascun nodo:

a. i percorsi trovati per ogni camion

b. il tempo di percorrenza

c. i nodi da caricare

d. la quantità totale dei rifiuti raccolti

ANOVA KBSS - REALAZIONE-RIEP-13132.doc 14

La versione definitiva riporterà anche:

a) la localizzazione del nodo;

b) l’orario di partenza dal nodo per la continuazione del tragitto;

c) il numero dei cassonetti svuotati dall’inizio della raccolta al momento della partenza dal nodo;

d) la quantità dei rifiuti raccolta in mc e in %;

e) la capacità residua del mezzo.

Si sottolinea che, dove un qualsiasi nodo, in cui siano localizzati uno o più cassonetti, venga visitato più di una volta, lo svuotamento dei cassonetti viene effettuato al primo passaggio tranne in presenza di particolari vincoli stabiliti a priori o decisi dall’Azienda incaricata della raccolta, ed in questa fase vengono aggiornati i valori descritti nei cinque punti sopra.

2.4.2 - Ingegnerizzazione e Testing del Modello di Calcolo

La rete di calcolo sulla quale è stato effettuato il testing degli algoritmi viene derivata da una rete stradale reale (rete urbana di Portici), costituita da 23 nodi cassonetto e 33 archi orientati. La prima rete rispetto alla seconda è semplificata rispetto ai nodi incrocio. In altri termini, si è convertita la rete reale in quella di calcolo attraverso un algoritmo che genera nuovi archi che collegano solo i nodi cassonetto, inglobando in se gli archi di partenza e i nodi incrocio. Si è utilizzato tale approccio per poter avere una riduzione del numero di nodi complessivi e per snellire le procedure di calcolo inerenti alla ricerca dei percorsi ottimali. In tale rete il nodo 1 funge sia da nodo ingresso, sia da nodo cassonetto, sia da nodo di uscita. La procedura non sarebbe comunque cambiata se non ci fosse stata coincidenza tra il nodo di ingresso e il nodo di uscita.

1 2 3 4 5

6 7 8 9 10

11 12 13 14 15

16 17 18 19

20 21 22

23

ANOVA KBSS - REALAZIONE-RIEP-13132.doc 15

3. METODOLOGIE, CRITERI E STRUMENTI ADOTTATI

La definizione dei parametri di input e dei dati necessari alla descrizione numerica del dominio di operatività sono una delle parti più importante del problema.

L’analisi si svolge essenzialmente secondo le seguenti fasi:

1. Definizione della zona di operatività, funzione delle caratteristiche del mezzo di raccolta, delle disposizioni esistenti all’interno della struttura organizzativa dell’Azienda incaricata della raccolta, delle dimensioni dei contenitori di raccolta dislocati o da dislocare e del loro numero. Importante in questa fase è uno studio merceologico del rifiuto, dei quantitativi di raccolta nell’arco della settimana tra i vari periodi dell’anno, per una ottimale scelta della tipologia dei contenitori e del loro posizionamento.

2. Orari di lavoro, numero di addetti, numero di veicoli.

3. Dati relativi alle operazioni di caricamento, svuotamento, scaricamento e riposizionamento dei cassonetti.

4. Studio della viabilità delle singole zone (sensi di percorrenza, segnaletica, ecc.). Rilevamento della lunghezza delle strade e delle intensità di traffico, quest’ultima necessaria per la definizione delle velocità medie di percorrenza.

5. Definizione su appropriata cartografia dei nodi per la codifica della viabilità da fornire all’elaboratore; determinazione dei possibili collegamenti diretti tra i singoli nodi; misura delle relative distanze.

6. Inserimento dati

7. Riproduzione dei percorsi ottenuti su cartografia.

3.1 - Definizione dei nodi

La schematizzazione numerica delle zone di operatività è rappresentata da un grafo orientato non completamente connesso G=(N,A,D,V) dove N è l’insieme dei nodi, A è l’insieme degli archi dei collegamenti diretti tra i nodi, a cui sono associate le distanze D e le velocità V. Si è limitato l’impiego di un numero eccessivo di nodi per non moltiplicare in modo eccessivo l’occupazione di risorse e i tempi di calcolo; infatti, come già detto in precedenza, la complessità del problema è di ordine esponenziale funzione del numero di nodi. È stata effettuata, inoltre, per lo stesso motivo, la scelta di aggregare più cassonetti in un unico nodo. I nodi vengono individuati perciò sulla cartografia relativa alla zona di operatività del mezzo; i collegamenti sono determinati in base alla viabilità locale e non si hanno limitazioni sul numero di collegamenti a cui un nodo può essere soggetto, a parte il numero totale dei nodi. La definizione dei possibili collegamenti tra i nodi è fondamentale ai fini di una corretta risoluzione del problema; da essa dipendono, infatti, le diverse successioni di nodi che contribuiscono alla definizione dei tragitti. Sono state considerate tutte le infrastrutture viarie utilizzabili (funzione anche della larghezza di transito e delle dimensioni del mezzo) al fine di assicurare il maggior numero possibile di percorsi alternativi. Non è stata presa in considerazione la possibilità di effettuare manovre a zig-zag (cioè di poter effettuare la raccolta su entrambi i lati con attraversamenti) durante la raccolta nelle strade a senso unico di marcia, e nemmeno di poter trasportare il cassonetto da un lato all’altro della strada per effettuarne lo svuotamento. Strade a doppio senso sono quindi considerate come divise da una ideale linea di separazione, e nodi presenti su due lati opposti non hanno la possibilità di essere collegati direttamente.

ANOVA KBSS - REALAZIONE-RIEP-13132.doc 16

Tutta la viabilità risulta quindi schematizzata mediante una tabella A delle distanze tra nodo 1 e nodo 2.

3.2 - Definizione parametri di input

I parametri che intervengono nel modello sono i seguenti:

a. velocità di spostamento del mezzo;

b. tempo di svuotamento del singolo cassonetto;

c. capacità del mezzo utilizzato per la raccolta;

d. capacità del singolo contenitore;

e. tempo necessario all’arresto e partenza del mezzo di raccolta.

Per la definizione dei valori corrispondenti ai suddetti punti si intende avvalersi di dati direttamente rilevati sulla zona di operatività. Una considerazione particolare merita la velocità di spostamento del mezzo che è un parametro importantissimo ai fini del tempo di percorrenza. Essendo la raccolta effettuata durante le ore diurne nella maggioranza delle zone cittadine, sono state previste fasce di velocità medie relative ad ogni arco di collegamento tra due nodi ed associate ad altrettanti intervalli orari. Queste velocità sono legate in modo inverso alle diverse intensità di traffico presenti nell’arco stradale. In questa fase è stato possibile anche tenere conto delle differenti operazioni dipendenti dalle realtà locali, come le limitazioni sulla viabilità in determinate fasce orarie (entrate e uscita dalle scuole, dai posti di lavoro, mercati, ecc.).

3.3 - Procedura di calcolo

Si è cercato di soddisfare l’esigenza di disporre di una metodologia il più flessibile possibile ed allo stesso tempo sufficientemente rapida da fornire in tempi di calcolo accettabili la risposta al problema, consentendo allo stesso tempo di gestire un numero elevato di dati. Non ultima l’esigenza di tenere in conto l’impiego del programma anche da parte di operatori non specializzati. A questo scopo si è progettato una interfaccia operatore-macchina che permette di gestire completamente sia la fase di immissione dati e variazione degli stessi, sia la realizzazione in forma autonoma di un archivio di informazioni sui singoli moduli, zone e circoscrizioni.

La procedura è suddivisa in due fasi principali:

a. immissione dati

b. costruzione dei percorsi e scelta del percorso che soddisfa la funzione obiettivo.

Nella prima fase si inseriscono esclusivamente le informazioni base per la schematizzazione della planimetria stradale ed i parametri di input, in particolare:

la misura della distanza tra un nodo e gli altri nodi;

la velocità media di percorrenza dei singoli archi associati alle diverse fasce orarie;

il numero dei cassonetti eventualmente presenti nel nodo;

la denominazione del nodo in riferimento alla toponomastica stradale;

la capacità del mezzo;

la capacità del singolo cassonetto;

il tempo medio necessario per l’arresto, lo svuotamento del singolo cassonetto e la partenza del mezzo.

Dopo l’immissione dati comincia la costruzione dei percorsi dei percorsi parziali (seconda fase b.). Prima di entrare in dettaglio, introduciamo la seguente definizione: dati due nodi

ANOVA KBSS - REALAZIONE-RIEP-13132.doc 17

generici i e j, si definisce “arco fondamentale Aij” l’arco che collega direttamente la coppia di nodi Ni e Nj. L’algoritmo impiegato sfrutta un sistema di risoluzione del problema basato su matrici; partendo dalla matrice formata dagli archi fondamentali indicata di ordine zero C0, arriva a definire un matrice di ordine r (con 0 < r < n) Cr, il cui elemento Cij contiene la distanza (o il tempo) per il collegamento dei generici nodi Ni e Nj realizzato con r+1 archi. La matrice potrà raggiungere l’ordine massimo di (n-1) con n il numero di nodi; inoltre, non sarà sempre necessario che si arrivi al massimo ordine potendo fermare il calcolo non appena risulti Ck=Ck-1.

Per descrivere il metodo occorre introdurre la matrice delle distanze D=[dij] e l’operazione tra matrici:

Z = X Y dove X=[xij], Y=[yij] sono le matrici Ck, e zij = min1<k<n[xik + ykj]. Eseguendo l’operazione:

C2 = C C è chiaro che gli elementi di C2 rappresentano le distanze minore di ordine 2 (cioè collegati da 3 archi fondamentali) tra ogni coppia di nodi. Allo stesso modo:

Ck = Ck-1 C rappresenta la matrice delle distanze minime ottenute percorrendo al massimo k archi.

Per il calcolo di Ck con kn-1, si è impiegato l’algoritmo di Floyd-Warshall che risolve il problema in forma semplificata.

Per motivi legati all’occupazione di memoria, essendo il programma progettato per PC con sistema operativo Windows, le matrici non verranno allocate direttamente nella memoria RAM del computer, ma su file del disco rigido. In questo modo l’aumento dei tempi di calcolo è accettabile e si ha un limite molto alto (spazio libero nel disco fisso) sul numero n dei nodi che possono essere trattati, senza esaurire le risorse del sistema.

Nell’ultima parte viene impiegato un criterio di scelta per il nodo che deve essere inserito nel percorso in costruzione mediante una procedura sequenziale.

Si sono considerate come funzione obiettivo da minimizzare quelle del minor “tempo”, ma ciò non toglie la possibilità che la funzione obiettivo possa essere i “costi” o “lunghezza”, per l’effettuazione del percorso di raccolta.

Si è poi deciso di utilizzare come criterio di scelta il criterio del risparmio per l’inserimento del nodo nel tragitto parziale.

Per i nodi ancora da visitare viene cercata la collocazione all’interno del percorso parziale già definito, inserimento che viene ricercato mediante la massimizzazione del risparmio: tra tutti i nodi la cui collocazione è esaminata con la procedura descritta, viene inserito quello che minimizza la funzione obiettivo. Insieme al nodo viene inclusa nel percorso anche la sequenza di nodi che sono necessari per il collegamento tra il nodo scelto e un estremo del percorso parziale.

La procedura descritta tiene in conto, nelle varie fasi, dei vincoli dovuti alla viabilità (archi transitabili solo in determinate fasce orarie, uscite da scuole, uffici, ecc.) e dell’intensità di traffico sull’arco in corrispondenza dei diversi istanti di passaggio del mezzo. Il diagramma di flusso illustra schematicamente le varie fasi di funzionamento del programma.

ANOVA KBSS - REALAZIONE-RIEP-13132.doc

18

SCHEMA GENERALE DI FUNZIONAMENTO DEL PROGRAMMA

Rete di raccolta: input nodi ed archi

Mezzi per la raccolta dei RSU

Tipologie di raccolta

Selezione tipo di raccolta da effettuare

Elaborazione percorsi di raccolta

Visualizzazione informazioni e risultati dell'elaborazione

Visualizzazione dei parametri tecnici ed economici relativi ai mezzi selezionati

Visualizzazione dei parametri di raccolta relativi all'utenza e alla caratterizzazione quali- quantitativa dei RSU

FINESTRA PRINCIPALE

Selezione veicoli

ANOVA KBSS - REALAZIONE-RIEP-13132.doc

19

- Tipo_Mezzo - Capacità utile - Costi

Procedura Costo_Fisso

COSTI FISSI

Algoritmo "Max_Risparmio" Confronto e scelta tra i possibili percorsi relativamente ad ogni mezzo disponibile (routine da ripetere per ogni mezzo)

- Nodi - Archi - Tempi e costi di

percorrenza

PERCORSO OTTIMALE Nodo_in Nodo_out Sequenza archi

TEMPO_PERCORSO

archi percorsonodi sosta ttT

COSTO_PERCORSO

percorrnzaarchiCC

COSTI VARIABILI

COSTO TOTALE

Mezzo_1: (tempo_1; costo_1) ……………………………… ……………………………… Mezzo_n: (tempo_n; costo_n)

Scelta soluzione ottima Minimo per costi e/o per tempi END

START

ANOVA KBSS - REALAZIONE-RIEP-13132.doc

20

Come si è già discusso nei paragrafi precedenti l’approccio fondamentale alla base del prototipo è quello di definire la rete di raccolta con tutte le sue limitazioni e i suoi vincoli. Tale procedura è favorita dall’interfaccia grafica del programma. Infatti, è possibile inserire i nodi e gli archi (con le loro proprietà), costituenti la rete attraverso il semplice utilizzo del mouse. Inoltre, l’impostazione dell’interfaccia grafica è tale che la visualizzazione dell’oggetto sarà differente a seconda delle sue proprietà. Prendiamo per esempio l’elemento nodo. Questi avrà forma e colore differente a seconda se si tratta di un nodo incrocio, nodo cassonetto per la raccolta indifferenziata, del vetro della carta ecc. Gli archi saranno tutti orientati quindi un doppio senso sarà rappresentato da due archi paralleli ma con verso opposto. Sarà compito dell’operatore in base ai dati a disposizione dell’azienda preposta alla raccolta definire i tempi di percorrenza, le lunghezze degli archi e il volume di rifiuti associati ad ogni cassonetto.

4. RISULTATI

Gli algoritmi sviluppati hanno come punto di partenza una rete con tutti i vincoli territoriali già immagazzinati nelle proprietà degli elementi che la costituiscono.

La risoluzione della ricerca dei percorsi ottimali è duplice. Come già è stato detto in precedenza nel database i dati possono essere inseriti con due modalità differenti:

inserendo i dati relativi ad unico modulo, cioè i dati relativi ad un’unica sottorete la cui capacità complessiva è pari a quella di un solo mezzo;

inserendo i dati relativi ad un’intera zona sulla quale agiscono più camion.

Nel primo caso si utilizzeranno algoritmi di tipo sequenziale che daranno come soluzione una lista di possibili percorsi che toccano tutti i nodi del modulo, ordinati in maniera decrescente secondo la funzione obiettivo. Nel secondo caso, definito il numero di camion con relativa capacità, attraverso l’algoritmo del Risparmio, applicato alla funzione obiettivo, la soluzione sarà costituita da un numero di percorsi pari al numero di camion imposto. Per ogni percorso viene fornito sia la sequenza dei nodi sui quali il camion transita, sia i nodi che devono essere caricati, sia il tempo di percorrenza impiegato per effettuare l’intero giro. È possibile che si verifichi la condizione che su un nodo transitino più mezzi a causa della particolare circolazione stradale del tessuto cittadino sotto esame, ma non ci sarà confusione sui nodi che ogni camion deve raccogliere perché l’algoritmo fornisce per ogni mezzo la lista dei nodi ad esso associato. Quindi, nel computo del tempo di percorrenza dell’intero percorso, il tempo di carico e scarico di un nodo sarà associato solo al camion addetto alla sua raccolta. In tal modo, vengono definiti anche i moduli relativi ad ogni mezzo di raccolta che in questo caso non saranno ben separati tra di loro, ma ci sarà la possibilità che si intersechino lungo la rete stradale. Passo successivo sarà quello di trovare più percorsi per ogni modulo trovato. Infatti definiti i moduli (cioè i nodi che ogni mezzo deve raccogliere), attraverso l’algoritmo sequenziale sarà possibile trovare una lista di percorsi alternativi a quello trovato con l’algoritmo del Risparmio che toccano gli stessi nodi. L’applicazione delle metodologie euristiche richiede sempre un approccio prudente al sistema in quanto non sempre si è in grado di valutare lo scostamento della soluzione trovata da quella di ottimo e, anche quando si fosse in grado di definire un stima di detto scostamento, non sarebbe possibile avere una stima per ciascuna variabile di scelta utilizzata. Comunque la rapidità con cui è possibile, una volta definita planimetricamente la zona di operatività del mezzo ed assunte le necessarie informazioni sul traffico e sulla viabilità, ottenere un percorso tendente all’ottimale, consente all’Azienda di disporre uno strumento in grado di effettuare una razionalizzazione del servizio, ed allo stesso tempo un risparmio sui costi e/o un minore impatto del servizio sulla cittadinanza.

ANOVA KBSS - REALAZIONE-RIEP-13132.doc

21

MODELLI DI BASE ADOTTATI NEL PROTOTIPO

ANOVA KBSS - REALAZIONE-RIEP-13132.doc

22

A) MODELLO DEL MINIMO PERCORSO (per modulo/zona - singolo automezzo)

La ricerca del percorso ottimo per tempo o lunghezza, in un “modulo” coincidente con l’area di operatività di un singolo automezzo di differenti capacità, è stata effettuata utilizzando un algoritmo sequenziale. Il problema è: dati n cassonetti ed un veicolo raccoglitore, la cui capacità è tale da prelevare tutto il contenuto degli n nodi, quest’ultimo deve svuotare tutti i cassonetti fissato il nodo di ingresso e quello di uscita dalla rete, in generale coincidente con il deposito. I passi fondamentali dell’algoritmo sono:

1. Procedura ELEMENT: definisce tutti i percorsi elementari, rispettando i vincoli della rete viaria;

2. Procedura COMPLETE: prende a uno ad uno tutti i percorsi elementari e li compone in sequenza, preferendo quelli che hanno un numero maggiore di nodi mancanti del percorso parziale, e scartando gli altri;

3. L’ultima procedura ordina in modo decrescente la lista dei percorsi così ottenuti in base al tempo o alla lunghezza del tragitto.

START

Inizializzazione matrici:

Nodi()=vettore colonna degli ID_nodo

Archi()=matrice n2; 1a col. ID_nodo di

partenza, 2a col. ID_nodo di arrivo

inizializzazione liste:

colTN= tempi di svuotamento dei nodi colTA= tempi di percorrenza degli archi colLA=lunghezze degli archi.

Ricerca dei percorsi elementari:

percorso elementare = sequenza di nodi che parte dall’ingresso della rete e dove i nodi cassonetto sono visitati al più una sola volta.

Ricerca dei percorsi completi: percorso completo = sequenza di nodi che parte dall’ingresso della rete e tocca tutti i nodi cassonetto almeno una volta.

ELEMENT

COMPLETE

Ordinamento dei percorsi completi: 1) ordinamento secondo il tempo di

percorrenza complessivo 2) ordinamento secondo la lunghezza

totale

END

ANOVA KBSS - REALAZIONE-RIEP-13132.doc

23

ELEMENT

k = ID_nodo di partenza

Creazione della lista col

Archi(i,1) = k

i = 1

s = k + “-“ + Archi(i,2)

Aggiungere s alla lista col

i <= dimen- sione(Archi)

E1

i = i + 1

VERO

FALSO

VERO

FALSO

ANOVA KBSS - REALAZIONE-RIEP-13132.doc

24

E1

k = Ultimo Nodo(x)

Creazione della lista colElem

Archi(i,1) = k

i = 1

s = x + “-“ + Archi(i,2)

Aggiungere s alla lista

col

i <= dimen- sione(Archi)

i = i + 1

Prossima x nella lista col

Il nodo

Archi(i,2) s

Aggiungere s alla lista colElem

VERO FALSO

VERO

FALSO

Elimina x dalla lista col

Ultimo elemento di col

END

numero di elementi di col = 0

VERO

FALSO

FALSO

FALSO

VERO

VERO

ANOVA KBSS - REALAZIONE-RIEP-13132.doc

25

yy = cc + s

COMPLETE

Creazione delle liste: col2 – lista temporanea dei percorsi non terminati colNodManc – lista dei nodi mancanti di ogni percorso non terminato colTerminati – lista completa dei percorsi terminati colTerminti2 – lista temporanea dei percorsi terminati

Aggiungere s alla lista col

Prossimo cc nella lista col

colNodManc = Nodi Mancanti (cc)

Prossimo y nella lista colElem

s =Percorso Restante( y) a partire da Ultimo Nodo(cc)

nnm =Numero Nodi Mancanti( yy)

nnm < Nodi di colNodManc

nnm > 0

VERO

MinNodManc = Minimo(nnm, MinNodManc)

Aggiungere yy alla lista col2

VERO

Aggiungere yy alla

lista colTerminati2

FALSO

FALSO

Ultimo percorso di colElem

FALSO

VERO

Prossimo s nella lista colElem

C1 CS CC CW

ANOVA KBSS - REALAZIONE-RIEP-13132.doc

26

B)

Elimina cc dalla lista col

Ultimo percorso di col

FALSO

VERO

C1 CC

No percorsi di

colTerminati2 > 0

FALSO O

No percorsi

di col2 > 0

MinNodManc = MinNodManc + 1

VERO

Prossimo x nella lista col2

Numero Nodi Mancanti( yy)

<= MinNodManc

VERO

FALSO

Aggiungere x alla lista col

Elimina x dalla lista col2

Ultimo percorso di col2

FALSO

CW

VERO

FALSO O

VERO O

Prossimo x nella lista col Prossimo y nella lista col2

Prossimo z nella lista colTerminati2

Elimina x dalla lista col Elimina y dalla lista col2

Elimina z dalla lista colTerminati2

Aggiungere z alla lista colTerminati

Percorsi di col, col2, colTerminati

sono finiti?

FALSO

Ultimo percorso di colElem

VERO O

FALSO

CS

END VERO O

ANOVA KBSS - REALAZIONE-RIEP-13132.doc

27

B) MODELLO EURISTICO DEL MASSIMO RISPARMIO (per zona - più automezzi)

Per la risoluzione del problema dell’ottimizzazione del percorso con vincoli e con più veicoli è stato utilizzato un algoritmo che tiene conto dell’effettiva capacità del mezzo preposto alla raccolta. Si è impiegato il criterio del risparmio nella forma da noi modificata per grafi orientati non completamente connessi, per i quali la matrice dei risparmi è in generale non simmetrica. L’algoritmo è caratterizzato da tre procedure principali:

1) Procedura CAMIN: ricerca i percorsi minimi tra due coppie di nodi della rete viaria,

implementando l’algoritmo di Floyd-Warshall. Al termine della routine abbiamo inizializzato

la matrice m()=[nn] delle distanze o tempi minimi, e la matrice ms()=[nn] delle stringhe percorso minimo tra coppie di nodi;

2) Procedura RISP: definisce gli elementi della matrice s()=[nn] dei risparmi tra coppie di nodi della rete, elementi utilizzati per riempire una lista che viene ordinata in modo decrescente;

3) Procedura MAXRISP: viene scelto il numero e il tipo (volume max) dei mezzi di raccolta;

successivamente si ricerca nella lista dei risparmi, a partire dagli archi con risparmio maggiore, i nodi che completano il percorso di ogni singolo automezzo compatibilmente con la sua capacità e ottimizzando rispetto al tempo di percorrenza del tragitto.

L’ultima procedura, che è il nucleo dell’algoritmo di ricerca, merita una descrizione più dettagliata dei passi da compiere:

1. la routine parte scegliendo come arco iniziale quello con il massimo risparmio dalla lista

ordinata dalla procedura RISP; 2. si fissa poi la capacità massima dell’automezzo da riempire; 3. dalla lista dei risparmi si estrae, a partire dal massimo risparmio, l’insieme degli archi, tutti

con lo stesso risparmio, che possono essere aggiunti all’inizio o alla fine del tragitto parziale;

4. dall’insieme degli archi si estrae l’arco che ha il maggior numero di nodi mancanti al

percorso parziale, che ha il minor distanza o tempo di percorrenza e che rispetta il vincolo sulla capacità dell’automezzo;

5. l’arco scelto viene aggiunto alla sinistra o alla destra del percorso parziale; 6. se la capacità dell’automezzo è stata raggiunta si esce dal ciclo, altrimenti si ripete dal

punto 3; 7. viene verificato il numero di nodi visitati dal percorso parziale: se coincide col numero

totale dei nodi della rete si esce dall’algoritmo, altrimenti viene creata la lista dei nodi mancanti e viene salvato il primo percorso parziale ottenuto;

8. si fa ripartire l’algoritmo dal punto 2, scegliendo come arco iniziale il primo arco con il

massimo risparmio i cui nodi estremi non sono già contenuti nei percorsi parziali, completi per capacità, finora trovati.

ANOVA KBSS - REALAZIONE-RIEP-13132.doc

28

START

Inizializzazione matrici:

m()=[nn] delle distanze o tempi minimi tra coppie di nodi

=(1E+38, ij); =(0, i=j)

ms()=[nn] dei percorsi minimi per distanze o tempo tra coppie di nodi della rete

s()=[nn] dei risparmi tra coppie di nodi della rete inizializzazione liste:

colTN= tempi di svuotamento dei nodi colVN=volume massimo di ogni nodo colTA= tempi di percorrenza degli archi fondamentali colLA=lunghezze degli archi fondamentali

Costruzione dei risparmi:

definizione degli elementi della matrice s() dei risparmi tra coppie di nodi della rete, e loro ordinamento in una lista con valori decrescenti.

Ricerca dei percorsi minimi: percorso minimo = sequenza che collega una coppia di nodi della rete con la minima distanza o tempo di percorrenza.

CAMIN

RISP

Ricerca dei percorsi completi: 1. scelta del numero e del tipo

(volume max) dei mezzi di raccolta 2. ricerca nella lista dei risparmi dei

nodi che completano il percorso di ogni singolo automezzo compatibilmente con la sua capacità e ottimizzando rispetto al tempo di percorrenza del tragitto.

END

MAXRISP

ANOVA KBSS - REALAZIONE-RIEP-13132.doc

29

CAMIN

j =1

m(j,i) < 1E+38

VERO

j = j + 1

FALSO

k = 1

VERO

FALSO

s = m(j,i) + m(i,k)

s < m(j,k)

VERO

m(j,k) = s ms(j,k) = ms(j,i) + TogliPrimo(ms(i,k))

FALSO

k < Ubound(m) VERO

FALSO

VERO

FALSO

i = i + 1

VERO

END

FALSO

m(i,k) < 1E+38

j < Ubound(m)

i < Ubound(m)

k = k + 1

i =1

ANOVA KBSS - REALAZIONE-RIEP-13132.doc

30

j < UBOUND(m) FALSO

i < UBOUND(m)

VERO

FALSO

RISP

Creazione delle liste: col – lista dei risparmi tra due coppie di nodi colk – lista delle chiavi corrispondenti ai risparmi ordinate in modo decrescente

j = 1

s(i,j) = m(i,1) + m(1,j) – m(i,j)

i j

VERO

FALSO

i = 1

j < UBOUND(m)

j = j + 1

FALSO

i < UBOUND(m)

VERO

FALSO

i = i + 1

j = 1

Definizione della chiave: k = i + “-“ + j

i j

VERO

FALSO

i = 1

j = j + 1 i = i + 1

VERO

Prossimo x nella lista colk

s(i,j) > col(x)

Ultimo arco di colk

Aggiungere s(i,j) con chiave k prima di x alla lista col

Aggiungere k con chiave k prima di x alla lista colk

END VERO

VERO

VERO

FALSO

FALSO

ANOVA KBSS - REALAZIONE-RIEP-13132.doc

31

MAXRISP

rp=0

Prossimo X in colk

a=LimitiArco(colk(1)) Y=ms(a.e1,a.e2)

Volcam=Volume massimo dei mezzi

a=LimitiArco(X)

(Primo(Y)=a.e2 and Instr(Y+pp,a.e1)=0) or (Instr(Y+pp,a.e2)=0

and Ultimo(Y)=a.e1)

rp=0

VERO

FALSO rp=col(X)

Aggiungi X alla lista cola(1)

VERO

rp<=col(X)

Ultimo elemento di colk

FALSO

VERO

FALSO

VERO

P2

FALSO

PR1

PR2

ANOVA KBSS - REALAZIONE-RIEP-13132.doc

32

P2

nm=32767 ta=3.402823E+38

YY=””

Prossimo X nella lista cola(1)

Primo(Y)=a.e2

NewY=TogliUltimo(ms(a.e1,a.e2))+Y NewY=Y+TogliPrimo(ms(a.e1,a.e2))

nm2=NumNodManc(newY+pp)

a=LimitiArco(X)

ta2=m(a.e1,a.e2)

(nm>nm2 Or (nm=nm2 and ta2<ta)) and

VolRaccolto(newY+pp)<=volcam

YY=newY nm=nm2 ta=ta2

VERO FALSO

VERO

FALSO

Rimuovi l’elemento X dalla lista cola(1)

Ultimo elemento della lista cola(1)

FALSO

YY””

Y=YY

VERO

FALSO

P3

PR1

ANOVA KBSS - REALAZIONE-RIEP-13132.doc

33

P3

Costruisci la lista con i nodi presenti nella stringa YY+pp

ColND = Nodpres(YY+pp)

Il numero di elementi

di colND è uguale al n° di nodi della rete

END

VERO

FALSO

pp=YY+pp rp=0 ta=0

Prossimo X della lista colk

a=LimitiArco(X)

Instr(pp,a.e1)=0 and

Instr(pp,a.e2)=0

m(a.e1,a.e2)<ta

rp>col(X)

rp=0

VERO

VERO

FALSO

rp=col(X) ta=m(a.e1,a.e2)

YY=X

ta=m(a.e1,a.e2) YY=X

VERO

Ultimo elemento di colk(X)

FALSO

a=LimitiArco(YY)

Y=ms(a.e1,a.e2)

VERO

FALSO

VERO

PR2

volcam=volcam+volMezzo(i+1)

ANOVA KBSS - REALAZIONE-RIEP-13132.doc

34

C) LISTATI DEI PROGRAMMI DELLE PROCEDURE Dim Nodi() As Long

Dim Archi() As Long

Dim m() As Single

Dim ms() As String

Dim colTN As New Collection 'lista dei tempi di ogni nodo

Dim colVN As New Collection 'lista dei volumi di ogni nodo

Dim colTA As New Collection 'lista dei tempi di ogni arco

Dim colLA As New Collection 'lista delle lunghezze di ogni arco

Private Type arco

e1 As Long

e2 As Long

End Type

Private Sub CamminoMinimo() 'algoritmo di Floyd-Warshall

For i = 1 To UBound(m)

For j = 1 To UBound(m)

If m(j, i) < 1E+38 Then

For k = 1 To UBound(m)

If m(i, k) < 1E+38 Then

s = m(j, i) + m(i, k)

If s < m(j, k) Then

m(j, k) = s

ms(j, k) = ms(j, i) & TogliPrimo(ms(i, k))

End If

End If

Next k

End If

Next j

Next i

End Sub

Private Function Ultimo(ByVal s As String) As Integer

'Restituisce l'ultimo nodo di una stringa s

For j = Len(s) To 1 Step -1

If Mid(s, j, 1) = "-" Then Exit For

Next j

Ultimo = Mid(s, j + 1)

End Function

Private Function Primo(ByVal s As String) As Integer

'Restituisce il primo nodo di una stringa s

For j = 1 To Len(s)

If Mid(s, j, 1) = "-" Then Exit For

Next j

Primo = Mid(s, 1, j - 1)

End Function

Private Function TogliPrimo(ByVal s As String) As String

' Data una stringa s restitusce la parte di stringa successiva al primo nodo

For j = 1 To Len(s)

If Mid(s, j, 1) = "-" Then Exit For

Next j

TogliPrimo = Mid(s, j)

End Function

Private Function TogliUltimo(ByVal s As String) As String

' Data una stringa s restitusce la parte di stringa precedente l'ultimo nodo

For j = Len(s) To 1 Step -1

If Mid(s, j, 1) = "-" Then Exit For

Next j

TogliUltimo = Mid(s, 1, j)

End Function

Private Function LimitiArco(ByVal s As String) As arco

ANOVA KBSS - REALAZIONE-RIEP-13132.doc

35

' Data una stringa s restitusce i due nodi dell'arco

For j = 1 To Len(s)

If Mid(s, j, 1) = "-" Then Exit For

Next j

LimitiArco.e1 = CLng(Mid(s, 1, j - 1))

LimitiArco.e2 = CLng(Mid(s, j + 1))

End Function

Private Function NumNodManc(ByVal s As String) As Integer

'restitusce il numero di nodi cassonetto mancanti nella stringa s

NumNodi = UBound(Nodi)

For i = 1 To NumNodi

If InStr("-" & s, "-" & Nodi(i) & "-") = 0 Then NumNodManc = NumNodManc + 1

Next i

End Function

Private Function NodManc(ByVal s As String) As Collection

'restitusce una collection con i nodi cassonetto mancanti ad una stringa

Dim c As New Collection

NumNodi = UBound(Nodi)

For i = 1 To NumNodi

k = CStr(Nodi(i))

If InStr("-" & s, "-" & k & "-") = 0 Then

c.Add k, k

End If

Next i

Set NodManc = c

End Function

Private Function NodPres(ByVal s As String) As Collection

'restitusce una collection con i nodi cassonetto visitati nella stringa s

Dim c As New Collection

NumNodi = UBound(Nodi)

For i = 1 To NumNodi

k = CStr(Nodi(i))

If InStr("-" & s & "-", "-" & k & "-") > 0 Then

c.Add k, k

End If

Next i

Set NodPres = c

End Function

Private Function Cassonetti(ByVal s As String, ByVal p As String) As String

'Data la stringa s del percorso trovato, e la stringa p della somma dei percorsi

'precedenti, restituisce la stringa dei cassonetti da raccogliere separati da virgole

NumNodi = UBound(Nodi)

For i = 1 To NumNodi

k = CStr(Nodi(i))

If InStr("-" & s & "-", "-" & k & "-") > 0 And InStr("-" & p & "-", "-" & k & "-") = 0 Then

Cassonetti = Cassonetti & IIf(Cassonetti <> "", ", ", "") & k

End If

Next i

End Function

Private Function Rimanente(ByVal s As String, z As String) As String

' Data una stringa s e un nodo z , restitusce la parte di stringa

' successiva al nodo z

a = InStr("-" & s, "-" & z & "-")

Rimanente = IIf(a > 0, Right("-" & s, Len(s) - a - Len(z) + 1), "")

End Function

Private Function Tempo(ByVal s As String, Optional cc As Collection) As Single

'Restituisce il tempo impiegato per percorrere una stringa s

On Error Resume Next

Dim col As New Collection

For Each X In cc

col.Add X, X

Next X

For i = 1 To Len(s)

ANOVA KBSS - REALAZIONE-RIEP-13132.doc

36

If Mid(s, i, 1) = "-" Then

n1 = IIf(IsEmpty(n2), Mid(s, 1, i - 1), n2)

For j = i + 1 To Len(s)

If Mid(s, j, 1) = "-" Then

Exit For

End If

Next j

n2 = Mid(s, i + 1, j - (i + 1))

i = i + Len(n2)

Call col(n1)

If Err.Number <> 0 Then

Err.Clear

col.Add n1, n1

Tempo = Tempo + colTN(n1) + colTA(n1 & "-" & n2)

Else

Tempo = Tempo + colTA(n1 & "-" & n2)

End If

End If

Next i

Call col(n2) 'ultimo nodo della stringa

If Err.Number <> 0 Then Tempo = Tempo + colTN(n2)

End Function

Private Function VolRaccolto(ByVal s As String) As Single

'Restitusce il volume raccolto nel percorso s

NumNodi = UBound(Nodi)

For i = 1 To NumNodi

If InStr("-" & s & "-", "-" & Nodi(i) & "-") > 0 Then _

VolRaccolto = VolRaccolto + colVN(CStr(Nodi(i)))

Next i

End Function

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////// Algoritmo del percorso minimo //////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Private Sub cmdApplica_Click()

tmp = Time

'cerchiamo tutti gli archi che partono dal primo nodo Archi(1,1) e li

'aggiungiamo alla collection col; questo ci permette di inizializzare

'la ricerca dei percorsi elementari

Dim col As New Collection

k = Archi(1, 1)

NumArchi = UBound(Archi)

For i = 1 To NumArchi

If Archi(i, 1) = k Then

s = k & "-" & Archi(i, 2)

col.Add s, s

Else

Exit For

End If

Next i

'dagli archi di col vengono generati tutti i percorsi elementari sul grafo

'orientato, e sono raccolti nella collection colElem

Dim colElem As New Collection ' collection dei percorsi elementari

Do While True

For Each X In col

k = Ultimo(X)

For i = 1 To NumArchi

If Archi(i, 1) = k Then

kbss = X & "-" & Archi(i, 2)

If InStr("-" & kbss, "-" & Archi(i, 2) & "-") = 0 Then

col.Add kbss, kbss

Else

colElem.Add kbss, kbss

ANOVA KBSS - REALAZIONE-RIEP-13132.doc

37

End If

End If

Next i

col.Remove X

Next X

If col.Count = 0 Then Exit Do

Loop

'i = 0

'For Each X In colElem

' i = i + 1

' Debug.Print i, X

'Next X

'--------------------------------------------------------------------------------

On Error Resume Next

Dim col2 As New Collection

Dim colNodManc As New Collection

Dim colTerminati As New Collection

Dim colTerminati2 As New Collection

ProgressBar1.Max = colElem.Count

ProgressBar1.Min = 1

For k = colElem.Count To 1 Step -1

s = colElem.Item(k)

col.Add s, s

'----------------------------------------------------------------------------

Do While True

For Each cc In col

Set colNodManc = NodManc(cc)

For Each Y In colElem

s = Rimanente(Y, Ultimo(cc))

If s <> "" Then

YY = cc & s

nnm = NumNodManc(YY)

If nnm < colNodManc.Count Then

If nnm > 0 Then

MinNodManc = IIf(col2.Count = 0, nnm, Min(nnm, MinNodManc))

col2.Add YY, YY

Else

colTerminati2.Add YY, YY

End If

End If

End If

Next Y

col.Remove cc

If col2.Count > 99 Then Exit For

Next cc

If colTerminati2.Count > 0 Then Exit Do

If col2.Count > 0 Then

MinNodManc = MinNodManc + 1

For Each X In col2

If NumNodManc(X) <= MinNodManc Then col.Add X, X

col2.Remove X

Next X

Else

Exit Do

End If

Loop

'----------------------------------------------------------------------------

If col.Count > 0 Then

For Each X In col

col.Remove X

Next X

End If

If col2.Count > 0 Then

For Each X In col2

col2.Remove X

ANOVA KBSS - REALAZIONE-RIEP-13132.doc

38

Next X

End If

If colTerminati2.Count > 0 Then

For Each X In colTerminati2

colTerminati.Add X, X

colTerminati2.Remove X

Next X

End If

'For Each w In colTerminati

' Debug.Print w

'Next w

'Debug.Print "------------------------------------------"

ProgressBar1.Value = colElem.Count - k + 1

Next k

'--------------------------------------------------------------------------------

Open "percorsi.txt" For Output As #1

Print #1, colTerminati.Count

For Each z In colTerminati

Print #1, z

Next z

Close #1

ProgressBar1.Value = 0

Label1 = Format(Time - tmp, "hh:mm:ss")

Call RichTextBox1.LoadFile("percorsi.txt")

RichTextBox1.RightMargin = 1000000000

End Sub

//////////////////////////////////////////////////////// Fine algoritmo del percorso minimo ////////////////////////////////////////////////////////

Private Sub cmdOrd_Click()

On Error Resume Next

Dim colPercOrd As New Collection

Dim colTempi As New Collection

Dim colTempi2 As New Collection

tmp = Time

Open "percorsi.txt" For Input As #1

Line Input #1, s

ProgressBar1.Max = CLng(s)

ProgressBar1.Min = 1

While Not EOF(1)

Line Input #1, s

t = Tempo(s)

colTempi.Add t, s

If colPercOrd.Count = 0 Then

colTempi2.Add t, CStr(t)

colPercOrd.Add s, s

Else

colTempi2.Add t, CStr(t)

If Err.Number = 0 Then

bln = True

For Each X In colPercOrd

If t < colTempi(X) Then

bln = False

colPercOrd.Add s, s, X

Exit For

End If

Next X

If bln Then colPercOrd.Add s, s

Else

Err.Clear

End If

End If

n = n + 1

ProgressBar1.Value = n

Wend

Close #1

ANOVA KBSS - REALAZIONE-RIEP-13132.doc

39

Open "percord.txt" For Output As #1

n = 0

For Each a In colPercOrd

n = n + 1

Print #1, n & ")" & vbTab & "T [min] = " & colTempi(a) & vbTab & a

Next a

Close #1

ProgressBar1.Value = 1

Label2 = Format(Time - tmp, "hh:mm:ss")

Call RichTextBox1.LoadFile("percord.txt")

RichTextBox1.RightMargin = 1000000000

End Sub

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////// Algoritmo del max risparmio /////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Private Sub Command1_Click()

Call CamminoMinimo

Open "ms.txt" For Output As #1

For i = 1 To UBound(m)

For j = 1 To UBound(m)

Print #1, ms(i, j),

Next j

Print #1,

Next i

Close #1

Dim s(23, 23) As Single

Open "s.txt" For Output As #1

For i = 1 To 23

For j = 1 To 23

If i <> j Then s(i, j) = m(i, 1) + m(1, j) - m(i, j)

Print #1, s(i, j),

Next j

Print #1,

Next i

Close #1

Dim col As New Collection

Dim colk As New Collection

For i = 2 To 23

For j = 1 To 23

If i <> j Then

k = i & "-" & j

If col.Count = 0 Then

col.Add s(i, j), k

colk.Add k, k

Else

bln = True

For Each X In colk

If s(i, j) > col(X) Then

bln = False

col.Add s(i, j), k, X

colk.Add k, k, X

Exit For

End If

Next X

If bln Then

col.Add s(i, j), k

colk.Add k, k

End If

End If

End If

Next j

Next i

Open "os.txt" For Output As #1

ANOVA KBSS - REALAZIONE-RIEP-13132.doc

40

For Each X In colk

Print #1, X, col(X)

Next X

Close #1

Dim a As arco

Dim cola() As New Collection

ReDim cola(1)

Dim colNd As New Collection

Dim colTerm As New Collection

a = LimitiArco(colk(1))

Y = ms(a.e1, a.e2)

Do While True

volcam = volcam + 16

Do While True 'NumNodManc(Y) > 0

rp = 0 'risparmio

For Each X In colk

a = LimitiArco(X)

If (Primo(Y) = a.e2 And InStr("-" & Y & "-" & pp & "-", "-" & a.e1 & "-") = 0) Or _

(InStr("-" & Y & "-" & pp & "-", "-" & a.e2 & "-") = 0 And Ultimo(Y) = a.e1) Then

If rp = 0 Then rp = col(X)

cola(1).Add X, X

End If

If rp > col(X) Then Exit For

Next X

nm = 32767 'nodi mancanti -> max integer

ta = 3.402823E+38 'tempo arco -> max single

YY = ""

For Each X In cola(1)

bln = False

a = LimitiArco(X)

newY = IIf(Primo(Y) = a.e2, TogliUltimo(ms(a.e1, a.e2)) & Y, Y & TogliPrimo(ms(a.e1, a.e2)))

nm2 = NumNodManc(newY & "-" & pp)

ta2 = m(a.e1, a.e2) 'Tempo(newY, colNd) 'Tempo(ms(a.e1, a.e2))

If ((nm > nm2) Or (nm = nm2 And ta2 < ta)) And VolRaccolto(newY & "-" & pp) <= volcam Then

YY = newY

nm = nm2

ta = ta2

End If

cola(1).Remove X

Next X

If YY <> "" Then

Y = YY

Else

Exit Do

End If

Debug.Print Y

Loop

colTerm.Add Y

Debug.Print Y, Tempo(Y, colNd), Cassonetti(Y, pp)

Debug.Print String(25, "/")

Set colNd = NodPres(Y & "-" & pp)

If colNd.Count = UBound(Nodi) Then Exit Do

pp = Y & IIf(Not IsEmpty(pp), "-", "") & pp

rp = 0

ta = 0

For Each X In colk

a = LimitiArco(X)

If InStr("-" & pp & "-", "-" & a.e1 & "-") = 0 And InStr("-" & pp & "-", "-" & a.e2 & "-") = 0 Then

If rp = 0 Then

rp = col(X)

ta = m(a.e1, a.e2)

YY = X

ElseIf rp > col(X) Then

Exit For

Else

ANOVA KBSS - REALAZIONE-RIEP-13132.doc

41

If m(a.e1, a.e2) < ta Then

ta = m(a.e1, a.e2)

YY = X

End If

End If

End If

Next X

a = LimitiArco(YY)

Y = ms(a.e1, a.e2)

Loop

End Sub

//////////////////////////////////////////////////////// Fine algoritmo del max risparmio /////////////////////////////////////////////////////////

Private Sub Form_Load()

Dim rsA As New ADODB.Recordset

Dim rsN As New ADODB.Recordset

Set rsN = de.rsnodi

rsN.Open

'de.cn.Open

rsA.Open "SELECT ID_nodo1 as N1, ID_nodo2 as N2, tempo as T, lunghezza as L From archi ORDER BY

archi.ID_nodo1, archi.ID_nodo2", de.cn

ReDim m(rsN.RecordCount, rsN.RecordCount)

ReDim ms(rsN.RecordCount, rsN.RecordCount)

For i = 1 To UBound(m)

For j = 1 To UBound(m)

m(i, j) = IIf(i = j, 0, 1E+38)

ms(i, j) = "-"

Next j

Next i

ReDim Nodi(rsN.RecordCount)

n = 0

rsN.MoveFirst

While Not rsN.EOF

n = n + 1

Nodi(n) = rsN!ID_nodo

colTN.Add CSng(rsN!Tempo), CStr(Nodi(n))

colVN.Add CSng(rsN!volume), CStr(Nodi(n))

rsN.MoveNext

Wend

rsN.Close

ReDim Archi(rsA.RecordCount, 2)

n = 0

rsA.MoveFirst

While Not rsA.EOF

n = n + 1

Archi(n, 1) = rsA!n1

Archi(n, 2) = rsA!n2

m(rsA!n1, rsA!n2) = CSng(rsA!t)

s = CStr(Archi(n, 1)) & "-" & CStr(Archi(n, 2))

ms(rsA!n1, rsA!n2) = s

colTA.Add CSng(rsA!t), s

colLA.Add CSng(rsA!l), s

rsA.MoveNext

Wend

rsA.Close

End Sub

Private Sub RichTextBox1_Click()

RichTextBox1.RightMargin = 1000000000

End Sub