|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Nov 2004
Messaggi: 862
|
Algoritmo per problema TST in C??
Salve a tutti,
devo implementare il problema del commesso viaggiatore in C; in poche parole date 1000 cordinate di citta, devo trovare il cammini (percorso) piu breve per passarle tutte. Han detto di utilizzare l'algoritmo 2 OPT. Cercando in google non ho trovato informazioni su esso, ci sarebbe qualcuno che perpiacere mi potrebbe dire come funziona, o dare il pseucodice? almeno da averne una idea su come implementarlo. Grazie mille. |
![]() |
![]() |
![]() |
#2 |
Member
Iscritto dal: Jul 2005
Messaggi: 131
|
Io userei uno SPath usando un approccio Dijkstra.
Ti metto il codice, vedi se puoi prendere spunto per fare quello che ti serve. Ciao #include <stdio.h> #include <stdlib.h> #define TRUE 1 #define FALSE 0 typedef int bool; /* grafo non etichettato */ #include "grafo.h" /* implementazione mediante liste di adiacenza */ typedef int itemType; /* code di interi */ #include "queue.h" define N 25 /* N: numero dei nodi del grafo */ int dist[N]; /* array delle distanze */ int ST[N]; /* albero dei cammini */ void ShortestPaths(TipoGrafo g, int NumNodi, int nodo_iniz, void visita(int)) { int i, j; queue nodi_da_visitare; bool visitati[NumNodi]; /* inizializzazione */ for (i = 0; i < NumNodi; i++) {visitati[i] = 0; dist[i]=0; ST[i]=i;} nodi_da_visitare=initQueue(NumNodi*NumNodi); enqueue(nodi_da_visitare, nodo_iniz); /* cicla finche' ci sono nodi da visitare */ while (!emptyQueue(nodi_da_visitare)) { /* prendi il prossimo nodo i da visitare */ i=dequeue(nodi_da_visitare); /* analizza il nodo i e lo pone tra i nodi visti */ if (!visitati[i]) { struct edge *ptr; /* implementazione esplicita */ visita(i); visitati[i] = 1; /* aggiunge i successori non visitati del nodo i ai nodi da visitare */ ptr=g[i]; while (ptr!=NULL){ if (!visitati[ptr->v]){ enqueue(nodi_da_visitare, ptr->v); ST[ptr->v]=i; dist[ptr->v]=dist[i]+1; } ptr=ptr->next; } /* end-while */ } /* end-if */ } /* end-while */ } /* VisitaInAmpiezza-ST */ void StampaPath(int s, int t) { if (s==t) printf("%d ", s); else if (ST[t]==t) printf("Nessun cammino tra %d e %d", s,t); else { StampaPath(s,ST[t]); printf("%d ", t); } } /******* grafi etichettati *************/ typedef char *TipoEticNodo; typedef unsigned float TipoEticArco; struct arcoEtic { int v; TipoEticArco etic; struct arcoEtic *next; }; struct nodoEtic { TipoEticNodo etic; struct arcoEtic *next; }; typedef struct nodoEtic *TipoGrafoEtic; #include "pqueue.h" /* itemType gia' definito come int */ /* def. funzione di confronto */ int DistCmp(int i, int j){ /* distanze minori dalla sorgente hanno priorit‡ maggiore */ return (dist[i]<dist[j])? 1: ((dist[i]==dist[j])? 0: -1); } void RipristinaUp(pqueue pq, int v, int cmp(itemType, itemType)){ /* v e' il vertice. E' aumentata la priorita' */ int temp, k; k=pq->top[pq->cnt-1]; while (pq->top[k]!=v) k--; fixUp(pq, k, cmp); } void Dijkstra_like(TipoGrafoEtic g, int NumNodi, int nodo_iniz) { /* shortest paths: approccio Dijkstra */ int i, j; pqueue pq; /* coda di priorit‡ sugli interi */ bool visitati[NumNodi]; /* inizializzazione */ for (i = 0; i < NumNodi; i++){ visitati[i] = FALSE; ST[i]=i; dist[i]=0; } pq = initPQ(NumNodi*NumNodi); /* impl. heap */ insertPQ(pq, nodo_iniz, DistCmp); while (!emptyPQ(pq)) { i=delMax(pq, DistCmp); /* il vertice i e' quello di priorita' max */ if (!visitati[i]) { struct arcoEtic *ptr=g[i].next; visitati[i]=TRUE; while (ptr!=NULL){ if (!visitati[ptr->v] && dist[ptr->v]==0){ /* adiacente non in pq */ ST[ptr->v]=i; dist[ptr->v]=dist[i]+ptr->etic; insertPQ(pq,ptr->v,DistCmp); } else if (!visitati[ptr->v] && dist[ptr->v]>dist[i]+ptr->etic){ ST[ptr->v]=i; dist[ptr->v]= dist[i]+ptr->etic; RipristinaUp(pq,ptr->v, DistCmp); } ptr=ptr->next; } /* end-while */ } /* end-if */ } /* end-while */ }
__________________
PowerBook G4 1,5, 60Gb Hd, 1,2 Gb DDR, mouse wireless by Apple, iPod nano black 4GB, laurea in informatica ![]() GeForce Fx 5200 64mb |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1842
|
Quote:
![]() Anche io devo farlo e sono messo un po' male per ora però ci sto lavorando su. |
|
![]() |
![]() |
![]() |
#4 |
Member
Iscritto dal: Jul 2005
Messaggi: 131
|
No, sono laureato in informatica! In bocca al lupo per l'esame...
pbg4
__________________
PowerBook G4 1,5, 60Gb Hd, 1,2 Gb DDR, mouse wireless by Apple, iPod nano black 4GB, laurea in informatica ![]() GeForce Fx 5200 64mb |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Nov 2004
Messaggi: 862
|
Grazie per le risposte, si faccio scienze dell'informazione....
cmq devo per forza utilizzare l'algoritmo 2-OPT, qualcosa su esso avete? anche un pseudocodice va bene, almeno da avere uno spunto..... ![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 09:37.