Allora sto realizzando uno script in AMPL per il TSP con le finestre temporali.
Ho già pensato e lavorato sui tre vincoli principali (da ogni nodo entra/esce un arco ed eliminazione sottocicli) ma non riesco con i vincoli di tempo per il nodo "Ristorante" (che ha indice 4).
Io ho 6 nodi, per esempio (da 1 a 6, "Ristorante" ha indice 4).
Non riesco a creare un array, di 6 elementi (cioè 6 nodi), che chiamerò tempo_arresto_nodo.
Ho provato di tutto ma ho sempre errori (specialmente di sintassi).
Mi potreste gentilmente darmi una mano? Pongo parte del codice qui sotto:
PS: "10" (cioè è il limite temporale messo a caso, per esempio)
- Codice:
...
/* Definisco i nodi del mio grafo */
set nodi;
param nomeNodi{nodi} symbolic;
/* Definisco la quantità dei nodi presenti */
param numeroNodi := card(nodi);
/* Definisco la distanza tra due nodi */
param distanza{nodi, nodi};
/* Definisco il tempo per il pranzo */
param pausa_pranzo;
/* Definisco il tempo di fermo di ogni nodo */
param tempo_arresto {nodi} integer;
...
minimize distanzaCammino:
sum{i in nodi, j in nodi} ((arco[i,j]*distanza[i,j]) + tempo_arresto_nodo[i]);
/* COME DEFINISCO IL VETTORE */
/* Sottoposti ai seguenti vincoli */
subject to
# exactly one outgoing
c1{k in nodi}: sum{i in nodi} arco [i,k] = 1;
# exactly one incoming
c2{k in nodi}: sum{j in nodi} arco [k,j] = 1;
# no subtours
c3{k in nodi, j in nodi: j > 1 and k > 1}:
sottoCicli[j] - sottoCicli[k] + numeroNodi*arco [j,k] <= numeroNodi-1;
# finestra temporale dove "4" è l'indice del ristorante (attendere fino all'apertura del ristorante)
c4:
sum{i in nodi, j in nodi: i < 4 and j < 4} ((arco[i,j]*distanza[i,j])+tempo_arresto_nodo[i]) <= 100;
...
data;
param: nodi: nomeNodi :=
1 "Via Novagli Campagna"
2 "Pasticceria Europa"
3 "Penny Market"
4 "Ristorante"
5 "Municipio"
6 "Scuole medie"
;
param distanza: 1 2 3 4 5 6 :=
1 500000 4.7 4.2 4.3 4.3 4.9
2 5.4 50000 1.4 2.3 2.1 2.3
3 4.3 0.85 50000 1 0.85 1.1
4 4 2.2 1.7 50000 1.7 2.4
5 4.2 1.6 0.95 0.75 50000 1
6 6 2.7 2.1 1.7 1.2 50000
;
---
/* VOGLIO ASSEGNARE PER OGNI ELEMENTO di tempo_arresto_nodo[I] valore (lo deciderò io): ma come? */
L'idea sarebbe giusta?
Arco[i,y] è un vettore di due dimensioni, binario
Grazie!!!