 | |
Il progetto dsy.it è l'unofficial support site dei corsi di laurea del Dipartimento di Scienze dell'Informazione e del Dipartimento di Informatica e Comunicazione della Statale di Milano. E' un servizio degli studenti per gli studenti, curato in modo no-profit da un gruppo di essi. I nostri servizi comprendono aree di discussione per ogni Corso di Laurea, un'area download per lo scambio file, una raccolta di link e un motore di ricerca, il supporto agli studenti lavoratori, il forum hosting per Professori e studenti, i blog, e molto altro...
In questa sezione è indicizzato in textonly il contenuto del nostro forum |
[Algoritmi] Progetto "RICHIAMI" Clicca QUI per vedere il messaggio nel forum |
Skilotto83 |
Originally posted by mattcobain
tu dici di sapere quanto è lo spazio da allocare....ma scusa come fai a saperlo!?!? a priori non sai quanti automi ci saranno nel piano!!!!
se leggi piu' avanti capirai che infatti è prevista una funzione di rialloco automatico della memoria nel caso servisse per piu' automi dei previsti(kmq l'arrai è inizializzato a 100)... |
mattcobain |
Originally posted by Skilotto83
se leggi piu' avanti capirai che infatti è prevista una funzione di rialloco automatico della memoria nel caso servisse per piu' automi dei previsti(kmq l'arrai è inizializzato a 100)...
si avevo visto la parte del rialloco....però non mi sembra cmq la scelta migliore....anche perché tu inizializzi l'array con 100 automi, e magari ne vengono inseriti solo 2....capisci che c'è spreco!!!
cmq come ti ho detto....ormai l'importante è riuscire a fare qlcosa di funzionante!!!!! |
wingzero |
Originally posted by Novalis
(non ho letto le pagine centrali del thread, perdonate eventuali scoperte dell'acqua calda:D)
Lo stesso discorso vale per gli automi... un albero di ricerca (e possono essere inseriti in una sola posizione) ci consente di individuare quelli sensibili al richiamo perchè, una volta percorso l'albero seguendo la stringa del messaggio, tutti gli automi presenti nel sottoalbero sono candidati a raggiungere la sorgente.
Non dipende dalla posizione in cui si trovano quali automi rispondono al messaggio. La posizione determina rispetto al segnale se poi possono raggiungerlo o meno in base alle condizioni. |
maurozaninelli |
Qualcuno ha provato a dare in input l'esempio del tema d'esame? Il mio risultato corrisponde a meno di un comando: e 7 1 10. Nell'esempio è riportato un No a me viene un Si.
Qualcuno ha avuto lo stesso problema??? |
luca8684 |
Originally posted by maurozaninelli
Qualcuno ha provato a dare in input l'esempio del tema d'esame? Il mio risultato corrisponde a meno di un comando: e 7 1 10. Nell'esempio è riportato un No a me viene un Si.
Qualcuno ha avuto lo stesso problema???
:shock: :shock: :shock: :shock: :shock:
Hai già finito????
Che strutture dati hai usato??
:help: :help: :help: :help: :help: :help: |
mattcobain |
Originally posted by maurozaninelli
Qualcuno ha provato a dare in input l'esempio del tema d'esame? Il mio risultato corrisponde a meno di un comando: e 7 1 10. Nell'esempio è riportato un No a me viene un Si.
Qualcuno ha avuto lo stesso problema???
:shock: questo significa che hai finito!?!?
complimenti, ma penso che nessuno qui sia al punto di poter provare l'output del programma!!!!! |
Skilotto83 |
Originally posted by mattcobain
si avevo visto la parte del rialloco....però non mi sembra cmq la scelta migliore....anche perché tu inizializzi l'array con 100 automi, e magari ne vengono inseriti solo 2....capisci che c'è spreco!!!
cmq come ti ho detto....ormai l'importante è riuscire a fare qlcosa di funzionante!!!!!
si..ma se faimkome dice lui teorikamente alloki memoria(fai una calloc) per ogni automa che inserisci(nel caso della lista ma anche nel caso dell'albero) e tieni konto ke quando kiedi al coompilatore di darti 2byte in realta' te ne da un macello in piu'...e soprattutto te li da' sparsi in giro per lo stack...
tenendo conto di questo e del tempo che impiega per allocare memoria ogni volta...alla fine sekondo me è meglio allocare direttamente..volendo posso allocare solo 5posizioni e fargli fare continuamente la realloc..nn cambia nulla... |
Novalis |
Originally posted by wingzero
Non dipende dalla posizione in cui si trovano quali automi rispondono al messaggio. La posizione determina rispetto al segnale se poi possono raggiungerlo o meno in base alle condizioni.
non ho detto mica questo...
gli automi vanno messi nell'albero di ricerca in base alla stringa che viene passata al momento della creazione (detto in soldoni, faccio un ciclo for, e se l'i-esimo carattere è uno zero, vado in un sottoalbero sinistro, se invece è un uno, vado in quello destro).
Una volta emesso un segnale, ad esempio 10101, partirò dalla radice, visiterò prima il sottoalbero destro, poi andrò a sinistra, poi di nuovo a destra, ancora a sinistra e infine a destra: a questo punto tutti gli automi "da qui in giù" sono sensibili al richiamo.
Controllare che poi possano effettivamente muoversi, è una cosa totalmente diversa;) |
mark |
Originally posted by maurozaninelli
Qualcuno ha provato a dare in input l'esempio del tema d'esame? Il mio risultato corrisponde a meno di un comando: e 7 1 10. Nell'esempio è riportato un No a me viene un Si.
Qualcuno ha avuto lo stesso problema???
a me viene NO in quanto non riesce ad arrivare a destinazione in soli 7 passi; hai di mezzo l'ostacolo (o 3 2 7 6)
sempre che abbia capito il problema |
wingzero |
Originally posted by Novalis
non ho detto mica questo...
gli automi vanno messi nell'albero di ricerca in base alla stringa che viene passata al momento della creazione (detto in soldoni, faccio un ciclo for, e se l'i-esimo carattere è uno zero, vado in un sottoalbero sinistro, se invece è un uno, vado in quello destro).
Una volta emesso un segnale, ad esempio 10101, partirò dalla radice, visiterò prima il sottoalbero destro, poi andrò a sinistra, poi di nuovo a destra, ancora a sinistra e infine a destra: a questo punto tutti gli automi "da qui in giù" sono sensibili al richiamo.
Controllare che poi possano effettivamente muoversi, è una cosa totalmente diversa;)
La trovo un pò dispendiosa come cosa solo per controllare il prefisso della stringa in pratica. |
elpampero |
EsistePercorso sono riuscito a implementarlo..mi manca tortuosità e poi è fatta. Ho fatto come è stato detto ieri: con chiamate ricorsive che valutano la posizione corrente e si spostano in base alla destinazione |
Petrik22 |
sono contento per voi che avete gia finito!!!
io sono ancora al main!!!!:sighsob: :please: |
Petrik22 |
:climb: :pccrash: :wall: :ueee: |
Alececk84 |
Originally posted by Petrik22
sono contento per voi che avete gia finito!!!
io sono ancora al main!!!!:sighsob: :please:
Io devo ancora installare un compilatore...:D |
p2p |
scusate ma mi sapete dire come mai questo codice compila ma fa crashare?ho tutti gli automi nella mia bella lista e adesso voglio confrontare i campi per vedere quali sono quelli con minima istanza che effettivamente andranno spostati:
for che scorre...
if (p->distanza < p->next->distanza)
tmp =p->distanza;
else tmp=p->next->distanza;
} |
p2p |
Originally posted by p2p
scusate ma mi sapete dire come mai questo codice compila ma fa crashare?ho tutti gli automi nella mia bella lista e adesso voglio confrontare i campi per vedere quali sono quelli con minima istanza che effettivamente andranno spostati:
for che scorre...
if (p->distanza < p->next->distanza)
tmp =p->distanza;
else tmp=p->next->distanza;
}
mi auto rispondo... l ultimo elemento non ha un puntatore all elemento dopo ovviamente e quindi si incazza :D solo che come faccio? se blocco prima il controllo l ultimo non viene confrontato..... |
Jacoposki |
non puoi mettere il tutto in un while(next->distanza != NULL) o qualcosa del genere? |
p2p |
si ho risolto co un
do{
...
}
while (p->next!=NULL); |
LjL |
Originally posted by wingzero
La trovo un pò dispendiosa come cosa solo per controllare il prefisso della stringa in pratica.
Uhm... suggerimenti migliori?
Il testo dice che la lunghezza delle stringhe non dev'essere limitata. Quindi di sicuro un Stringa=malloc(UnNumeroCheMiPiace) non va bene. Si potrebbe usare realloc, d'accordo (oppure fare una lista di stringhe o varie altre cose piuttosto fastidiose).
Anche usando un realloc, però, rimangono due problemi, uno di tempo e uno di spazio:
1) come cercare gli automi che rispondono a un determinato prefisso (complessità @(n), con n uguale al numero totale di automi, nel caso in cui si usino liste dinamiche)
2) come rappresentare le stringhe con poco dispendio di spazio - infatti, mi sembra di fare un'ipotesi ragionevole supponendo che, nel caso medio, ci saranno "parecchi" automi con prefissi comuni
Per il problema 1), senza stare a fare un'analisi, penso che saremo d'accordo che usare un albero sia quantomeno più efficiente che usare una semplice lista. Certo, ci potrebbero essere altre possibilità.
Per il problema 2), mi pare a occhio e croce che la rappresentazione ad albero sia asintoticamente efficiente *almeno* tanto quanto quella a semplici stringhe, anche nel caso peggiore.
Infatti, se non esistessero automi con prefissi in comune, nella rappresentazione ad albero si "sprecherebbe" un nodo per ogni carattere di ogni stringa, se non vado errato. Nella rappresentazione a semplici stringhe si "sprecherebbe" un bit (o più probabilmente, in C, un char) per ogni carattere di ogni stringa.
Chiaramente per un basso numero di automi e/o una bassa lunghezza delle stringhe la rappresentazione ad albero "spreca" molto più spazio, non c'è dubbio - ma asintoticamente no, se quello che ho scritto è vero. |
LjL |
Originally posted by Skilotto83
si..ma se faimkome dice lui teorikamente alloki memoria(fai una calloc) per ogni automa che inserisci(nel caso della lista ma anche nel caso dell'albero) e tieni konto ke quando kiedi al coompilatore di darti 2byte in realta' te ne da un macello in piu'...e soprattutto te li da' sparsi in giro per lo stack...
tenendo conto di questo e del tempo che impiega per allocare memoria ogni volta...alla fine sekondo me è meglio allocare direttamente..volendo posso allocare solo 5posizioni e fargli fare continuamente la realloc..nn cambia nulla...
Se il compilatore/OS alloca [molto] più heap (non stack ;-) di quanto ne hai chiesto, fondamentalmente è colpa sua. Non ritengo che sia una cosa di cui si debba preoccupare molto il programmatore.
Il fatto che ti dia roba "sparsa in giro" non vedo perché dovrebbe essere un problema.
Il fatto che ci mette del tempo ad eseguire l'operazione è vero, ma considera che ci vuole del tempo anche per eseguire la realloc() -- e si tratta di *parecchio* tempo, nel caso in cui il sistema sia costretto a copiare tutto il tuo blocco di memoria da un'altra parte.
A volte usare array che possono crescere di dimensione (realloc()) non è una cattiva idea, quindi se tu ritieni che nel tuo caso sia una buona idea, fallo - può darsi che tu abbia ragione. Io ci penserei su un paio di volte però. |
LjL |
Originally posted by mattcobain
scusami, ma in questo modo tu con le liste di adiacenza rappresenti tutti i nodi contenuti nel "rettangolo dei cammini minimi" avente come estremi opposti la sorgente e l'automa vero?!
fra i comandi del prof compare un "e -10000 6 11" e l'automa 11 si trova in (-3,6)....questo significa che la sorgente si trova nel punto (-10000,6), cioè "in linea" con l'automa, ma spostato piu a sinistra lungo le x di ben 9997 nodi (o celle/punti che dir si voglia)....quindi tu costruisci altrettanti nodi nella lista di adiacenza!?!?
e questo caso è "moderato" perché il rettangolo che collega sorgente-automa in realtà è solo un segmento, ma se fosse stato il famoso "rettangolo dei cammini minimi" figurati quanti altri nodi ci sarebbero stati in mezzo.....
cioè, tu stai andando avanti cosi!?....se ho capito male potresti spiegarmi un po come hai agito?!
ti ringrazio.....
io non capisco che dannazione fare!!!!!
Io sono d'accordo con te - costruire una matrice (o un ancora più enorme grafo a liste di adiacenza!) di dimensioni |x0-x|*|y0-y| equivale a trattare il piano come un array, nel caso (caso peggiore) in cui automa e richiamo siano collocati a estremi opposti del piano.
Peccato che trattare il piano come un'array sia esplicitamente vietato dal testo ;-)
[Il piano *non ha* estremi, almeno secondo le specifiche... ma di fatto degli estremi dovremo pur imporli, dato che un long int più di quei 32, massimo 64 bit non tiene. In ogni caso, estremi o non estremi, se c'è un automa in (10000, 10000) e il richiamo è in (0, 0) la matrice da costruire sarà di 10'000*10'000=100'000'000. Sai che bello.]
Neanch'io ho ancora trovato una soluzione alternativa che mi piaccia, ma sono assolutamente convinto che ne esistano, e ne ho anche trovate una o due che fanno abbastanza schifo ma dovrebbero essere comunque meglio di un'enorme matrice gigante brutta e cattiva.
Una roba che ho in mente non è nemmeno ricorsiva: provate a considerare gli *archi* del grafo e non i nodi -- ok, no, non sto dicendo di usare i grafi adesso, dico solo, invece di concentrarvi sulle coordinate del piano, concentratevi sui passi che uniscono tra loro queste coordinate.
Esempio: per ogni arco/passo verticale, che tortuosità avremo "accumulato" quando saremo arrivati lì? Be', dato che ci possiamo arrivare o dall'arco verticale precedente, o dall'arco orizzontale precedente (ma in quel caso la tortuosità aumenterà)...... |
Polsy |
Off-Topic:
ma stralooool!
ho iniziato a scrivere un po' di codice (giusto le funzioni x gestire gli automi) e l'ho mandato al mio ragazzo, lui l'ha compilato sul suo portatile e subito dopo il suo touchpad (ke non dava + segni di vita ormai da settimane) ha ripreso a funzionare!!!
oh, il mio programma non troverà la tortuosità ma resuscita i touchpad :D
|
superfabius |
Originally posted by p2p
si ho risolto co un
do{
...
}
while (p->next!=NULL);
mi devi una birra :D |
p2p |
Originally posted by superfabius
mi devi una birra :D
;) mitico |
p2p |
ragazzi, voi operate su una lista x vedere tra tutti gli automi che raggiungono... bla bla quelli con distanza minima da spostare? o altre strutture??
altra domanda: ma esiste percorso e tortuosita' fanno il discorso del prefisso o prendono il nome di un automa?? |
mattcobain |
Originally posted by p2p
...ma esiste percorso e tortuosita' fanno il discorso del prefisso o prendono il nome di un automa??
prendono il nome dell'automa, non è considerato come prefisso, anche perché nella descrizione delle 2 funzioni sembra abbastanza chiaro si riferiscano all'automa di nome N passato alla funzione (che se non esiste viene stampato NO oppure -1 a seconda della funzione) |
Skilotto83 |
Originally posted by LjL
Se il compilatore/OS alloca [molto] più heap (non stack ;-) di quanto ne hai chiesto, fondamentalmente è colpa sua. Non ritengo che sia una cosa di cui si debba preoccupare molto il programmatore.
Il fatto che ti dia roba "sparsa in giro" non vedo perché dovrebbe essere un problema.
Il fatto che ci mette del tempo ad eseguire l'operazione è vero, ma considera che ci vuole del tempo anche per eseguire la realloc() -- e si tratta di *parecchio* tempo, nel caso in cui il sistema sia costretto a copiare tutto il tuo blocco di memoria da un'altra parte.
A volte usare array che possono crescere di dimensione (realloc()) non è una cattiva idea, quindi se tu ritieni che nel tuo caso sia una buona idea, fallo - può darsi che tu abbia ragione. Io ci penserei su un paio di volte però.
il metodo dell'array che uso ha dei vantaggi enormi su tutte le altre strutture:
con un array si accede direttamente ad una posizione, proprio perchè nn sono sparse in memoria...
Quando calcolo se esiste un percorso se mi scontro su un ostacolo so quale ostacolo è, lo indicizzo, e poi ripeto la ricorsione solo su quello e non su tutti gli ostacoli della lista...
lo stesso vale per automa, ho trovato forse il modo di ordinare i nomi degli automi nell'array...quando mi viene chiesto il prefisso degli automi da considerare io accedo direttamente allla posizione corrsipondente al "path" dato..e da li' vado avanti...
Con una lista in tuti i casi devo scorrere dall'inizio, anche se poi il discorso una volta trovato il "path" è lo stesso che con array...
e se devo inserire un automa o un ostacolo devo controllare che la posizione/i nn siano occupate da automi o ostacoli...qui allora devo scorrere tutto l'array..ma scorrere tutto un array o tutta una lista, o tutto un albero è lo stesso..no?? |
Skilotto83 |
Originally posted by p2p
ragazzi, voi operate su una lista x vedere tra tutti gli automi che raggiungono... bla bla quelli con distanza minima da spostare? o altre strutture??
altra domanda: ma esiste percorso e tortuosita' fanno il discorso del prefisso o prendono il nome di un automa??
io uso un array, cosi' come ho fatto per ostacoli e automi, quindi se hai usato una lista usa ancora una lista....
Tortuosita' e esiste percorso operano solo sul nome dell'automa...
Infatti in teoria sono i piu' semplici...
E' il comando segnale che è complesso, perchè su ogni automa che è compreso nel prefisso sceglie quello a distanza minima, poi chiami il calcolo di percorso libero, e poi su quelli chiedi di restituire quello con tortuosita' minima..in pratika devi memorizzare i passaggi in due liste...no?? |
Motomax |
Ciao please potete aiutarmi che sto diventando pazzo!!!!
ma avete trovato una soluzione per il Percorso e la tortuosità?:? :? :? |
wingzero |
Originally posted by Skilotto83
il metodo dell'array che uso ha dei vantaggi enormi su tutte le altre strutture:
con un array si accede direttamente ad una posizione, proprio perchè nn sono sparse in memoria...
Quando calcolo se esiste un percorso se mi scontro su un ostacolo so quale ostacolo è, lo indicizzo, e poi ripeto la ricorsione solo su quello e non su tutti gli ostacoli della lista...
lo stesso vale per automa, ho trovato forse il modo di ordinare i nomi degli automi nell'array...quando mi viene chiesto il prefisso degli automi da considerare io accedo direttamente allla posizione corrsipondente al "path" dato..e da li' vado avanti...
Con una lista in tuti i casi devo scorrere dall'inizio, anche se poi il discorso una volta trovato il "path" è lo stesso che con array...
e se devo inserire un automa o un ostacolo devo controllare che la posizione/i nn siano occupate da automi o ostacoli...qui allora devo scorrere tutto l'array..ma scorrere tutto un array o tutta una lista, o tutto un albero è lo stesso..no??
Ma parli di un array di char? Perchè è nulla più di una stringa in pratica in C. Per avere una mappatura corretta con array devi averli multdimensionali. Oppure usare strutture con struct ed a quel punto si usano le liste di norma.
Il grosso problema con l'uso di array, multidimensionali poi (quindi matrici che il professore non vuole che si usino poichè si lavora con una mappa di dimensioni infinite), è che non c'è un modo tanto banale di crearne una rappresentazione compatta. In effetti non c'è neanche con le liste di adiacenza che per una mappa senza limiti (a parte gli interi a 32bit) ed oggetti sparsi ovunque nella mappa rappresenta un grosso problema. |
wingzero |
Originally posted by Motomax
Ciao please potete aiutarmi che sto diventando pazzo!!!!
ma avete trovato una soluzione per il Percorso e la tortuosità?:? :? :?
Personalmente no. Ed inizio a rinunciare al fatto di poter consegnare il programma funzionante. Ho dei bei problemi a gestire le liste evitando memory leak di suo, ma poi ad usarle concatenate ancora peggio. E comunque non ho idea di come impostare il calcolo della tortuosità nelle combinazioni di liste di adiacenza, che viste le dimensioni infinite possono diventare onerose da gestire e tendere a crash del programma se il codice non è ben debuggato. E non ho il tempo materiale per debuggarlo.
Spero almeno di poter riusare buona parte delle funzioni che sto creando per il prossimo progetto, sperando sia qualcosa di più semplice. |
superfabius |
int main (void) ?! |
LjL |
Originally posted by superfabius
int main (void) ?!
int main(void) {
return EXIT_FAILURE;
} |
Skilotto83 |
Originally posted by wingzero
Ma parli di un array di char? Perchè è nulla più di una stringa in pratica in C. Per avere una mappatura corretta con array devi averli multdimensionali. Oppure usare strutture con struct ed a quel punto si usano le liste di norma.
Il grosso problema con l'uso di array, multidimensionali poi (quindi matrici che il professore non vuole che si usino poichè si lavora con una mappa di dimensioni infinite), è che non c'è un modo tanto banale di crearne una rappresentazione compatta. In effetti non c'è neanche con le liste di adiacenza che per una mappa senza limiti (a parte gli interi a 32bit) ed oggetti sparsi ovunque nella mappa rappresenta un grosso problema.
uso un array in cui metto le strutture....
non è vero che si usano le liste di norma...questo è quello che ti ha fatto credere nel suo corso..
ripeto..con le liste allocate dinamicamente le singole celle della lista sono sparse in memoria e non vi si puo' accedere direttamente senza ripetere tutta la ricerca..io invece accedo direttamente a ogni singolo automa o ostacolo che mi serve per il calcolo della tortuosita'...e ti garantisko ke il mio tempo di esecuzione su un metodo come "segnale" (dove senza array ripassi la stessa lista di ostacoli per migliaia di volte) è ottimo... |
Skilotto83 |
Originally posted by wingzero
Personalmente no. Ed inizio a rinunciare al fatto di poter consegnare il programma funzionante. Ho dei bei problemi a gestire le liste evitando memory leak di suo, ma poi ad usarle concatenate ancora peggio. E comunque non ho idea di come impostare il calcolo della tortuosità nelle combinazioni di liste di adiacenza, che viste le dimensioni infinite possono diventare onerose da gestire e tendere a crash del programma se il codice non è ben debuggato. E non ho il tempo materiale per debuggarlo.
Spero almeno di poter riusare buona parte delle funzioni che sto creando per il prossimo progetto, sperando sia qualcosa di più semplice.
se usi gli array come me risolvi il problema... |
wingzero |
Originally posted by Skilotto83
se usi gli array come me risolvi il problema...
Non vedo come il tuo metodo di risoluzione possa essere valido. Secondo me tralasci una parte del problema. |
wingzero |
Originally posted by Skilotto83
uso un array in cui metto le strutture....
non è vero che si usano le liste di norma...questo è quello che ti ha fatto credere nel suo corso..
ripeto..con le liste allocate dinamicamente le singole celle della lista sono sparse in memoria e non vi si puo' accedere direttamente senza ripetere tutta la ricerca..io invece accedo direttamente a ogni singolo automa o ostacolo che mi serve per il calcolo della tortuosita'...e ti garantisko ke il mio tempo di esecuzione su un metodo come "segnale" (dove senza array ripassi la stessa lista di ostacoli per migliaia di volte) è ottimo...
Non mi è molto chiaro.. un array in cui metti le strutture.. ma parli di array monodimensionale ? E come puoi tenere traccia della mappa bidimensionale a dimensioni infinite con array monodimensionali ? Gli array sono strutture dati di loro. Usi puntatori a puntatori per creare una catena analoga alle liste?
Scusa ma qui non è che dipenda da come il professore abbia impostato il corso, basta leggersi qualsiasi libro sugli algoritmi come Dijkstra per vedere che si usano le liste di adiacenza. Oppure matrici di adiacenza. Ma comunque sono array multidimensionali da gestire e non è che bastino quelli, nè in ogni caso basta una singola struttura per risolvere il problema.
Anche se si sa a priori che tutti i percorsi hanno la stessa distanza minima il problema delle combinazioni da scoprire per trovare la migliore resta riguardo la tortuosità ed è molto più difficile da impostare che non il problema del percorso minimo.
Poi non è vero che non accedi direttamente usando le liste. Le liste di adiacenza servono per calcolare le combinazioni in un digrafo/rete. Sono difficili da usare e creano molti problemi su un mondo a dimensione infinita. Problemi che in 15gg totali non sono risolvibili.
|
LjL |
Originally posted by Skilotto83
il metodo dell'array che uso ha dei vantaggi enormi su tutte le altre strutture:
Il fatto è che non credo di aver veramente capito dove, come e quando usi array invece di liste. Vediamo un attimo...
con un array si accede direttamente ad una posizione, proprio perchè nn sono sparse in memoria...
Questo dipende. Si accede "direttamente" (cioè in tempo O(1)) se gli indici dell'array *sono la tua chiave di ricerca*. Se non lo sono, ti tocca o scandirti tutto l'array (esattamente come se fosse una lista) o, solo se gli elementi sono ordinati per chiave, fare qualcosa come una ricerca binaria.
Quindi, tu come indicizzi gli array? Nel caso degli automi,
- Se hai un array di automi in cui ogni indice corrisponde all'ascissa (o all'ordinata) dell'automa, sprechi un sacco di spazio.
- Se hai un array ordinato per ascissa (o per ordinata), puoi fare una ricerca binaria, ma una volta trovata l'ascissa che ti serve vedi comunque trovare l'ordinata. Cosa fai a questo punto, usi un array di array?
- Se hai un array ordinato per nome dell'automa, puoi fare una ricerca binaria per individuare gli automi col prefisso che ti interessa. Vero. Ma per far questo direi che il metodo dell'albero è migliore, anche perché tu così ogni volta che aggiungi un automa devi spostare tutti i successivi elementi dell'array (questo vale anche per il caso precedente!)
Quando calcolo se esiste un percorso se mi scontro su un ostacolo so quale ostacolo è, lo indicizzo, e poi ripeto la ricorsione solo su quello e non su tutti gli ostacoli della lista...
Ecco, qui non capisco. Stai dicendo che, oltre all'array di automi, hai anche un array di ostacoli, giusto?
Di nuovo, come sono ordinati gli ostacoli? Qui è anche un filino più complicato perché gli ostacoli hanno *due* coppie di coordinate.
Perché dici "se mi scontro su un ostacolo so quale ostacolo è"? Per *sapere* subito, a colpo sicuro, in tempo O(1), se c'è un ostacolo in un certo punto del piano, dovresti rappresentare il piano come matrice, cosa chiaramente non fattibile. Facendo in un altro modo (salvo cose strane tipo hash) non vedo modo di sapere "a colpo sicuro" se in un certo punto c'è un ostacolo.
O forse intendi dire che, quando ti scontri con un ostacolo (e comunque in che modo controlli se ti sei scontrato?) vai a vedere che punti del piano copre quell'ostacolo, e te li "segni da qualche parte"? È questo che intendi quando dici "lo indicizzo"?
Poi, cosa vuol dire che ripeti la ricorsione solo su quello? Dovrai pur considerare anche gli *altri* ostacoli inscritti nella zona di piano che ti interessa, no? (certo, dipende da cosa fa la tua ricorsione)
lo stesso vale per automa, ho trovato forse il modo di ordinare i nomi degli automi nell'array...
Ah, questo prima mi era sfuggito, e quindi la prima parte della mia risposta è inutile, ma l'ho lasciata giusto perché mi spiaceva cancellarla...
Rimane il fatto che mi pare che, per ogni nuovo automa, tu debba spostare tutti gli elementi dell'array successivi alla posizione che dovrà essere occupata dal nuovo automa.
quando mi viene chiesto il prefisso degli automi da considerare io accedo direttamente allla posizione corrsipondente al "path" dato..e da li' vado avanti...
Come fai ad accedere *direttamente* a quella posizione senza fare almeno una ricerchina binaria? Non vedo modo per cui tu, per *ogni* possibile prefisso, possa sapere qual è la posizione nell'array dove gli automi cominciano ad avere quel prefisso.
Con una lista in tuti i casi devo scorrere dall'inizio, anche se poi il discorso una volta trovato il "path" è lo stesso che con array...
Si, con una lista devi sempre scorrere dall'inizio. Con un albero no però...
e se devo inserire un automa o un ostacolo devo controllare che la posizione/i nn siano occupate da automi o ostacoli...qui allora devo scorrere tutto l'array..ma scorrere tutto un array o tutta una lista, o tutto un albero è lo stesso..no??
Sì, direi di sì. Credo che a questo sia molto, molto difficile scampare, a meno di non usare strutture piuttosto complesse che permettano una ricerca veloce di automi e ostacoli usando come chiavi le coordinate: ad esempio si potrebbe usare un hash di hash, ma anche volendo spararsi una roba del genere, come si farebbe a sapere se il punto (x,y) appartiene ad un ostacolo? Cerchi x nel primo hash, cerchi y nell'hash di x... e non trovi niente, perché l'ostacolo aveva coordinate (x-a, y-b), (x+c, y+d).
Comunque riguardando il tuo messaggio iniziale rimango piuttosto perplesso: lì dicevi che tu
- crei un array di dimensione fissa contenente, per ogni elemento, i dati di un automa. E ok.
- assegni valori di testa e coda all'array e lo gestisci come una lista. Questa mi sfugge proprio: posso ancora capire il valore di "coda" (più comunemente noto come "numero di elementi nell'array)... ma il valore di "testa"? O sono puntatori? E se sono puntatori, a che ti servono?
Dicevi che, in pratica, usi delle liste, ma non sono "liste dinamiche" nel senso comune del termine, ma "array trattati come liste". E qui non capisco cosa tu intenda con "trattare un array come una lista".
Ogni elemento dentro l'array per caso ha un puntatore all'elemento seguente? Se sì, allora forse ho capito cosa fai -- semplicemente usi delle liste dinamiche ma ti sei in pratica scritto il tuo allocatore di memoria personale invece di usare malloc(). Ma se è così, tu stai effettivamente usando delle liste e non degli array, con tutti i vantaggi e gli svantaggi che ne derivano -- compreso il *non* poter accedere "direttamente" agli elementi. |
ZeroByte |
Qualcuno di voi ha un'idea diversa da alberi o liste di adiacenza per implementare esistePercorso? A me sembrano le due uniche strutture accettabili per una cosa simile. Ma soprattutto, c'è qualcuno che è in grado di consegnare in tempo questo progetto? E' solo una mia impressione ma il tempo concesso è davvero poco? |
LjL |
Originally posted by wingzero
[snip]
Scusa ma qui non è che dipenda da come il professore abbia impostato il corso, basta leggersi qualsiasi libro sugli algoritmi come Dijkstra per vedere che si usano le liste di adiacenza. Oppure matrici di adiacenza.
No, aspetta, a me non sembra così ovvio che *debbano* essere usate liste o matrici di adiacenza.
Infatti, in un grafo generico, si hanno nodi (che non sono [necessariamente] identificati da coordinate [cartesiane]) che possono essere adiacenti (cioè collegati da lati) ad un numero arbitrario di altri nodi.
Nel nostro caso, invece, abbiamo nodi identificati da coordinate cartesiane, che possono essere adiacenti ad al massimo altri quattro nodi. E aggiungendoci pure il fatto che ogni automa si può muovere solo *verso* il richiamo, potresti persino dire che ogni nodo è adiacente ad altri *due* nodi, e che il grafo è orientato.
Con questo non voglio dire che il nostro piano *non* va trattato come un grafo (con relative liste o matrici di adiacenza), solo che è un caso molto più specifico rispetto al caso "grafo generico", e che quindi è probabile che anche le strutture dati possano permettersi di essere più specifiche.
Prendi ad esempio il caso in cui abbiamo un automa in (0,0) e la sorgente in (9,9). Ci vien fuori un grafo con 10*10=100 nodi e 9*10+9*10=180 lati.
Ma se supponiamo che non ci siano ostacoli, per i nostri scopi (calcolo della tortuosità) questo grafo è perfettamente equivalente al semplice grafo con 4 vertici e 4 lati:
o----o
| |
o----X
Infatti di tutti gli altri lati e vertici non ci importa niente, dato che passarci causerebbe solo un aumento della tortuosità.
Certo, in questo caso è semplice, mentre con gli ostacoli di mezzo non riuscirei più a ridurre il grafo così semplicemente. Ma secondo me il punto sta proprio qui: bisognerebbe trovare un algoritmo capace di semplificare i nostri grafi *tenendo conto degli ostacoli*, o meglio ancora fare in modo che, ogni volta che viene creato un automa/ostacolo, questo sia *già* inserito in un grafo semplificato.
Come riuscirci non l'ho ancora capito, ma l'idea di base sarebbe: ogni volta che nel grafo non-semplificato c'è una sequenza di passi (lati) aventi tutti lo stesso orientamento (orizzontale vs verticale), tale sequenza può essere "condensata" (semplificata) in un unico lato con due vertici.
A questo punto, chiaramente, non esisterebbe più la garanzia che da ogni vertice partano al massimo quattro lati.
Ma proprio il fatto che cada questa garanzia potrebbe secondo me permetterci di usare un algoritmo "prefabbricato" a nostra scelta su un "normale" grafo molto più piccolo di quello iniziale. |
wingzero |
Originally posted by ZeroByte
Qualcuno di voi ha un'idea diversa da alberi o liste di adiacenza per implementare esistePercorso? A me sembrano le due uniche strutture accettabili per una cosa simile. Ma soprattutto, c'è qualcuno che è in grado di consegnare in tempo questo progetto? E' solo una mia impressione ma il tempo concesso è davvero poco?
Per quanto mi riguarda posso dire solo che se avessi avuto almeno il doppio del tempo, un 30gg, probabilmente sarei riuscito a finirlo e consegnarlo, ma in queste condizioni al momento quasi sicuramente non ci riuscirò. Spero solo che il prossimo appello presenti un problema più semplice che non mi metta così tanto in difficoltà o non arriverò mai all'orale.. |
wingzero |
Originally posted by LjL
No, aspetta, a me non sembra così ovvio che *debbano* essere usate liste o matrici di adiacenza.
Infatti, in un grafo generico, si hanno nodi (che non sono [necessariamente] identificati da coordinate [cartesiane]) che possono essere adiacenti (cioè collegati da lati) ad un numero arbitrario di altri nodi.
Nel nostro caso, invece, abbiamo nodi identificati da coordinate cartesiane, che possono essere adiacenti ad al massimo altri quattro nodi. E aggiungendoci pure il fatto che ogni automa si può muovere solo *verso* il richiamo, potresti persino dire che ogni nodo è adiacente ad altri *due* nodi, e che il grafo è orientato.
Con questo non voglio dire che il nostro piano *non* va trattato come un grafo (con relative liste o matrici di adiacenza), solo che è un caso molto più specifico rispetto al caso "grafo generico", e che quindi è probabile che anche le strutture dati possano permettersi di essere più specifiche.
Prendi ad esempio il caso in cui abbiamo un automa in (0,0) e la sorgente in (9,9). Ci vien fuori un grafo con 10*10=100 nodi e 9*10+9*10=180 lati.
Ma se supponiamo che non ci siano ostacoli, per i nostri scopi (calcolo della tortuosità) questo grafo è perfettamente equivalente al semplice grafo con 4 vertici e 4 lati:
o----o
| |
o----X
Infatti di tutti gli altri lati e vertici non ci importa niente, dato che passarci causerebbe solo un aumento della tortuosità.
Certo, in questo caso è semplice, mentre con gli ostacoli di mezzo non riuscirei più a ridurre il grafo così semplicemente. Ma secondo me il punto sta proprio qui: bisognerebbe trovare un algoritmo capace di semplificare i nostri grafi *tenendo conto degli ostacoli*, o meglio ancora fare in modo che, ogni volta che viene creato un automa/ostacolo, questo sia *già* inserito in un grafo semplificato.
Come riuscirci non l'ho ancora capito, ma l'idea di base sarebbe: ogni volta che nel grafo non-semplificato c'è una sequenza di passi (lati) aventi tutti lo stesso orientamento (orizzontale vs verticale), tale sequenza può essere "condensata" (semplificata) in un unico lato con due vertici.
A questo punto, chiaramente, non esisterebbe più la garanzia che da ogni vertice partano al massimo quattro lati.
Ma proprio il fatto che cada questa garanzia potrebbe secondo me permetterci di usare un algoritmo "prefabbricato" a nostra scelta su un "normale" grafo molto più piccolo di quello iniziale.
Sì, bhè, è un grafo orientato (digrafo = digraph dall'inglese = directed graph = grafo orientato), che è un modo per disegnare una rete con archi orientati.
Il grosso problema sta nell'impostare la tortuosità che non so come usarla per calcolare la minore. Ed ho problemi a programmare senza memory leak delle liste di adiacenza.. non riuscirò mai a farle funzionare in tempo per la consegna.. e se anche ci riuscissi poi non saprei come usarle per risolvere il tutto al momento. Quindi ritengo di non essere in grado di consegnare, purtroppo per me. |
wingzero |
Originally posted by LjL
No, aspetta, a me non sembra così ovvio che *debbano* essere usate liste o matrici di adiacenza.
Infatti, in un grafo generico, si hanno nodi (che non sono [necessariamente] identificati da coordinate [cartesiane]) che possono essere adiacenti (cioè collegati da lati) ad un numero arbitrario di altri nodi.
Nel nostro caso, invece, abbiamo nodi identificati da coordinate cartesiane, che possono essere adiacenti ad al massimo altri quattro nodi. E aggiungendoci pure il fatto che ogni automa si può muovere solo *verso* il richiamo, potresti persino dire che ogni nodo è adiacente ad altri *due* nodi, e che il grafo è orientato.
Puoi dirlo in caso di mappa priva da ostacoli magari, ma con gli ostacoli il discorso cambia perchè dei percorsi liberi bisognerà far scegliere all'automa quello con minore tortuosità.
Ciò non toglie che è comunque un grafo orientato. |
Skilotto83 |
Originally posted by LjL
Il fatto è che non credo di aver veramente capito dove, come e quando usi array invece di liste. Vediamo un attimo...
Questo dipende. Si accede "direttamente" (cioè in tempo O(1)) se gli indici dell'array *sono la tua chiave di ricerca*. Se non lo sono, ti tocca o scandirti tutto l'array (esattamente come se fosse una lista) o, solo se gli elementi sono ordinati per chiave, fare qualcosa come una ricerca binaria.
Quindi, tu come indicizzi gli array? Nel caso degli automi,
- Se hai un array di automi in cui ogni indice corrisponde all'ascissa (o all'ordinata) dell'automa, sprechi un sacco di spazio.
- Se hai un array ordinato per ascissa (o per ordinata), puoi fare una ricerca binaria, ma una volta trovata l'ascissa che ti serve vedi comunque trovare l'ordinata. Cosa fai a questo punto, usi un array di array?
- Se hai un array ordinato per nome dell'automa, puoi fare una ricerca binaria per individuare gli automi col prefisso che ti interessa. Vero. Ma per far questo direi che il metodo dell'albero è migliore, anche perché tu così ogni volta che aggiungi un automa devi spostare tutti i successivi elementi dell'array (questo vale anche per il caso precedente!)
qui ti sei gia' risposto piu' aventi...ho trovato il modo di ordinarli...ma in effetti kmq devo partire dall'inizio...anche se alemno cosi' so' quando finire...il ke mi sembra pari all'uso di un alebro come soluzione...se ho tempo implemento una ricerca dicotomica cosi' da migliorare il tutto...anche se nn di molto...
Ecco, qui non capisco. Stai dicendo che, oltre all'array di automi, hai anche un array di ostacoli, giusto?
Di nuovo, come sono ordinati gli ostacoli? Qui è anche un filino più complicato perché gli ostacoli hanno *due* coppie di coordinate.
Perché dici "se mi scontro su un ostacolo so quale ostacolo è"? Per *sapere* subito, a colpo sicuro, in tempo O(1), se c'è un ostacolo in un certo punto del piano, dovresti rappresentare il piano come matrice, cosa chiaramente non fattibile. Facendo in un altro modo (salvo cose strane tipo hash) non vedo modo di sapere "a colpo sicuro" se in un certo punto c'è un ostacolo.
O forse intendi dire che, quando ti scontri con un ostacolo (e comunque in che modo controlli se ti sei scontrato?) vai a vedere che punti del piano copre quell'ostacolo, e te li "segni da qualche parte"? È questo che intendi quando dici "lo indicizzo"?
Poi, cosa vuol dire che ripeti la ricorsione solo su quello? Dovrai pur considerare anche gli *altri* ostacoli inscritti nella zona di piano che ti interessa, no? (certo, dipende da cosa fa la tua ricorsione)
questo nn lo puoi capire senza vedere il mio metodo di ricerca del percorso...
Kmq l'idea che ho avuto, ancora da sistemare è di dare un indice a ogni ostacolo nel piano, quando cerco il percorso(che nn faccio di una cella alla volta ma di segmenti di lunghezza n)arrivando a sbattare su un ostacolo so qual'è(perkè ha un indice)quindi memorizzo l'indice, lo cerco nel mio bell'array direttamente e poi in base a quello ne "capisco" la struttura cosi'0 da poterlo evitare...il tutto è complicato, ma svolgo una specie di indietreggiamento...
Spero di essere stato chiaro, altrimenti mi spingo troppo oltre...
Ah, questo prima mi era sfuggito, e quindi la prima parte della mia risposta è inutile, ma l'ho lasciata giusto perché mi spiaceva cancellarla...
Rimane il fatto che mi pare che, per ogni nuovo automa, tu debba spostare tutti gli elementi dell'array successivi alla posizione che dovrà essere occupata dal nuovo automa.
questo kmq lo fai anche con un albero...in tutti i casi per inserire devi scorrere e scegliere la posizione...
Come fai ad accedere *direttamente* a quella posizione senza fare almeno una ricerchina binaria? Non vedo modo per cui tu, per *ogni* possibile prefisso, possa sapere qual è la posizione nell'array dove gli automi cominciano ad avere quel prefisso.
in effetti oggi ho implementato la cosa e nn posso..ma nn rinuncio alla mia idea in quanto voglio usare la stessa struttura per ostacoli e automi...quindi posso migliorare la cosa con ricerca dicotomica che parte da meta'...ma le cose migliorano su numeri alti...tipo 10000 automi...altrimenti è pratikamente lo stesso..ma è per mostrare al prof che so' il problema e cerco di migliorarlo..
Si, con una lista devi sempre scorrere dall'inizio. Con un albero no però...
e invece si'...come fai a inserire un nodo senza aver prima guardato dove metterlo??
Sì, direi di sì. Credo che a questo sia molto, molto difficile scampare, a meno di non usare strutture piuttosto complesse che permettano una ricerca veloce di automi e ostacoli usando come chiavi le coordinate: ad esempio si potrebbe usare un hash di hash, ma anche volendo spararsi una roba del genere, come si farebbe a sapere se il punto (x,y) appartiene ad un ostacolo? Cerchi x nel primo hash, cerchi y nell'hash di x... e non trovi niente, perché l'ostacolo aveva coordinate (x-a, y-b), (x+c, y+d).
Comunque riguardando il tuo messaggio iniziale rimango piuttosto perplesso: lì dicevi che tu
- crei un array di dimensione fissa contenente, per ogni elemento, i dati di un automa. E ok.
- assegni valori di testa e coda all'array e lo gestisci come una lista. Questa mi sfugge proprio: posso ancora capire il valore di "coda" (più comunemente noto come "numero di elementi nell'array)... ma il valore di "testa"? O sono puntatori? E se sono puntatori, a che ti servono?
la testa che intendo è forse quella che tu chiami coda...
kmq semplicemente dopo aver inserito l'automa aumento la posizione dell'array e assegno alla posizione +1 il valore "testa"...mi serve ogni volta che inserisco...se la testa supera il max dim array allora vado in outlist e faccio la realloc...
Dicevi che, in pratica, usi delle liste, ma non sono "liste dinamiche" nel senso comune del termine, ma "array trattati come liste". E qui non capisco cosa tu intenda con "trattare un array come una lista".
Ogni elemento dentro l'array per caso ha un puntatore all'elemento seguente? Se sì, allora forse ho capito cosa fai -- semplicemente usi delle liste dinamiche ma ti sei in pratica scritto il tuo allocatore di memoria personale invece di usare malloc(). Ma se è così, tu stai effettivamente usando delle liste e non degli array, con tutti i vantaggi e gli svantaggi che ne derivano -- compreso il *non* poter accedere "direttamente" agli elementi.
|
wingzero |
Originally posted by Skilotto83
qui ti sei gia' risposto piu' aventi...ho trovato il modo di ordinarli...ma in effetti kmq devo partire dall'inizio...anche se alemno cosi' so' quando finire...il ke mi sembra pari all'uso di un alebro come soluzione...se ho tempo implemento una ricerca dicotomica cosi' da migliorare il tutto...anche se nn di molto...
Lo puoi anche dividere in centinaia di segmenti un array utilizzando dei puntatori, non otterrai lo stesso effetto. Se gli array fossero stati sufficienti come pensi tu nessuno avrebbe sviluppato gli ADT (Abstract Data Type) per risolvere i problemi. Gli array in pratica esistono nell'hardware e sono un'astrazione fittizia.
questo nn lo puoi capire senza vedere il mio metodo di ricerca del percorso...
Kmq l'idea che ho avuto, ancora da sistemare è di dare un indice a ogni ostacolo nel piano, quando cerco il percorso(che nn faccio di una cella alla volta ma di segmenti di lunghezza n)arrivando a sbattare su un ostacolo so qual'è(perkè ha un indice)quindi memorizzo l'indice, lo cerco nel mio bell'array direttamente e poi in base a quello ne "capisco" la struttura cosi'0 da poterlo evitare...il tutto è complicato, ma svolgo una specie di indietreggiamento...
Spero di essere stato chiaro, altrimenti mi spingo troppo oltre...
In base all'indice , cioè la posizione in un array monodimensionale, come puoi "capire la struttura" di un ostacolo che è un oggetto rettangolare che può avere dimensione infinita ed occupare migliaia di celle ? (oltre al fatto che possono esserci più ostacoli sovrapposti sulle stesse coordinate i cui bordi di alcuni possono liberamente estendersi oltre parte dei bordi di quelli "sottostanti", pensando la sovrapposizione a strati).
Con un array monodimensionale è impossibile tenere traccia di oggetti su un piano bidimensionale. Il minimo possibile è usare una matrice che rappresenti la griglia, quindi un array bidimensionale. Ma non è efficiente ed il professore dice di non usarla.
in effetti oggi ho implementato la cosa e nn posso..ma nn rinuncio alla mia idea in quanto voglio usare la stessa struttura per ostacoli e automi...quindi posso migliorare la cosa con ricerca dicotomica che parte da meta'...ma le cose migliorano su numeri alti...tipo 10000 automi...altrimenti è pratikamente lo stesso..ma è per mostrare al prof che so' il problema e cerco di migliorarlo..
Scusa, ma usare un puntatore per suddividere la scansione di un array non è che crea un algoritmo magico che al livello asintotico ha un limite in pratica negativo... Anche perchè che io sappia non esiste modo di aumentare la velocità di un algoritmo all'aumentare del numero di dati da elaborare... Tanto è che poi quanto più un array è grande tanto più aumentano i tempi di accesso. Al massimo possono restare costanti , più o meno, in architetture hardware reali...
e invece si'...come fai a inserire un nodo senza aver prima guardato dove metterlo??
Non è così dispendiosa la cosa come puoi pensare quando si usano le reti con liste di adiacenza. Altrimenti non la userebbe nessuno.
la testa che intendo è forse quella che tu chiami coda...
kmq semplicemente dopo aver inserito l'automa aumento la posizione dell'array e assegno alla posizione +1 il valore "testa"...mi serve ogni volta che inserisco...se la testa supera il max dim array allora vado in outlist e faccio la realloc...
? Ok. Ho capito che riallochi la memoria per aumentare le dimensioni dell'array, tuttavia questo non vedo come possa risolvere tutto il problema. Tu continui a parlare di array monodimensionali in cui dici di inserire le strutture... Ciò che dici non può funzionare. E' impossibile usare array monodimensionali per tener traccia di coordinate ed oggetti in uno spazio bidimensionale. Ed usare una matrice, array bidimensionale, è vietato dal progetto perchè dispendioso in termini di tempo e risorse per un mondo a dimensioni infinite.
E se è per questo aumentare le dimensioni dell'array per le stringhe di input degli utenti è necessario se non si vuole usare una lista, visto che anche le stringhe non devono avere alcun limite. |
LjL |
Originally posted by Skilotto83
qui ti sei gia' risposto piu' aventi...
Sì, lo so... pardon.
ho trovato il modo di ordinarli...ma in effetti kmq devo partire dall'inizio...anche se alemno cosi' so' quando finire...il ke mi sembra pari all'uso di un alebro come soluzione...
Uhm, mica tanto. Se usi un albero, il tempo necessario per la ricerca è una funzione della lunghezza del prefisso e del numero di automi *che rispondono a quel prefisso*. Se usi una lista (o array, in questo caso è uguale) in cui cerchi partendo dall'inizio, il tempo diventa una funzione della lunghezza del prefisso e del numero *totale* di automi.
[Sì, rimane comunque funzione *anche* della lunghezza del prefisso anche se usi cose come una strcmp()]
se ho tempo implemento una ricerca dicotomica cosi' da migliorare il tutto...anche se nn di molto...
Secondo me invece migliora di molto, anche se (come quasi in tutto...) solo asintoticamente, quindi non per numeri bassi.
Ma tra l'altro c'è un altro problema: se rappresenti i nomi degli automi come stringhe o comunque come oggetti creati da una malloc(), come fai a soddisfare la richiesta per cui la lunghezza delle stringhe non dev'essere limitata? L'unico modo che vedo è usare un'*altra* realloc (e poi magari un'altra e un'altra ancora...) se ce n'è bisogno -- cioè man mano che vedi che la stringa in input supera la lunghezza fissata dalla malloc().
questo nn lo puoi capire senza vedere il mio metodo di ricerca del percorso...
Sì, anche questo è vero.
Kmq l'idea che ho avuto, ancora da sistemare è di dare un indice a ogni ostacolo nel piano, quando cerco il percorso(che nn faccio di una cella alla volta ma di segmenti di lunghezza n)arrivando a sbattare su un ostacolo so qual'è(perkè ha un indice)quindi memorizzo l'indice, lo cerco nel mio bell'array direttamente e poi in base a quello ne "capisco" la struttura cosi'0 da poterlo evitare...
Qui sono d'accordo con quello che ha detto wingzero nell'ultimo messaggio: come diavolo fai a dare agli ostacoli un indice che permetta immediatamente di capire se stai sbattendoci contro?
Se come indice usi l'ascissa dell'ostacolo (che tra l'altro di ascissa non ne ha una sola), devi comunque smazzarti l'ordinata. Se usi l'ordinata, devi smazzarti l'ascissa.
Se combini in qualche modo ascissa e ordinata è come se stessi usando una matrice bidimensionale, a meno di usare un hash (cosa che tra l'altro potrebbe non essere una pessima idea, se non fosse che gli ostacoli non sono punti ma rettangoli... comunque può essere una soluzione).
il tutto è complicato, ma svolgo una specie di indietreggiamento...
Spero di essere stato chiaro, altrimenti mi spingo troppo oltre...
Sì, credo di aver capito il concetto... vai dritto, quando sbatti contro un ostacolo giri; se così facendo poi riesci a seguire un percorso decente, bene, altrimenti riprovi girando un po' prima di raggiungere l'ostacolo.
Sta attento però... detto così è abbastanza generico, ma io di idee del genere ne ho provate più di una, e ho sempre trovato inghippi, a volte solo dopo averci ragionato un bel po'. Quindi ti posso solo consigliare di controllare bene che non ci siano inghippi.
questo kmq lo fai anche con un albero...in tutti i casi per inserire devi scorrere e scegliere la posizione...
Insomma... primo, un albero non lo devi scorrere *tutto* (non devi passare per tutti i nodi); se i nodi sono n, "spesso e volentieri" devi scorrerne soltanto log(n). Una lista invece la devi scorrere fino a quando non trovi la posizione che cercavi, e per farlo ci metti O(n).
Secondo, io intedevo dire un'altra cosa: con gli alberi e con le liste devi scorrere, ok, ma dopo che hai scorso puoi inserire con un'operazione di tempo O(1).
Con un array, invece, dopo che hai scorso devi "fare spazio" per il nuovo elemento, cioè spostare di uno tutti gli elementi successivi -- un'operazione di tempo O(n).
[snip]
e invece si'...come fai a inserire un nodo senza aver prima guardato dove metterlo??
Sì, hai ragione. Intendevo dire quello che ho scritto sopra. Qualcosa devi "scorrere" comunque, semplicemente è di meno (o, nel caso peggiore, lo stesso).
la testa che intendo è forse quella che tu chiami coda...
kmq semplicemente dopo aver inserito l'automa aumento la posizione dell'array e assegno alla posizione +1 il valore "testa"...mi serve ogni volta che inserisco...se la testa supera il max dim array allora vado in outlist e faccio la realloc...
Ah, ok... mi confondeva il fatto che tu parlassi *sia* di testa *sia* di coda.
Quello che dici tu è quello che io di solito chiamo il "count" di un array (semplicemente perché la relativa variabile la chiamo sempre Count).
Attento comunque: ti va bene solo finché gli elementi dell'array non li tieni ordinati, dato che ti basta aggiungere il nuovo elemento alla fine dell'array (e realloc()are se necessario).
Ma se decidi di metterli in ordine (ad esempio per fare una ricerca dicotomica) vien fuori il problema che dicevo, cioè che inserire un elemento in una posizione arbitraria dell'array comporta il dover spostare di uno tutti gli elementi successivi. |
LjL |
Originally posted by wingzero
Lo puoi anche dividere in centinaia di segmenti un array utilizzando dei puntatori, non otterrai lo stesso effetto. Se gli array fossero stati sufficienti come pensi tu nessuno avrebbe sviluppato gli ADT (Abstract Data Type) per risolvere i problemi. Gli array in pratica esistono nell'hardware e sono un'astrazione fittizia.
Guarda che una lista o un albero non sono in sé e per sé dei tipi di dati astratti.
Vedi: http://www.swif.uniba.it/lei/foldop...tract+data+type
A mio avviso poi una lista o un albero è un'astrazione tanto quanto lo è un array. Al massimo sono astrazioni più complicate.
Gli array non esistono in hardware, a meno che l'hardware non supporti il concetto di array :-) (evviva la tautologia!)
Per indicizzare un array devi prendere l'indirizzo dove inizia l'array, sommarci l'indice moltiplicato per la dimensione in parole indirizzabili del tipo di dato di ogni elemento, e indirizzare il risultato.
Non so se 'sta roba che ho detto sia astratta o meno, ma mi sembra che lo sia né più né meno di quanto lo sarebbe l'equivalente per le liste o per gli alberi.
[snip]
Con un array monodimensionale è impossibile tenere traccia di oggetti su un piano bidimensionale. Il minimo possibile è usare una matrice che rappresenti la griglia, quindi un array bidimensionale. Ma non è efficiente ed il professore dice di non usarla.
[snip]
Non è così dispendiosa la cosa come puoi pensare quando si usano le reti con liste di adiacenza. Altrimenti non la userebbe nessuno.
Qui tu stavi rispondendo a due cose diverse, quindi perdonami se mettendole insieme ti faccio dire cose che non intendevi dire...
Però, per rappresentare un piano (o meglio il pezzo di piano che ti interessa), se usi una matrice bidimensionale butti via memoria in maniera crescente come x*y (x ed y sono le dimensioni del pezzo di piano); se usi una lista di adiacenza, invece, butti via memoria in maniera crescente come... circa 3*x*y (vertici più lati; in realtà è un pochino meno)!
Asintoticamente è la stessa cosa, ma di sicuro l'array è più compatto.
Ciò non significa che le liste di adiacenza siano cose inutili; ma le liste di adiacenza servono per grafi i cui vertici possono avere *un numero variabile di lati ciascuno*! Se invece, come nel nostro caso, ogni vertice ha lo stesso numero di lati (2 o 4 a seconda di come ti gira), asintoticamente usare un array o usare liste di adiacenza è uguale (sempre parlando di occupazione di memoria), e in pratica la costante nascosta è più grande nel caso delle liste di adiacenza.
In quanto all'efficienza in tempo, quella delle liste di adiacenza non può che essere minore o uguale a quella dell'array (sempre e solo nel nostro caso, e supponendo di non semplificare mai il grafo in nessun modo!). |
LjL |
Originally posted by wingzero
Sì, bhè, è un grafo orientato (digrafo = digraph dall'inglese = directed graph = grafo orientato), che è un modo per disegnare una rete con archi orientati.
Perché te la prendi su 'sta cosa dell'orientamento? ;-)
Ho detto anch'io che è orientato, però il grafo alla fine è un'astrazione che *tu* usi per rappresentare i cammini dall'automa al richiamo bla bla bla, quindi *tu* puoi decidere se usare un grafo orientato o no. Poi sono d'accordo che, usando un grafo, nel nostro caso sia molto saggio usarne uno orientato.
Il grosso problema sta nell'impostare la tortuosità che non so come usarla per calcolare la minore.
Guarda gli archi del tuo grafo... prendi un arco qualsiasi, scegli tu se "orizzontale" (collega due vertici con la stessa y) o "verticale" (stessa y). Supponiamo che ne hai scelto uno verticale: qual è la tortuosità minima con cui puoi raggiungerlo?
Be', a quell'arco o ci arrivi dall'arco verticale precedente, o ci arrivi dall'arco orizzontale precedente, ma in quel caso la tortuosità aumenta.
Mi fermo qui; basti dire che l'algoritmo basato su quello che ho detto per trovare la tortuosità minima con cui puoi raggiungere un arco può facilmente *non essere ricorsivo*, e avere una complessità funzione della distanza in orizzontale e in verticale dell'automa dal richiamo -- che sarebbe a dire che ha una complessità schifosa, dato che ci mette *sempre* più tempo a calcolare la tortuosità per automi lontani dal richiami, anche se non ci sono ostacoli di mezzo. Ma direi che è sempre meglio di niente, e soprattutto è molto meglio dell'algoritmo ricorsivo più ovvio che mi viene in mente (che consiste in: 'sti percorsi provali tutti e vedi qual è il migliore).
[QUOTE]
Ed ho problemi a programmare senza memory leak delle liste di adiacenza...
"Save the whales and free() the malloc()s", come scriveva uno nella sua firma :-P
non riuscirò mai a farle funzionare in tempo per la consegna.. e se anche ci riuscissi poi non saprei come usarle per risolvere il tutto al momento. Quindi ritengo di non essere in grado di consegnare, purtroppo per me.
Auguri. Neanch'io sono molto sicuro di riuscire a consegnare qualcosa di decente, se la cosa ti consola.
Ma se fossi in te il programma lo scriverei comunque, anche nella versione più lenta e stupida che ti viene in mente... sempre meglio che non consegnare, o no? |
LjL |
Originally posted by wingzero
Puoi dirlo in caso di mappa priva da ostacoli magari, ma con gli ostacoli il discorso cambia perchè dei percorsi liberi bisognerà far scegliere all'automa quello con minore tortuosità.
Certo, ma comunque ci sarà sempre in tutti i casi (tranne nel caso peggiore) qualcosa nel grafo di semplificabile.
Il problema è che non so esattamente come eseguire 'sta semplificazione, ma è abbastanza evidente guardando un disegno qualsiasi (ad esempio quello del testo) che *deve* essere possibile una semplificazione.
Ciò non toglie che è comunque un grafo orientato.
Ok, ok, è un grafo orientato! ;-P |
wingzero |
Originally posted by LjL
Guarda che una lista o un albero non sono in sé e per sé dei tipi di dati astratti.
Vedi: http://www.swif.uniba.it/lei/foldop...tract+data+type
A mio avviso poi una lista o un albero è un'astrazione tanto quanto lo è un array. Al massimo sono astrazioni più complicate.
Gli array non esistono in hardware, a meno che l'hardware non supporti il concetto di array :-) (evviva la tautologia!)
Per indicizzare un array devi prendere l'indirizzo dove inizia l'array, sommarci l'indice moltiplicato per la dimensione in parole indirizzabili del tipo di dato di ogni elemento, e indirizzare il risultato.
Non so se 'sta roba che ho detto sia astratta o meno, ma mi sembra che lo sia né più né meno di quanto lo sarebbe l'equivalente per le liste o per gli alberi.
http://www2.latech.edu/~box/ds/chap4.ppt
http://en.wikibooks.org/wiki/Comput...uctures:Arrays
Arrays guarantee constant time read and write access, however many lookup operations (find min, find max, find index of an instance of an element) are O(n). Arrays are very efficient in most languages, as lookup and access operations compute the address of an element via a simple formula based on the base address element index.
Arrays typically map directly to contiguous storage locations within your computers memory and are therefore the "Natural" storage structure for most higher level languages.
Simple linear arrays are the basis for most of the other data structures. Many languages do not allow you to allocate any structure except an array, everything else must be implemented on top of the array. The exception is the linked list, that is typically implemented as individually allocated objects, but it is possible to implement a linked list within an array.
|
Skilotto83 |
se continuo cosi' butto ore per ripondere ai post...
Kmq mi sembra che wingzero sia abbastanza diffidente sulla mia soluzione mentre ljl ha capito il funzionamento e le motivazioni della mia idea di usare array....
kmq quando aggiungo un elemento devo effettivamente far scalare tutte le posizioni in basso di uno, a meno che l'automa debba essere gia' messo in cima alla lista...
Per la questione di come so la struttura dell'ostacolo....vi garantisko ke ho risolto...
se mi scontro su un ostacolo nell'asse x scorro la x finche nn ho piuu' l'ostacolo...lo stesso la y...
Nn vedo il problema...basta gestire la ovrapposizione degli ostacoli....
---------
| |
| | <---------------
---------
in un esempio simile io sbatto sulla parte y..mi basta scorrere y finchè nn è finita...e lo so per coordinate di vertici..analiticamente, in quanto nn ho inserito tutte le celle dell'ostacolo, ma solo i vertici...nn mi devo assolutamente preokkupare della profondita' di tale ostacolo...ragazzi, io ancora nn ho una versione precisissima, ma funziona...è solo questione di capire cosa si ha davanti e quindi deviare il percorso senza sbatterci tutte le volte....
All'inizio avevo pensato di fare una roba tipo che se sbatto su una serie di celle e da li capisco che nn trovo il percorso, le celle le segno come inutili, e quindi nei successivi tentativi nn le considero neanke...dovrebbe essere simile al backtracking..ma kmq nn si hanno miglioramenti notevoli rispetto a una ricerca esaustiva brute force... |
Skilotto83 |
il disegno è venuto male....boh...
kmq è logico che la pate dove sbatto è inizio ostacolo e nn all'interno...
X LJL...
La storia della lunghezza del nome si risolve on una strlen, data questa poi alloco spazio per il nome...questo nella funzione...
In main invece devo usare le realloc per forza...quando leggo da tastiera nn posso farci nulla...
Secondo...uso una strcmp per ordinare i nomi...
Ragazzi..la soluzione magari nn è la migliore...ma mi risulta comoda primo perchè uso la stessa sia per automi che per ostacoli...e questo porta ad una semplicita' mdi lettura del codice...
e secondo perkè kosi' sembra ke mi venga la tortuosita' e il percorso libero....
Certo che se mi avanza tempo e utto funziona cerkero' di inserire automi in un alberello...
Ma gliu ostacoli nn si tokkano..sono in un array e vanno da power cosi'... |
mark |
i risultati del prof, mostrano che per l'automa (00) non esiste il percorso
e 12 11 00
a me invece pare proprio che esiste ed è di 36 passi
boh |
mattcobain |
ragazzi sono emozionato...ho finito!!!!! :ola: almeno il codice....ora c'è da fare la relazione, i costi, le prestazioni.....però il grosso è andato.....
io direi, per gli altri che hanno finito, perché non facciamo qualche prova con determinati input dati da noi e confrontiamo i risultati...sarebbe una verifica in più oltre all'output del prof....c'è qualcuno che ci sta?! |
mattcobain |
ciao ragazzi...allora, come avevo chiesto, qualcuno ha voglia di controllare l'output dando in input una sequenza comune a noi ma diversa da quella data da fiorentini sul testo del progetto?
io ho provato a dare in input questa sequenza:
code: c
a 2 1 1
a 2 8 10
a 5 11 11
a 8 9 100
a 10 6 101
a 13 3 110
a 12 2 111
e 2 8 1
t 2 8 1
e 5 11 1
t 5 11 1
e 8 9 1
t 8 9 1
e 10 6 1
t 10 6 1
e 13 3 1
t 13 3 1
e 12 2 1
t 12 2 1
o 1 3 4 6
o 3 2 4 7
o 3 0 15 1
o 6 0 10 3
o 6 5 7 8
e -10000 1 1
t -10000 1 1
o -10000 1 -10000 1
e -10000 1 1
t -10000 1 1
e 2 8 1
t 2 8 1
e 5 11 1
t 5 11 1
e 8 9 1
t 8 9 1
e 10 6 1
t 10 6 1
e 13 3 1
t 13 3 1
e 12 2 1
t 12 2 1
p 0
p 1
e 5 3 1
t 5 3 1
e 5 3 10
t 5 3 10
e 5 3 11
t 5 3 11
e 5 3 100
t 5 3 100
e 5 3 101
t 5 3 101
e 5 3 110
t 5 3 110
e 5 3 111
t 5 3 111
s 5 3 1
p 0
p 1
e 5 3 10
t 5 3 10
s 8 9 1
p 0
p 1
s 16 0 11
p 0
p 1
o 2 1 16 12
a 1 3 000
p 0
p 100
e 10000 10000 100
t 10000 10000 100
s 10000 10000 100
p 1
a 10 10 0
a 10 12 00
p 0
a 11 11 00
p 0
e 10 11 0
t 10 11 0
e 10 11 00
t 10 11 00
s 10 11 0
p 0
s 6 6 1
p 1
f
e come output ho ottenuto questo:
code: SI
0
SI
1
SI
1
SI
1
SI
1
SI
1
SI
0
NO
-1
NO
-1
NO
-1
NO
-1
NO
-1
NO
-1
NO
-1
(
)
(
1: 2, 1
10: 2, 8
100: 8, 9
101: 10, 6
11: 5, 11
110: 13, 3
111: 12, 2
)
NO
-1
SI
1
SI
0
SI
1
SI
2
NO
-1
NO
-1
(
)
(
1: 2, 1
10: 5, 3
100: 8, 9
101: 5, 3
11: 5, 3
110: 13, 3
111: 12, 2
)
SI
0
(
)
(
1: 2, 1
10: 5, 3
100: 8, 9
101: 5, 3
11: 5, 3
110: 13, 3
111: 12, 2
)
(
)
(
1: 2, 1
10: 5, 3
100: 8, 9
101: 5, 3
11: 5, 3
110: 16, 0
111: 16, 0
)
(
)
(
100: 8, 9
)
SI
1
(
1: 2, 1
10: 5, 3
100: 10000, 10000
101: 5, 3
11: 5, 3
110: 16, 0
111: 16, 0
)
(
0: 10, 10
00: 10, 12
)
(
0: 10, 10
00: 11, 11
)
SI
0
SI
0
(
0: 10, 11
00: 10, 11
)
(
1: 2, 1
10: 5, 3
100: 10000, 10000
101: 5, 3
11: 5, 3
110: 16, 0
111: 16, 0
)
ho provato anche a fare le prove su carta e mi tornava tutto...se qualcuno può cmq provarlo e postare eventuali incongruenze, oppure postare altre sequenze non sarebbe una brutta cosa! ;) |
LjL |
Originally posted by Skilotto83
[snip]
La storia della lunghezza del nome si risolve on una strlen, data questa poi alloco spazio per il nome...questo nella funzione...
In main invece devo usare le realloc per forza...quando leggo da tastiera nn posso farci nulla...
Appunto, è questo che intendevo. Usando un albero non hai mai bisogno di usare la realloc() -- basta che ogni volta che leggi un carattere dall'input discendi l'albero di un nodo (a destra o a sinistra a seconda del carattere), eventualmente creando il nodo se non esiste già.
Secondo...uso una strcmp per ordinare i nomi...
Ragazzi..la soluzione magari nn è la migliore...ma mi risulta comoda primo perchè uso la stessa sia per automi che per ostacoli...e questo porta ad una semplicita' mdi lettura del codice...
Ok, ogni caso è a sé e sicuramente non c'è *un* modo ottimo per implementare il progetto... e anche se ci fosse, io non l'ho ancora trovato, quindi non posso certo criticare a priori le idee degli altri.
Quando però mi dici (ad esempio) che certe operazioni su un array le puoi fare "direttamente" (tempo costante) e invece non è vero, allora sì che posso criticare ;-)
[/QUOTE]
Per la cronaca, ricordati che la strcmp() *non* si esegue in tempo costante, ma la sua complessità dipende dalla lunghezza delle stringhe. |
LjL |
Originally posted by wingzero
http://www2.latech.edu/~box/ds/chap4.ppt
E questo direi che conferma palesemente l'URL che avevo citato io.
Un ADT è una "scatola nera" su cui puoi eseguire solo determinate operazioni definite da un'interfaccia. Di un ADT ti importa sapere *cosa* fa, e non ti deve interessare sapere *come* lo fa.
E infatti il tuo URL dice che, in un ADT, "[there is] no concern on implementation details" (slide 2).
Nella slide 3, si parla di pile e di code (che vengono classificate, giustamente, come ADT) e di array (che non vengono classificate come ADT).
Si dice che una pila è un ADT poiché è un contenitore che permette di eseguire due operazioni (e solo quelle, aggiungo io!) denominate "push" e "pop". Allo stesso modo, una pila è un ADT poiché è un contenitore che permette di eseguire "queue" e "dequeue".
E poi di nuovo di ripete, "no concern on implementation details". Che sarebbe a dire che una pila o una coda la puoi implementare usando un array, una lista, un albero o quel cavolo che ti pare (purché sia una scelta un minimo intelligente...); quello che importa sono le operazioni che puoi eseguirci sopra (push e pop, queue e dequeue), mentre *non ti deve importare* della struttura interna.
Tutto ciò è perfettamente coerente con la definizione data dal mio URL:
"A type whose internal form is hidden behind a set of access functions."
La "forma interna" è *nascosta* (e quindi può essere modificata trasparentemente - array, lista, albero...), e l'unico modo con cui si accede ai dati è tramite delle "funzioni di accesso" -- cioè operazioni come push, pop, enqueue, dequeue...
Il mio URL va avanti a dire:
"A classic example of an ADT is a stack data type for which functions might be provided to create an empty stack, to push values onto a stack and to pop values from a stack."
Ergo, una pila è un ADT. Una coda è un ADT. Un array non è un ADT. Una lista dinamica non è un ADT.
[url]http://en.wikibooks.or...ructures:Arrays [/url]
Arrays typically map directly to contiguous storage locations within your computers memory and are therefore the "Natural" storage structure for most higher level languages.
Bene, quindi gli array finiscono tipicamente in locazioni di memoria contigue. Questo li rende una struttura "naturale" per molti linguaggi di alto livello. Ebbene?
Non mi sembra che "naturale" sia il contrario di "astratto" -- "concreto" è il contrario di "astratto".
Simple linear arrays are the basis for most of the other data structures. Many languages do not allow you to allocate any structure except an array, everything else must be implemented on top of the array.
Quindi il fatto che il BASIC non abbia i puntatori e ti costringa a far tutto cogli array dimostra che gli array sono concreti e il resto del mondo è astratto?
Tra l'altro, dov'è che gli array sono la base per *la maggior parte* delle strutture dati? Forse lo sono in quei linguaggi tipo il BASIC che ti costringono a fare in modo che lo siano :-D
Per il resto, io non vedo così tanti array in giro. Fammi controllare... no, sotto il letto non ce ne sono. Piuttosto vedo parecchie cose che assomigliano più o meno ad elementi di liste dinamiche (i nodi di un albero, i vertici di un grafo rappresentato in liste di adiacenza...). La prima struttura che mi viene in mente effettivamente basata sull'array è la tabella di hash.
The exception is the linked list, that is typically implemented as individually allocated objects, but it is possible to implement a linked list within an array.
Ah, solo la linked list è un'eccezione di questo genere? Gli alberi e compagnia bella no?
Il fatto che sia possibile implementare una lista dinamica in un array, e non viceversa, è l'unico argomento che mi pare possa essere effettivamente valido per affermare che le liste sono più astratte degli array. Ci penserò. |
mattcobain |
ragazzi, non per farmi i fattacci vostri, ma invece di scannarvi e perdere non poco tempo per fare queste divagazioni e ricerce in giro per la rete non potete pensare al progetto?!!?
....e magari controllare l'output del programma dando in input i comandi che ho postato poco sopra!??! :D |
LjL |
Originally posted by mattcobain
ragazzi, non per farmi i fattacci vostri, ma invece di scannarvi e perdere non poco tempo per fare queste divagazioni e ricerce in giro per la rete non potete pensare al progetto?!!?
Uh... cosa?! No, assolutamente no! :P
....e magari controllare l'output del programma dando in input i comandi che ho postato poco sopra!??! :D
Be' prima dovrei avere uno straccio di programma che in un modo o nell'altro funzioni ;-) Comunque sì, suppongo che a questo punto mi convenga scriverne uno piuttosto a star qui a rimuginare su algoritmi che probabilmente non farei in tempo a implementare... |
Novalis |
insisto, secondo me sbagliate nel fatto di voler memorizzare delle informazioni su tutti i punti del piano... :roll: |
LjL |
Originally posted by Novalis
insisto, secondo me sbagliate nel fatto di voler memorizzare delle informazioni su tutti i punti del piano... :roll:
E chi ne ha intenzione? Ovviamente non bisogna assolutamente memorizzare informazioni su tutti i punti del piano, altrimenti si crea, di fatto, un array grande almeno quanto il piano (cioè potenzialmente infinito).
Al massimo mi pare che qui si stia pensando di memorizzare informazioni su tutti i punti di quel rettangolo di piano compreso tra l'automa che si sta considerando e il richiamo... e anche questo secondo me è uno spreco evitabile, ma io per ora non ho trovato un modo per evitarlo che non allunghi orrendamente i tempo di esecuzione. |
superfabius |
Originally posted by superfabius
malloc?
secondo me è calloc |
LjL |
Originally posted by superfabius
secondo me è calloc
Ma che cosa?! |
Novalis |
Originally posted by LjL
Al massimo mi pare che qui si stia pensando di memorizzare informazioni su tutti i punti di quel rettangolo di piano compreso tra l'automa che si sta considerando e il richiamo... e anche questo secondo me è uno spreco evitabile, ma io per ora non ho trovato un modo per evitarlo che non allunghi orrendamente i tempo di esecuzione.
Neanche così può funzionare.
Se hai notato l'input di esempio, una riga dice
e -10000 6 11
quindi se un automa fosse in posizione (5,4) dovresti memorizzare comunque un numero improponibile di punti.
L'unica cosa da fare (secondo me), è quella di individuare il rettangolo, e memorizzare SOLO i punti non percorribili.
Banalmente, se un punto non è "non percorribile", è percorribile.
Resta da capire come tenere questo elenco di punti... magari con una lista, ma scorrere la lista per controllare il movimento di ogni punto non è certamente il massimo.
Potrebbe venirci in aiuto un albero binario di ricerca, dove le chiavi dei nodi sono (ad esempio) i valori di ascissa delle coordinate, e come dato satellite si inseriscono i valori di ordinata.
In questo modo, se devo muovermi da (-75, 10) a (-74,10), esamino l'albero per cercare tutti gli elementi con chiave -74, e se ce ne sono controllo che nessuno di questi abbia un valore di ordinata di 10.
Qualcuno vuole discuterne con me, oppure il mio ragionamento è folle? |
LjL |
Originally posted by Novalis
Neanche così può funzionare.
Se hai notato l'input di esempio, una riga dice
e -10000 6 11
quindi se un automa fosse in posizione (5,4) dovresti memorizzare comunque un numero improponibile di punti.
Sì, questo è vero, e almeno fino a ieri era la cosa che più mi preoccupava.
L'unica cosa da fare (secondo me), è quella di individuare il rettangolo, e memorizzare SOLO i punti non percorribili.
Banalmente, se un punto non è "non percorribile", è percorribile.
Questa è un'idea... solo di idee del genere me ne sono venute un bel po', ma purtroppo nessuna che funzionasse veramente (magari solo perché non sono riuscito a svilupparle fino in fondo).
Adesso ho implementato un'idea che mi pare effettivamente funzionare ed essere piuttosto efficiente... purtroppo descriverla bene vorrebbe dire spiattellare l'algoritmo dall'inizio alla fine, cosa che suppongo di non poter fare.
Posso dire questo: per ogni ostacolo, considera le quattro rette parallele a ogni lato dell'ostacolo e distanti 1 da tale lato.
Considera poi tutti i punti in cui tutte queste tue rette si intersecano.
Resta da capire come tenere questo elenco di punti... magari con una lista, ma scorrere la lista per controllare il movimento di ogni punto non è certamente il massimo.
Io sto usando una struttura un tantino difficile da gestire ma che mi sembra piuttosto funzionale almeno per il mio algoritmo: una lista *quadruplamente* linkata. Ogni nodo ha due coppie di puntatori "precedente" e "successivo" rispettivamente per la direzione orizzontale e verticale.
Potrebbe venirci in aiuto un albero binario di ricerca, dove le chiavi dei nodi sono (ad esempio) i valori di ascissa delle coordinate, e come dato satellite si inseriscono i valori di ordinata.
O un hash di qualche genere con chiavi le ascisse e satelliti le ordinate... sono tutte soluzioni più che valide, ma che a me non sono mai piaciute molto perché "privilegiano" arbitrariamente una direzione (orizzontale o verticale) piuttosto che l'altra.
Il fatto che a me non piaccia però non significa che non sia un modo tra i più usati per gestire le matrici sparse (sempre che in italiano si dica così), e quello che noi abbiamo - almeno dopo un'opportuna semplificazione - è proprio una matrice sparsa, o se preferisci un array sparso bidimensionale. |
Skilotto83 |
ho finito....!!!!!!:D:D:D:D:D
solo mi rimane un problema su un output.....
dopo il segnale...l'automa 01 a me nn si muove in 2,7...invece sekondo il prof si muove e giunge a destinazione...nessuno ha lo stesso problema???
+E poi...ma l'output vuole che si veda tutto in una volta come esempio..o dopo ogni singola istruzione che stampa???
Perchè a me printa dopo ogni comando di "posizione", "esiste percorso" e "tortuosità"...va bene no?? |
LjL |
Originally posted by Skilotto83
+E poi...ma l'output vuole che si veda tutto in una volta come esempio..o dopo ogni singola istruzione che stampa???
Perchè a me printa dopo ogni comando di "posizione", "esiste percorso" e "tortuosità"...va bene no??
Direi proprio di sì. |
Jacoposki |
io sono ancora in alto mare... c'è nessuno in condizioni simili alle mie che abbia voglia di fare in questi tre giorni altrettante sessioni di brainstorming in comelico? Io domani alle 12 ho un orale lì, per cui per essere in giro sono in giro.... e domattina controllo i pm prima di uscire, giuro :P
Fatevi sentire :( |
LjL |
Nell'area file potete trovare un programmino che ho scritto per generare input validi per il progetto.
Spero vi sia utile.
E, sì, adesso il mio progetto è quasi completamente funzionante e domani invece di litigare con wingzero proverò e confronterò gli input che sono stati postati qui ;) |
LjL |
Originally posted by mattcobain
[snip]
io ho provato a dare in input questa sequenza:
[snip]
ho provato anche a fare le prove su carta e mi tornava tutto...se qualcuno può cmq provarlo e postare eventuali incongruenze, oppure postare altre sequenze non sarebbe una brutta cosa! ;)
Il mio risultato è quasi uguale al tuo, con la differenza che il mio, come output del comando 'p', cita alcune volte l'automa "000" che il tuo output non cita mai.
Il diff tra il mio e il tuo output è
90d89
< 000: 1, 3
109d107
< 000: 1, 3
114d111
< 000: 1, 3
123d119
< 000: 1, 3
A me sembra che sia giusta la mia versione, dato che un automa "000" viene effettivamente creato e c'è almeno un comando 'p' che chiama gli automi con prefisso "0". |
p2p |
Originally posted by Skilotto83
ho finito....!!!!!!:D:D:D:D:D
solo mi rimane un problema su un output.....
dopo il segnale...l'automa 01 a me nn si muove in 2,7...invece sekondo il prof si muove e giunge a destinazione...nessuno ha lo stesso problema???
+E poi...ma l'output vuole che si veda tutto in una volta come esempio..o dopo ogni singola istruzione che stampa???
Perchè a me printa dopo ogni comando di "posizione", "esiste percorso" e "tortuosità"...va bene no??
anch io ho lo stesso problema, lo 01 resta in 8 -4 e non si sposta... questo problema io l ho anche con 10 e 11 non so, potrebbe essere calcolato male la distanza,cioe' il modulo x-x0 + y-y0 forse...
a te che distanze vengono?io ho usato questa istruzione:
(abs(xsorg - xautoma)) + (abs(ysorg - yautoma));
è giusta? |
elpampero |
A me viene come ha detto il prof..controllate bene anche l'input |
elpampero |
S' 2p2 la funzione scritta così è corretta |
mattcobain |
Originally posted by LjL
Il mio risultato è quasi uguale al tuo, con la differenza che il mio, come output del comando 'p', cita alcune volte l'automa "000" che il tuo output non cita mai.
Il diff tra il mio e il tuo output è
90d89
< 000: 1, 3
109d107
< 000: 1, 3
114d111
< 000: 1, 3
123d119
< 000: 1, 3
A me sembra che sia giusta la mia versione, dato che un automa "000" viene effettivamente creato e c'è almeno un comando 'p' che chiama gli automi con prefisso "0".
davvero sicuro che la tua versione sia giusta?
se guardi bene nell'input l'automa 000 che creo tento di metterlo in posizione (1,3) dove in realtò c'è il primo ostacolo che era stato inserito col comando " o 1 3 4 6" (in particolare, nel punto (1,3) c'è lo spigolo in basso a destra dell'ostacolo considerato)
se un automa va a posizionarsi su un punto appartenente ad un ostacolo, il testo del progetto dice che la funzione automa() non fa niente e quindi non inserisce l'automa....a questo punto penso che la versione giusta sia la mia....che dici? |
Mosco |
Ciao a tutti qualcuno di voi sarebbe così gentile da spiegarmi per quale motivo l'automa 00 e l'automa 1 non possono raggingere il segnale dato che il prof Fiorentini non mi da una risposta? Io mi sono fatto una tabella con excel e ho inserito gli ostacoli e i relativi automi ma da questa mi risulta che solo l'automa 0 non può raggingere il segnale...e ciò mi compare anche dall'algoritmo che ho sviluppato...qualcuno può dirmi cosa non va del mio ragionamento?..o magari è l'output sbagliato?
grazie |
LjL |
Originally posted by mattcobain
davvero sicuro che la tua versione sia giusta?
se guardi bene nell'input l'automa 000 che creo tento di metterlo in posizione (1,3) dove in realtò c'è il primo ostacolo che era stato inserito col comando " o 1 3 4 6" (in particolare, nel punto (1,3) c'è lo spigolo in basso a destra dell'ostacolo considerato)
se un automa va a posizionarsi su un punto appartenente ad un ostacolo, il testo del progetto dice che la funzione automa() non fa niente e quindi non inserisce l'automa....a questo punto penso che la versione giusta sia la mia....che dici?
Si', hai ragione tu. In effetti sapevo che il mio programma non considera ancora questi casi, ma mi era proprio scappato di mente... (erano anche le 3 di notte :) ). |
LjL |
Originally posted by p2p
anch io ho lo stesso problema, lo 01 resta in 8 -4 e non si sposta... questo problema io l ho anche con 10 e 11 non so, potrebbe essere calcolato male la distanza,cioe' il modulo x-x0 + y-y0 forse...
a te che distanze vengono?io ho usato questa istruzione:
(abs(xsorg - xautoma)) + (abs(ysorg - yautoma));
è giusta?
E' giusta.
Piu' che questo, controllate se avete fatto i test nell'ordine giusto e e calcolate nella maniera corretta il minimo tra le distanze.
Se io ho capito bene, si determina quali automi devono muoversi in questo modo:
1) tra tutti gli automi, scegliere queli che corrispondono al prefisso indicato
2) tra questi, scegliere quelli per cui esiste un percorso libero da ostacoli
3) tra questi, scegliere quelli che si trovano a distanza minima dal richiamo
4) quelli che rimangono si muovono verso il richiamo
In particolare vi faccio notare che il punto 2 viene *prima* del punto 3. In realta' nel codice possono essere combinati per risparmiare qualche ciclo, ma se li combinate, state veramente attenti a farlo nel modo corretto.
L'altra questione e' il calcolo della distanza minima: se non usate metodi particolarmente arcani, suppongo che avrete una variabile "distanza minima" che aggiornate ogni volta che trovate un automa che la diminuisce... ecco, con che valore inizializzate questa variabile? E' facile che il problema stia li'. |
elpampero |
Per mosco. Non raggiunge il segnale perchè la distanza tra l'automa 1 e il segnale non è quella minima che hanno invece gli altri due automi! |
Mosco |
è proprio quello che non riesco a capire..perchè a me l'automa 00 e l'automa 1 ragginge il segnale con un percorso di distanza minima..e rispettivamente l'automa 1 in 18 passi e l'automa 00 in 22...sbaglio a calcolare la distanza minima?
ho usato D = abs(x1-x2) + abs(y1-y2); |
LjL |
Originally posted by Mosco
è proprio quello che non riesco a capire..perchè a me l'automa 00 e l'automa 1 ragginge il segnale con un percorso di distanza minima..e rispettivamente l'automa 1 in 18 passi e l'automa 00 in 22...sbaglio a calcolare la distanza minima?
ho usato D = abs(x1-x2) + abs(y1-y2);
Esempio: 00 può raggiungere il richiamo in 22 passi, ma 0 può raggiungerlo in 15, quindi 00 non si muove.
Se leggi anche la mia risposta a p2p dovresti capire qual è la questione. |
Mosco |
Grazie LjL tutto chiarito...mi era sfuggita sta cosa...il che significa riguardare tutta la funzione....consegnarlo entro giovedì è la mia impresa epica.. |
LjL |
Adesso che il mio progetto è completo e (salvo alcuni casi particolari e segmentation fault vari che dovrò sistemare) sembra funzionare, posso indicarvi dei livelli di efficienza che sicuramente si possono raggiungere -- poi nessuno vieta che ne ne possano raggiungere anche di migliori, ovviamente.
- Detto 'n' il numero degli ostacoli e degli automi presenti, il piano può essere rappresentato con una struttura di dimensioni O(n²) che permette inserimento e ricerca in tempo O(n) per chiavi di tipo (x,y), senza privilegiare la x o la y.
- La ricerca degli automi che rispondono a un determinato prefisso di lunghezza k può, nel caso migliore, essere portata a termine in tempo @(k+m), dove m è il numero degli automi il cui come ha il prefisso cercato. In realtà sono abbastanza convinto che si possa raggiungere @(k+m) anche nel caso peggiore.
- Il calcolo della tortuosità per un automa può essere portato a termine in tempo O(n²), utilizzando una quantità di spazio O(n²), e volendo anche molto meno, direi O(n) ma non ne sono sicuro. Non sono in grado di dire quale sia la complessità in tempo del mio algoritmo nel caso medio (probabilmente sempre @(n²)), ma sono quasi sicuro che possa essere diminuita: infatti il mio algoritmo risolve in molti casi dei sottoproblemi che apparentemente si potrebbe evitare di considerare. Probabilmente il caso medio può arrivare fino a @(a*n), dove 'a' a occhio e croce sta tra una costante e un logaritmo. |
LjL |
(deleted - scusate di nuovo, continuo a schiacciare Quote invece che Edit) |
Skilotto83 |
Originally posted by p2p
anch io ho lo stesso problema, lo 01 resta in 8 -4 e non si sposta... questo problema io l ho anche con 10 e 11 non so, potrebbe essere calcolato male la distanza,cioe' il modulo x-x0 + y-y0 forse...
a te che distanze vengono?io ho usato questa istruzione:
(abs(xsorg - xautoma)) + (abs(ysorg - yautoma));
è giusta?
ho risolto...
Il problema è ke si spostano solo quelli a distanza minima per i quali esiste un percorso...
Quindi io trovavo la distanza minima ma se quello nn si muoveva tutte le altre andavano scartate..invece nn è kosi'...
Quindi se modifika sta kosa sei a posto...
Piu' ke altro mi kiedevo..ma kome fa il prof a cointrollare se quando mando "segnale" in effetti sto usando il percorso con tortuosita' minima...visto ke lui nn vuole come out la tortuosita' nel comando segnale???? |
LjL |
Originally posted by Skilotto83
ho risolto...
[snip]
Piu' ke altro mi kiedevo..ma kome fa il prof a cointrollare se quando mando "segnale" in effetti sto usando il percorso con tortuosita' minima...visto ke lui nn vuole come out la tortuosita' nel comando segnale????
E chi ti dice che devi "usare" un qualsiasi percorso? È vero che il testo dice qualcosa tipo "l'automa sceglie il percorso con tortuosità minima", ma l'output non riflette mai questa scelta.
Il prof. se vuole mi può anche scrivere che devo ballare nudo in punta di piedi -- io però credo di potermi anche risparmiare di farlo, se le specifiche dicono che mentre ballo posso anche non farmi vedere da nessuno :)
(Edit - alias, "la luna esiste quando nessuno la guarda?") |
Skilotto83 |
boh...
kmq basta che apre il codice e si accorge se nel momento in cui stai rispondendo al comando segnale usi la funzione per il calcolo della torutosita' minima o no... |
Skilotto83 |
kmq a me viene diverso l'out...
nei comandi posizione gli automi 10 101 11 mi da 8,9...a voi sempre 5,3...kome mai?? |
LjL |
Originally posted by Skilotto83
boh...
kmq basta che apre il codice e si accorge se nel momento in cui stai rispondendo al comando segnale usi la funzione per il calcolo della torutosita' minima o no...
Chiaro che se ne può accorgere facilmente, ma quello che voglio dire è che secondo me è quasi un punto di merito il *non* calcolare la tortuosità minima dopo un comando 'segnale': per come la vedo io, significa che uno ha capito *cosa deve fare* il programma (cioè quale output deve corrispondere a un determinato input), senza fissarsi sulle idiosincrasie del testo.
In ogni caso, cosa vuol dire che "un automa sceglie la tortuosità minima"? "Sceglie"? Non è mica un essere vivente l'automa... a casa mia, una lista di byte non è capace di "scegliere".
Quindi secondo me quella frase va interpretata solo nel senso di "immaginate che, se i vostri automi fossero ad esempio dei taxi che devono spostarsi in una città, sceglierebbero il percorso a tortuosità minima".
Tanto la funzioner per calcolare la tortuosità ci *deve* essere nel programma (per fare funzionare il comando 't'), quindi che venga chiamata o meno durante il comando 's' non mi pare abbia moltissima importanza. |
LjL |
Originally posted by Skilotto83
kmq a me viene diverso l'out...
nei comandi posizione gli automi 10 101 11 mi da 8,9...a voi sempre 5,3...kome mai??
Be', non so, facendolo su un foglio di carta mi sembra che almeno per un comando 'p' sia giusta la tua versione (sarebbe a dire, a me (8,9) non compare mai, mentre invece almeno una volta mi sembra che dovrebbe apparire).
EDIT - eh no, aspetta... in (8,9) c'è l'automa 100, quindi mi sembra difficile che altri automi possano spostarsi lì! |
Skilotto83 |
ma guarda che nel testo dice che gli automi possono sovrapporsi.... |
mattcobain |
Originally posted by Skilotto83
kmq a me viene diverso l'out...
nei comandi posizione gli automi 10 101 11 mi da 8,9...a voi sempre 5,3...kome mai??
ti stai riferendo all'output dato dalla sequenza in ingresso che ho postato io!?
cmq gli automi 10, 101, 11 sono in (5,3) perché viene inviato un segnale di prefisso 1 dal punto (5,3) e quelli sono gli automi che si spostano (la parte iniziale del mio input infatti è uguale a quella sul pdf del prof fiorentini, e anche li puoi vedere che gli automi che si spostano in (5,3) infatti sono proprio 10, 101 ed 11)
prova a fare qualche prova disegnano il piano, gli ostacoli e gli automi....
le uniche incongruenze che hai sono queste!?!? |
LjL |
Originally posted by Skilotto83
ma guarda che nel testo dice che gli automi possono sovrapporsi....
Non era questo che intendevo dire.
Intendevo dire che, essendoci un automa in (8,9), il segnale emesso in (8,9) farà chiaramente muovere solo quell'automa, dato che è a distanza zero. |
LjL |
Originally posted by mattcobain
ti stai riferendo all'output dato dalla sequenza in ingresso che ho postato io!?
cmq gli automi 10, 101, 11 sono in (5,3) perché viene inviato un segnale di prefisso 1 dal punto (5,3) e quelli sono gli automi che si spostano
[snip]
Sì, ma se non sbaglio prima che arrivi un comando 'p' viene lanciato un segnale anche da (8,9), e suppongo che sia quel segnale che a lui fa muovere quegli automi.
Ma dato che in (8,9) *c'è* un automa, chiaramente si muoverà solo lui essendo a distanza 0 dal segnale di richiamo -- tutto questo sempre se ho riprodotto le cose con carta&penna in maniera corretta.
Forse per qualche motivo il suo programma si dimentica di considerare gli automi che hanno distanza minima nulla...?! |
mattcobain |
Originally posted by LjL
Sì, ma se non sbaglio prima che arrivi un comando 'p' viene lanciato un segnale anche da (8,9), e suppongo che sia quel segnale che a lui fa muovere quegli automi.
Ma dato che in (8,9) *c'è* un automa, chiaramente si muoverà solo lui essendo a distanza 0 dal segnale di richiamo -- tutto questo sempre se ho riprodotto le cose con carta&penna in maniera corretta.
Forse per qualche motivo il suo programma si dimentica di considerare gli automi che hanno distanza minima nulla...?!
ah vero...c'è anche questo segnale....magari non ha considerato gli automi che si trovano a distanza nulla dalla sorgente
cmq questo segnale che parte da (8,9) arriva dopo il primo comando 'p'.....infatti subito dopo faccio un altro 'p' per vedere cos'è successo agli automi |
p2p |
Originally posted by Skilotto83
boh...
kmq basta che apre il codice e si accorge se nel momento in cui stai rispondendo al comando segnale usi la funzione per il calcolo della torutosita' minima o no...
e secondo te si legge il codice di tutti?
io allo scorso progetto avevo fatto un paio di errori correggibili con l' aggiunta di 1 riga di codice,era uno sbaglio su un controllo di stringhe ... beh, me l ha rifiutato!se l' avesse letto probabilmente si sarebbe accorto che l' output era errato per una banalita', non credi? |
Skilotto83 |
Originally posted by p2p
e secondo te si legge il codice di tutti?
io allo scorso progetto avevo fatto un paio di errori correggibili con l' aggiunta di 1 riga di codice,era uno sbaglio su un controllo di stringhe ... beh, me l ha rifiutato!se l' avesse letto probabilmente si sarebbe accorto che l' output era errato per una banalita', non credi?
ke infamata...massima solidarieta'! |
Skilotto83 |
Originally posted by LjL
Non era questo che intendevo dire.
Intendevo dire che, essendoci un automa in (8,9), il segnale emesso in (8,9) farà chiaramente muovere solo quell'automa, dato che è a distanza zero.
Ora controllo...grazie mille... |
Skilotto83 |
Il problema era quello...
solo ke è un kaso limite..siete sikuri ke va konsiderato spostamento...??
Non è il kaso si mandare una mail al prof??
io il progetto lo faccio con aguzzoli e nn con fiorentini...il mio progetto nn dice nulla a riguardo... |
|
|
|
|