.dsy:it. Pages (2): [1] 2 »
Show 150 posts per page

.dsy:it. (http://www.dsy.it/forum/)
- Algoritmi e strutture dati (http://www.dsy.it/forum/forumdisplay.php?forumid=207)
-- [PROGETTO] "Mappe 2" (http://www.dsy.it/forum/showthread.php?threadid=23982)


Posted by Simeon on 07-02-2006 10:58:

[PROGETTO] "Mappe 2"

Ci tenevo ad inaugurare il thread di discussione per questo progetto. Certo che il titolo è proprio originale :asd:


Posted by maynard80 on 07-02-2006 13:23:

beh quanto è differente da mappe1?

__________________
msn Messenger: giamma80 at tiscali.it
ATHENA !


Posted by Simeon on 07-02-2006 13:39:

Originally posted by maynard80
beh quanto è differente da mappe1?


Ho guardato di sfuggita il testo e mi pare identico, oggi pomeriggio me lo studio per bene...

Ho paura :#


Posted by Sephirot on 07-02-2006 14:30:

Originally posted by Simeon
Ho guardato di sfuggita il testo e mi pare identico

sisi è proprio uguale


Posted by darkAntAreS on 07-02-2006 18:18:

non ho la minima idea di quanto sia uguale, ma non credo proprio che il prof l'abbia fatto anche solo simile, altrimenti sai quanto ci si metteva a farsi passare il progetto da uno dell'appello scorso? :/

cmq ci penseremo domani, io e chi ha fatto lo scritto oggi: ci meritiamo un po' di riposo dopo la mazzata di stamattina ;)

__________________
"Ash nazg durbatulûk, ash nazg gimbatul, ash nazg thrakatulûk agh burzum-ishi krimpatul"


Posted by YoMo on 07-02-2006 21:26:

L'idea del piano, sequenze di punti, mappe.... è la stessa.
Cambia il fine ma sn convinto che parte del progetto di gennaio è tranquillamante riutilizzabile.


Posted by darkAntAreS on 07-02-2006 23:00:

uhm...se è così gli darò un'occhiata ;)

__________________
"Ash nazg durbatulûk, ash nazg gimbatul, ash nazg thrakatulûk agh burzum-ishi krimpatul"


Posted by silver on 08-02-2006 07:13:

ciao a tutti,
ho letto il progetto ed ho fatto una prova per verificare l'esempio, ma non mi torna qualcosa......
nel file primo.txt ci sono le coordinate dei punti del piano (P0........Pn) ossia P(x,y) del primo punto fino all'ultimo...
il valore del punto viene calcolato con la formula del modulo nelle note 4
es :

c 4 4 primo.txt ho m x n = 16 punti da P0 ........... P15

per cui da v0......v 15

a=x mod m --> a=-1 mod 4 = 3
b=y mod n --> a= -3 mod 4 = 1

Val(-1,-3)=v(a+mb) = v6 che corrisponde a 5 corretto ??

ma quando verifico l'output con l non mi torna il valore 1
e con il sottopercorso non mi torna 13: e le coordinate !!

a voi torna qualcosa ??


Posted by Diuzza on 08-02-2006 10:06:

-1 mod 4 fa -1. E' sbagliato l'esempio del prof sul modulo.
Il modulo puoi semplificarlo così:
x mod y :
X-(parteintera(x/y)*y)
nel tuo caso:
-1-(parteintera(-1/4)*4) = -1-(0*4)=-1


Posted by Diuzza on 08-02-2006 10:12:

Se non credete provate anche con la calcolatrice.
Cmq l'ordine in cui sono messi i valori nel file è semplicemente nell'esempio del proff:
(0,0)(1,0)(2,0)(3,0)(1,0)(1,1)...
Sono praticamente in ordine se ho fatto bene i calcoli.
Cmq avete pensato a che strutture usare?


Posted by YoMo on 08-02-2006 10:14:

Originally posted by Diuzza
-1 mod 4 fa -1. E' sbagliato l'esempio del prof sul modulo.
Il modulo puoi semplificarlo così:
x mod y :
X-(parteintera(x/y)*y)
nel tuo caso:
-1-(parteintera(-1/4)*4) = -1-(0*4)=-1


Non direi http://www.google.it/search?hl=it&q...on+Google&meta=

-340 mod 60 = -40 ???? sembrerebbe di no...
"The mod function is defined as the amount by which a number
exceeds the largest integer multiple of the divisor that is
not greater than that number. In this case, -340 lies between
-360 and -300, so -360 is the greatest multiple LESS than -340;
we subtract 60 * -6 = -360 from -340 and get 20."


Posted by Diuzza on 08-02-2006 10:14:

Cmq io non so se è + o - uguale a quello passato perchè non l'ho guardato e ora mi sa che non c'è più il testo :-((
Passiensa


Posted by Diuzza on 08-02-2006 10:16:

allora la mia calcolatrice è spastica?!? A mè da -40


Posted by YoMo on 08-02-2006 10:17:

Originally posted by Diuzza
Cmq io non so se è + o - uguale a quello passato perchè non l'ho guardato e ora mi sa che non c'è più il testo :-((
Passiensa


c'è c'è.... quello passato si chiamava mappe, questo si chiama mappe2, cambi qlcosa nell'url....


Posted by YoMo on 08-02-2006 10:19:

Originally posted by Diuzza
allora la mia calcolatrice è spastica?!? A mè da -40


Infatti, prova printf("%d", -1 % 4)....
Sto giungendo alla conclusione che la funzione modulo me la devo scrivere io.


Posted by darkAntAreS on 08-02-2006 10:55:

io sapevo che il modulo era il resto della divisione...
es.
1) -340 mod 60 = -40
-340 / 60 fa -5 (senza contare eventuali decimali) -> -5*60 = -300 -> mancano -40
2) -1 mod 4 = -1
-1 / 4 fa 0 (senza contare eventuali decimali) -> 0*4 = 0 -> manca -1
3) -7 mod 4 = -3
-7 / 4 = -1 (senza contare eventuali decimali) -> -1*4 = -4 -> manca -3

mi pare fosse spiegato da qualche parte sul libro di dscreta...

__________________
"Ash nazg durbatulûk, ash nazg gimbatul, ash nazg thrakatulûk agh burzum-ishi krimpatul"


Posted by Simeon on 08-02-2006 11:12:

Ragazzi io... non riesco a trovare una struttura dati adatta alla rappresentazione del piano. Suggerimenti? La matrice è da escludere come da testo...


Posted by Simeon on 08-02-2006 11:17:

Originally posted by Diuzza
-1 mod 4 fa -1. E' sbagliato l'esempio del prof sul modulo.
Il modulo puoi semplificarlo così:
x mod y :
X-(parteintera(x/y)*y)
nel tuo caso:
-1-(parteintera(-1/4)*4) = -1-(0*4)=-1


Anche io la sapevo così (parte intera inferiore per essere precisi). dove andremo a finire se non ci si può più fidare nemmeno del cormen :(


Posted by ornati on 08-02-2006 11:33:

Originally posted by Simeon
Ragazzi io... non riesco a trovare una struttura dati adatta alla rappresentazione del piano. Suggerimenti? La matrice è da escludere come da testo...


Puoi usare una hash table che mappa (x,y) --> val:
http://www.dsy.it/forum/showthread....&threadid=24001

Oppure un albero di ricerca (meglio se bilanciato).

L'alternativa peggiore è usare una lista.

Con un albero bilanciato ottieni le migliori prestazioni asintotiche nel caso peggiore, mentre in pratica le hash table sono le + efficienti (caso atteso).


Posted by YoMo on 08-02-2006 12:17:

Originally posted by darkAntAreS
io sapevo che il modulo era il resto della divisione...
es.
1) -340 mod 60 = -40
-340 / 60 fa -5 (senza contare eventuali decimali) -> -5*60 = -300 -> mancano -40
2) -1 mod 4 = -1
-1 / 4 fa 0 (senza contare eventuali decimali) -> 0*4 = 0 -> manca -1
3) -7 mod 4 = -3
-7 / 4 = -1 (senza contare eventuali decimali) -> -1*4 = -4 -> manca -3

mi pare fosse spiegato da qualche parte sul libro di dscreta...


E allora come me lo spieghi sul testo -2 mod 7 = 5 ?!?!?
Come ho scritto precedentemente, qual'è il più grande multiplo di 7 che sia minore o uguale a -2? E' -7, quindi -2 mod 7 = -2 - [(-7/7)*7] = -2 -[-1 * 7] = -2 - [-7] = -2 + 7 = 5
A quanto pare con il dividendo (-2) negativo è sbagliato dire che -2/7=0 ma bisogna prendere il più grande multiplo del divisore (7) che sia minore o uguale al dividendo (-2), cioè -7, quidni.... -2/7=-7/7=-1 con resto 5.

Il ragionamento quadra xro.....è un pò strano nn dite? Anche perchè in C printf("%d", -2 % 7) stampa -2.
Boh sinceramente spero che il prof si sia sbagliato.


Posted by Simeon on 08-02-2006 12:36:

Originally posted by ornati
Puoi usare una hash table che mappa (x,y) --> val:
http://www.dsy.it/forum/showthread....&threadid=24001

Oppure un albero di ricerca (meglio se bilanciato).

L'alternativa peggiore è usare una lista.

Con un albero bilanciato ottieni le migliori prestazioni asintotiche nel caso peggiore, mentre in pratica le hash table sono le + efficienti (caso atteso).


Mi sa che andrò per l'albero di ricerca... boh ci penserò, grazie comunque.

Con le liste mi vengono in mente robe aberranti tipo "liste di liste", o forse un'unica lista che scorre tutti i punti da 0 a m*n...


Posted by ornati on 08-02-2006 13:31:

Originally posted by Simeon
Mi sa che andrò per l'albero di ricerca... boh ci penserò, grazie comunque.

Con le liste mi vengono in mente robe aberranti tipo "liste di liste", o forse un'unica lista che scorre tutti i punti da 0 a m*n...


Guarda che NON devi assolutamente memorizzare TUTTI i punti possibili ma SOLO i punti che vengono settati esplicitamente. Tutti gli altri hanno un valore predefinito... qundi se il punto che cerchi non è nella lista (albero, hash table ...) allora sai già quanto vale.


Posted by Simeon on 08-02-2006 13:51:

Originally posted by ornati
Guarda che NON devi assolutamente memorizzare TUTTI i punti possibili ma SOLO i punti che vengono settati esplicitamente. Tutti gli altri hanno un valore predefinito... qundi se il punto che cerchi non è nella lista (albero, hash table ...) allora sai già quanto vale.


Ah allora stavo sbagliando, perche io pensavo di dover memorizzare tutte le coordinate da (1,1) a (m,n) e poi assegnare il valore di default a quelli che non erano settati esplicitamente...

Cioe, una 4x4 avrebbe costituito una lista di punti (1,1)... (4,4) ognuno con val(p) determinato (se preso dal file o settato successivamente tramite valore(x,y,z) ) o di default altrimenti.

Cercherò di ragionarci a fondo per comprendere anche queste banalità ( era piu bello il progetto di JAVA :asd: )


Posted by ornati on 08-02-2006 13:56:

Confusione sul modulo...

Ecco una spiegazione alla faccenda del modulo:
http://en.wikipedia.org/wiki/Modulo_operation

Da notare questa parte:
"Some programming languages, such as ANSI C, don't define a result if either of n or a is negative. a modulo 0 is undefined in the majority of systems, although some do define it to be a."


Posted by ornati on 08-02-2006 14:10:

Originally posted by Simeon
Ah allora stavo sbagliando, perche io pensavo di dover memorizzare tutte le coordinate da (1,1) a (m,n) e poi assegnare il valore di default a quelli che non erano settati esplicitamente...

Cioe, una 4x4 avrebbe costituito una lista di punti (1,1)... (4,4) ognuno con val(p) determinato (se preso dal file o settato successivamente tramite valore(x,y,z) ) o di default altrimenti.

Cercherò di ragionarci a fondo per comprendere anche queste banalità ( era piu bello il progetto di JAVA :asd: )


Seguendo il tuo vecchio ragionamento, se inerisco 4 punti di coordinate:
(-2 miliardi, -2 miliardi)
(-2 miliardi, +2miliardi)
(+2 miliardi, -2miliardi)
(+2 miliardi, +2miliardi)

ho un piano di 4 miliardi x 4 miliardi di punti circa... quindi 16 miliardi di punti.

Volendo scrivere da qualche parte il valore di ognuno di questi punti (assumiamo che sia un int di 4 byte) hai bisogno di almeno 64 miliardi di byte.

Ovvero circa 60 GB di memoria... il tutto per memorizzare 4*4 = 16 byte di informazione utile.

L'inefficienza di Java deve averti contagiato... cerca di disintossicarti!

:)


Posted by silver on 08-02-2006 15:05:

ciao,
scusate ma non ho capito bene utilizziamo l'esempio del prof:

c 4 4 primo.txt dove primo.txt --> -1 -3 2 -2 2 1 0 2 -2 3 2 -1 0 -2 1 -2
questi sono i valori dei punti da P0........P15 oppure le coordinate ?

oppure il valore dei punti si calcola come nella nota 3 ??

es della prima coppia -1 -3

Vla(x,y) = v(a+mb) ossia v vale da v0......v15 giusto ?

a= x mod m = A
b= y mod n = B

il valore del punto è ??

val(-1,-3)=v(A+4*B) ossia il valore corrispondente a ??

sono mooolto confuso


Posted by YoMo on 08-02-2006 15:17:

Originally posted by silver
ciao,
scusate ma non ho capito bene utilizziamo l'esempio del prof:

c 4 4 primo.txt dove primo.txt --> -1 -3 2 -2 2 1 0 2 -2 3 2 -1 0 -2 1 -2
questi sono i valori dei punti da P0........P15 oppure le coordinate ?

oppure il valore dei punti si calcola come nella nota 3 ??

es della prima coppia -1 -3

Vla(x,y) = v(a+mb) ossia v vale da v0......v15 giusto ?

a= x mod m = A
b= y mod n = B

il valore del punto è ??

val(-1,-3)=v(A+4*B) ossia il valore corrispondente a ??

sono mooolto confuso


Il valore del punto (x,y) si calcola così:

a = x mod m
b = y mod n
dove m ed n sono i parametri di crea(m, n, nome).

Una voltra trovati questi "resti" eseguendo l'operazione i = a+mb trovo l'indice del valore da assegnare a val(x,y), dove per indice intendo l'indice relativo a v0, v1,...., v(m*n+1) che trovi nel file nome.
Cioè devo assegnare l'i-esimo valore nel file a val(x,y).

Ditemi se sbaglio....


Posted by ornati on 08-02-2006 15:46:

Re: Confusione sul modulo...

Originally posted by ornati
Ecco una spiegazione alla faccenda del modulo:
http://en.wikipedia.org/wiki/Modulo_operation

Da notare questa parte:
"Some programming languages, such as ANSI C, don't define a result if either of n or a is negative. a modulo 0 is undefined in the majority of systems, although some do define it to be a."


Tradotto in "C":

code:
int modulo(int a, int b) { int x; if (a < 0) { x = -a + b - 1; a += x - x % b; return a; } return a % b; }


Posted by Simeon on 08-02-2006 18:07:

Meglio continuare qua....

Originally posted by MaurizioL
L'hash non serve a rappresentare un piano.
Dato che i punti che cambiano valore sono pochi puoi usare un albero per memorizzare quei punti il cui valore è stato cambiato.
Gli altri avranno un valore predefinito


Sto pensando di utilizzare un albero binario di ricerca con come chiavi le coordinate x e y e il valore come dato satellite... e' una buona idea? Non son sicuro se vada bene binario e nemmeno se utilizzare le coordinate come chiave...

E poi non ho capito questo: la funzione "valore (x,y,n)" va a porre a n il valore di un punto... questo punto si da per scontato che sia gia presente nel piano? Se non lo fosse andrebbe aggiunto all'interno dell'albero...


Posted by MaurizioL on 08-02-2006 18:39:

Originally posted by Simeon
Meglio continuare qua....



Sto pensando di utilizzare un albero binario di ricerca con come chiavi le coordinate x e y e il valore come dato satellite... e' una buona idea? Non son sicuro se vada bene binario e nemmeno se utilizzare le coordinate come chiave...

E poi non ho capito questo: la funzione "valore (x,y,n)" va a porre a n il valore di un punto... questo punto si da per scontato che sia gia presente nel piano? Se non lo fosse andrebbe aggiunto all'interno dell'albero...


La funzione v x y n pone a n il valore del punto.
Quindi devi inserire nell'albero il punto il cui valore è stato modificato.
Io ho usato un albero binario di ricerca per memorizzare i punti, le coordinate le usavo come chiave, il valore è un dato satellite.
Se non trovi un punto nell'albero significa che ha un valore "predefinito" (quello che hai inserito usando il comando "c n".
Devi usare per forza le coordinate come chiave; (oltretutto un punto è determinato univocamente dalle sue coordinate.... quale migliore chiave è possibile????)

__________________
Maurizio Lombardi
Linux 2.6.14.2
-----------------------


Posted by Simeon on 08-02-2006 18:49:

Originally posted by MaurizioL
La funzione v x y n pone a n il valore del punto.
Quindi devi inserire nell'albero il punto il cui valore è stato modificato.
Io ho usato un albero binario di ricerca per memorizzare i punti, le coordinate le usavo come chiave, il valore è un dato satellite.
Se non trovi un punto nell'albero significa che ha un valore "predefinito" (quello che hai inserito usando il comando "c n".
Devi usare per forza le coordinate come chiave; (oltretutto un punto è determinato univocamente dalle sue coordinate.... quale migliore chiave è possibile????)


Ok, grazie anche a te :) In effetti come chiave si devono usare le coordinate per forza...


Posted by Diuzza on 08-02-2006 19:17:

Ricominciamo dal principio se non vi spiace

Ricevo con c m n nome i valori di ciascun punto del piano.

Ciascun punto lo metto in un albero di ricerca. Il primo punto andrà come radice, il secondo come figlio destro o sinistro a seconda della chiave data dalle sue coordinate così la ricerca avrà costo log n se n è il numero dei punti.
Ci sono?
Se poi devo modificare il valore di un punto lo ricerco attraverso l'albero.

M come fa a non essere dunque presente nel piano? Li ho inseriti tutti i punti con crea


Posted by tyzer on 08-02-2006 20:13:

Guarda che NON devi assolutamente memorizzare TUTTI i punti possibili ma SOLO i punti che vengono settati esplicitamente. Tutti gli altri hanno un valore predefinito... qundi se il punto che cerchi non è nella lista (albero, hash table ...) allora sai già quanto vale.


Domanda per Ornati: nel progetto Mappe2 si dice che con la funzione crea(m,n,nome) bisogna assegnare ad ogni punto del piano i valori come prescritto nella nota 3. Non capisco allora quello che avevi detto prima...i punti devo memorizzarli per forza...
Il Piano lo si deve rappresentare con un albero di ricerca binaria?
Oppure un albero red-black? (che è assai più incasinato credo...)

Altra domanda: le mappe in che struttura si mettono? Cioè mi spiego, una mappa la implementerei così:
code:
struct Mappa{ char *nome; Punto origine; char *specifica; } //Punto lo definirei così piu o meno struct Punto{ int x; int y; int val; }


Ora la domanda è questa...quando continuo a creare mappe, dove le emtto? Creaiamo una lista di mappe? Oppure un albero di ricerca binaria di mappe (magari ordianto per nome della mappa...)?
Spero di aver spiegato la domanda in modo chiaro, se no mandatemi insulti :)

Grazie a tutti quelli che collaborano...

P.S.

.yomo. tu sei quello di Piacenza?


Posted by Simeon on 08-02-2006 20:15:

Originally posted by Diuzza
Ricominciamo dal principio se non vi spiace

Ricevo con c m n nome i valori di ciascun punto del piano.

Ciascun punto lo metto in un albero di ricerca. Il primo punto andrà come radice, il secondo come figlio destro o sinistro a seconda della chiave data dalle sue coordinate così la ricerca avrà costo log n se n è il numero dei punti.
Ci sono?
Se poi devo modificare il valore di un punto lo ricerco attraverso l'albero.


La penso come te, fino a questo punto.


M come fa a non essere dunque presente nel piano? Li ho inseriti tutti i punti con crea


Ma il piano ipotetico e' infinito, quando usi "crea" inserisci solo alcuni punti; le coordinate e valori di questi punti ti vengono forniti dal file che dai in input con crea(m,n,nome) secondo le specifiche della nota 3.

O no ? :look: (sto diventando insicuro persino ad inizializzare le variabili)


Posted by ornati on 08-02-2006 21:16:

Originally posted by tyzer
Domanda per Ornati: nel progetto Mappe2 si dice che con la funzione crea(m,n,nome) bisogna assegnare ad ogni punto del piano i valori come prescritto nella nota 3. Non capisco allora quello che avevi detto prima...i punti devo memorizzarli per forza...
Il Piano lo si deve rappresentare con un albero di ricerca binaria?
Oppure un albero red-black? (che è assai più incasinato credo...)

Altra domanda: le mappe in che struttura si mettono? Cioè mi spiego, una mappa la implementerei così:
code:
struct Mappa{ char *nome; Punto origine; char *specifica; } //Punto lo definirei così piu o meno struct Punto{ int x; int y; int val; }


Ora la domanda è questa...quando continuo a creare mappe, dove le emtto? Creaiamo una lista di mappe? Oppure un albero di ricerca binaria di mappe (magari ordianto per nome della mappa...)?
Spero di aver spiegato la domanda in modo chiaro, se no mandatemi insulti :)

Grazie a tutti quelli che collaborano...

P.S.

.yomo. tu sei quello di Piacenza?



Oh, che casino!

Ma non fai prima a scaricare il mio progetto "Mappe" (sezione Filez) e vedere come sono implementate le cose che mi chiedi? Tanto questa parte è IDENTICA a quella del vecchio progetto...

PS: sto seramente pensando di implementare Mappe2 e venderlo al miglior offerente :)


Posted by Simeon on 08-02-2006 21:22:

Originally posted by ornati

PS: sto seramente pensando di implementare Mappe2 e venderlo al miglior offerente :)


Nessun sano di mente te lo comprerebbe :asd:

Presentarsi a Fiorentini con quel codice li, magari senza averci capito niente... non conviene. Meglio capire e fare da soli.

Comunque la nota 3 è abbastanza ostica da interpretare, mon riesco a capire cosa bisogna ricavare dai valori nei file primo.txt etc.

Nel "secondo.txt" ad esempio c'e' un unico valore, che è -1.

Che ci ricavo di bello ?

Forse bisogna davvero scorrere i punti da 1,1 a m,n e assegnare i valori se l'indice risultante rientra da 1 a mn... Vabbè per oggi chiudo che son stanco di scrivere fregnacce :asd:


Posted by Diuzza on 09-02-2006 07:19:

Io cmq avevo capito che il piano era di dimensione m*n non infinito... mah adesso lo riguardo


Posted by ornati on 09-02-2006 07:57:

Originally posted by Diuzza
Io cmq avevo capito che il piano era di dimensione m*n non infinito... mah adesso lo riguardo


In effetti ho fatto un po' di confusione... parlavo del nuovo progetto pensando a quella vecchio ;)

Cmq adesso ho letto meglio il testo e il piano è sempre "infinito".

Per quanto riguarda i valori dei punti, la relazione:
"Se a = x mod m e b = y mod n allora V al(x, y) = v[a+mb] ."

ti dice il valore di ogni punto del piano a meno che non sia stato "sovrascritto" da un comando "valore (x,y,val)".

Quindi il tutto si può implementare così:

1) i valori dei punti settati esplicitamente (con "v x y val") sono memorizzati in una apposita struttura (albero, albero bilanciato, hash table, lista... quello che preferite)

2) se serve il valore di un punto che non è stato settato esplicitamente, e quindi non si trova nella struttura, lo si ricava mediante la relazione di prima.


Ovvero:
valore = ArrayValori[ modulo(x,M) + M * modulo(y, N) ];


Facile, no?


Posted by Nosferatu on 09-02-2006 10:19:

Qualcuno mi sa dire come memorizzare una stringa di lunghezza arbitraria (ad esempio la specifica) senza usare un vettori di char di dimensioni esagerate.


Posted by MaurizioL on 09-02-2006 10:28:

Originally posted by Nosferatu
Qualcuno mi sa dire come memorizzare una stringa di lunghezza arbitraria (ad esempio la specifica) senza usare un vettori di char di dimensioni esagerate.


C'è una funzione apposta chiamata realloc;

if usi linux:
man realloc (per leggere la guida)

else if usi windows{
cerca su internet || scarica il progetto di ornati e guarda lì
}

else{
Usa il mio codice:

char* get_string(char end){
char input;
int len=0;
int mem=100;
char *string=(char*)malloc(mem*sizeof(char));
while((input=getchar())!=end){
if(len>mem-1){
mem*=2;
string=(char*)realloc(string,mem);
}
string[len++]=input;
}
string[len]=0x0;
return string;
}

}

__________________
Maurizio Lombardi
Linux 2.6.14.2
-----------------------


Posted by Diuzza on 09-02-2006 10:30:

Per la specifica io pensavo di usare semplicemente una lista perchè non devi ricercare una lettera o cose simili, devi semplicemente scorrerla, quindi che problema c'è? Ci impiegheresti o(n) cmq perchè devi leggere ogni singolo carattere


Posted by Diuzza on 09-02-2006 10:37:

Originally posted by ornati
In effetti ho fatto un po' di confusione... parlavo del nuovo progetto pensando a quella vecchio ;)

Cmq adesso ho letto meglio il testo e il piano è sempre "infinito".

Per quanto riguarda i valori dei punti, la relazione:
"Se a = x mod m e b = y mod n allora V al(x, y) = v[a+mb] ."

ti dice il valore di ogni punto del piano a meno che non sia stato "sovrascritto" da un comando "valore (x,y,val)".

Quindi il tutto si può implementare così:

1) i valori dei punti settati esplicitamente (con "v x y val") sono memorizzati in una apposita struttura (albero, albero bilanciato, hash table, lista... quello che preferite)

2) se serve il valore di un punto che non è stato settato esplicitamente, e quindi non si trova nella struttura, lo si ricava mediante la relazione di prima.


Ovvero:
valore = ArrayValori[ modulo(x,M) + M * modulo(y, N) ];


Facile, no?



Io pensavo di implementarlo così.
I valori li metto in un albero rb. (non i punti, badate, ma i valori)
Dopodichè quando mi passa le coordinate di un punto e mi serve il suo valore mi faccio il calcolino e lo cerco nell'albero.
In caso si ripresentassero più volte gli stessi punti e non voglio ricercare il valore nell'albero si potrebbero mettere in un hash table. Quindi, se mi viene dato un punto di cui voglio sapere il valore, prima guardo se è presente nell'hash table, se non c'è cerco nell'albero rb.
Potrebbe funzionare?


Posted by MaurizioL on 09-02-2006 10:39:

Originally posted by Diuzza
Per la specifica io pensavo di usare semplicemente una lista perchè non devi ricercare una lettera o cose simili, devi semplicemente scorrerla, quindi che problema c'è? Ci impiegheresti o(n) cmq perchè devi leggere ogni singolo carattere


Se tu rappresenti la specifica con una lista ogni nuovo carattere deve essere inserito in coda....
Quindi o ci impieghi O(n^2) per compiere O(n) operazioni di inserimento oppure utilizzi una variabile globale che punta alla fine della lista, ma le variabili globali non sono consentite!

__________________
Maurizio Lombardi
Linux 2.6.14.2
-----------------------


Posted by ornati on 09-02-2006 10:52:

Originally posted by Diuzza
Io pensavo di implementarlo così.
I valori li metto in un albero rb. (non i punti, badate, ma i valori)
Dopodichè quando mi passa le coordinate di un punto e mi serve il suo valore mi faccio il calcolino e lo cerco nell'albero.
In caso si ripresentassero più volte gli stessi punti e non voglio ricercare il valore nell'albero si potrebbero mettere in un hash table. Quindi, se mi viene dato un punto di cui voglio sapere il valore, prima guardo se è presente nell'hash table, se non c'è cerco nell'albero rb.
Potrebbe funzionare?


Non capisco tutta questa complessità...

In altre parole: se usi la hash table non ti serve il Red-Black e vice versa.

Inoltre se usi il Red-Black (o un qualsiasi albero di ricerca) devi memorizzare in ogni nodo 2 cose:
1) la chiave (che è costituita dalle 2 coordinate x, y)
2) il valore corrispondente

Per quanto riguarda i punti non settati con "v x y val" non capisco perchè vuoi usare le liste... fai semplicemente così:

code:
int *ArrayValory = malloc(sizeof(int) * M * N); for (i=0; i < M*N; i++) { fscanf(file_input, "%d", &ArrayValori[i]); }


e poi recuperi il valore associato ad un punto (x,y) con l'espressione:

code:
valore = ArrayValori[ modulo(x,M) + M * modulo(y, N) ];


Posted by Nosferatu on 09-02-2006 11:01:

Grazie dell'info MaurizioL


Posted by Simeon on 09-02-2006 11:04:

Ragazzi, sto andando nel pallone piu completo, naturalmente parlo della nota 3.

Voglio dire, io apro il mio file primo.txt e ho la mia bella lista di valori "-1 -3 2 -2 2 1 0 2 -2 3 2 -1 0 -2 1 -2"

E dico : a = x mod m e b = y mod n. Val (x,y) = v[a+mb]... Non riesco a capire quali valori dare a (x,y), forse tutti i punti da (0,0) a (m,n) ?

Se qualcuno fa un esempio pratico lo ringrazio dal profondo del cuore.

Nel "secondo.txt" per esempio c'e' un solo valore: -1. Quindi abbiamo un solo punto. Nella mia testa io porrei x,y=(1,1), che sarebbe l'unico punto possibile. Quindi uno fa a = 1 mod -1 e b = 1 mod -1, e il valore si trova a v[a+mb] cioe v[0]. Quindi val(1,1) = -1.


Posted by Polsy on 09-02-2006 11:12:

Originally posted by MaurizioL
C'è una funzione apposta chiamata realloc;

if usi linux:
man realloc (per leggere la guida)

else if usi windows{
cerca su internet || scarica il progetto di ornati e guarda lì
}

else{
Usa il mio codice:

char* get_string(char end){
char input;
int len=0;
int mem=100;
char *string=(char*)malloc(mem*sizeof(char));
while((input=getchar())!=end){
if(len>mem-1){
mem*=2;
string=(char*)realloc(string,mem);
}
string[len++]=input;
}
string[len]=0x0;
return string;
}

}


quanto sei nerd :asd:


Posted by MaurizioL on 09-02-2006 11:16:

Originally posted by Polsy
quanto sei nerd :asd:


Io nerd?

Leggi i sorgenti di Ornati e poi mi dici

http://www.dsy.it/forum/showthread....&threadid=24001

:-D

__________________
Maurizio Lombardi
Linux 2.6.14.2
-----------------------


Posted by Nosferatu on 09-02-2006 11:19:

Una cosa ma il carattere end che gli passi come parametro, che carattere è


Posted by Simeon on 09-02-2006 11:20:

Che poi scusate, quando si memorizzano i punti (coordinate, valori) nella nostra struttura, mi sembra abbia piu senso ordinarli per valore... Per fare poi le varie operazioni per ricavare i sottopercorsi migliori...

Ce la faccio piu.


Posted by MaurizioL on 09-02-2006 11:24:

Originally posted by Nosferatu
Una cosa ma il carattere end che gli passi come parametro, che carattere è


Non sò cme è fatto il vostro progetto;

Nel nostro c'era il comando di inserimento delle mappe:

m nome x y specifica

per leggere la stringa nome end deve essere uguale a spazio
(leggo tutti i caratteri che compongono il nome fino allo spazio)
per leggere la specifica end deve essere uguale a '\n'.

__________________
Maurizio Lombardi
Linux 2.6.14.2
-----------------------


Posted by ornati on 09-02-2006 11:29:

Originally posted by MaurizioL
Io nerd?

Leggi i sorgenti di Ornati e poi mi dici

http://www.dsy.it/forum/showthread....&threadid=24001

:-D


No, no... io non programmo mai a basso livello:

http://ornati.altervista.org/

;)


Posted by Polsy on 09-02-2006 12:31:

Originally posted by ornati
No, no... io non programmo mai a basso livello:

http://ornati.altervista.org/

;)


si ma quanto te la meni :D


Posted by Simeon on 09-02-2006 13:16:

A uso e consumo di tutti, riguardo la nota 3, ecco cosa mi ha risposto il prof Fiorentini:

_______________
La regola le serve per determinare il valore di un generico punto (X,Y).

Esempio:


Se m=3 e n=2 e il file contiene i valori

0 1 2 3 4 5

allora:

Val(0,0) = Val(3,0) = Val(6,0) = Val(-3,0) = Val(-6,0) = ..... = 0
Val(1,0) = Val(4,0) = Val(7,0) = Val(-2,0) = Val(-5,0) = ..... = 1

Val(0,1) = Val(3,1) = Val(5,1) = Val(-3,1) = Val(-6,1) = ..... = 3



E' come se ricoprisse il piano con tanti rettangoli adiacenti
della forma

3 4 5
0 1 2

ottenendo

...............
..3 4 5 3 4 5..
..0 1 2 0 1 2..
..3 4 5 3 4 5..
..0 1 2 0 1 2..
...............


Posted by ornati on 09-02-2006 13:24:

Originally posted by Polsy
si ma quanto te la meni :D


Suvvia... stavo solo facendo pubblicità ad un mio INUTILE progetto.

:)

Tanto per restare in OT: ho visto che anche tu devi fare l'orale di FRO... quindi ci si vede lunedì (a parte che non so chi sei...).


Posted by ornati on 09-02-2006 13:28:

Originally posted by Simeon
_______________
E' come se ricoprisse il piano con tanti rettangoli adiacenti
della forma
............... [/B]


E` proprio per questo che non devi memorizzare niente (a parte un array con i valori che leggi dal file).


Posted by Diuzza on 09-02-2006 15:52:

Mi chiedevo.
In crea il nome del file ha lunghezza che fisso io o può essere lungo quanto vuole. Perchè avrei dei problemini nella lettura del file. Nel senso che se non ho una lunghezza fissata non so che dimensione deve avere l'arrey che contiene la stringa


Posted by MaurizioL on 09-02-2006 15:55:

Originally posted by Diuzza
Mi chiedevo.
In crea il nome del file ha lunghezza che fisso io o può essere lungo quanto vuole. Perchè avrei dei problemini nella lettura del file. Nel senso che se non ho una lunghezza fissata non so che dimensione deve avere l'arrey che contiene la stringa


C'è realloc apposta; l'ho scritto prima.
Riadatta il codice alle tue esigenze.

__________________
Maurizio Lombardi
Linux 2.6.14.2
-----------------------


Posted by Diuzza on 09-02-2006 16:00:

Originally posted by MaurizioL
Se tu rappresenti la specifica con una lista ogni nuovo carattere deve essere inserito in coda....
Quindi o ci impieghi O(n^2) per compiere O(n) operazioni di inserimento oppure utilizzi una variabile globale che punta alla fine della lista, ma le variabili globali non sono consentite!




typedef struct nodolista{
char spec;
struct nodolista* next;
}nodo

typedef struct lista{
nodo* inizio;
nodo* fine;
}lista

typedef struct mappa{
lista* specifica;
int x,y;
char * nome;
}
no?


Posted by Diuzza on 09-02-2006 16:04:

Ho visto il codice di prima ma creo un array char nome[100] per magari inserire solo 4 caratteri.


Posted by MaurizioL on 09-02-2006 16:06:

Originally posted by Diuzza
typedef struct nodolista{
char spec;
struct nodolista* next;
}nodo

typedef struct lista{
nodo* inizio;
nodo* fine;
}lista

typedef struct mappa{
lista* specifica;
int x,y;
char * nome;
}
no?


Sì, per funzionare funziona, ma non vedo perchè usare due strutture per rappresentare un vettore di char.
Comunque se a te piace...

Secondo me faresti meglio a concentrarti su altri problemi (tipo come memorizzare le mappe in modo efficiente).

__________________
Maurizio Lombardi
Linux 2.6.14.2
-----------------------


Posted by Simeon on 09-02-2006 16:23:

Originally posted by Diuzza
Ho visto il codice di prima ma creo un array char nome[100] per magari inserire solo 4 caratteri.


Io ho fatto una realloc per ogni singolo carattere, forse ho esagerato :asd:, ma per stringhe corte va piu che bene.

Basta adattare i "salti" a seconda delle situazioni...

Edit : in effetti manco io capisco perche usare delle strutture per memorizzare le specifiche


Posted by MaurizioL on 09-02-2006 17:03:

Originally posted by Diuzza
Ho visto il codice di prima ma creo un array char nome[100] per magari inserire solo 4 caratteri.


Puoi mettere quanto vuoi, io ho messo 100 solo perchè avevo fatto qualche prova;
20 dovrebbero essere sufficienti.

__________________
Maurizio Lombardi
Linux 2.6.14.2
-----------------------


Posted by Simeon on 09-02-2006 17:17:

Ragazzi io userei un albero di ricerca binario anche per memorizzare le mappe... con tutte le operazioni di ricerca che vengono richieste mi pare adatto.

Ordinandole lessicograficamente per il nome.


Posted by ornati on 09-02-2006 17:42:

Originally posted by Diuzza
Mi chiedevo.
In crea il nome del file ha lunghezza che fisso io o può essere lungo quanto vuole. Perchè avrei dei problemini nella lettura del file. Nel senso che se non ho una lunghezza fissata non so che dimensione deve avere l'arrey che contiene la stringa


Il problema è sempre lo stesso (= a quello di memorizzare una specifica). La soluzione è:

1) usare un puntatore ad un'area di memoria allocata dinamicamente
2) usare malloc/realloc per allocare/espandere

Ecco un piccolo programma dimostrativo:

code:
#include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> char *read_token(FILE *f) { char *buf; int size = 16; int len = 0; int c; buf = malloc(size); while ((c=getc(f)) != EOF) { if (!isalnum(c)) { if (len == 0) continue; break; } if (len+1 >= size) { size <<= 1; /* size = size * 2 */ buf = realloc(buf, size); } buf[len++] = c; } buf[len++] = '\0'; buf = realloc(buf, len); return buf; } int main(void) { char *x; int run = 1; while (run) { x = read_token(stdin); printf("letto token <%s>\n", x); if (strcmp("end", x) == 0) run = 0; free(x); }; return 0; }


Posted by Diuzza on 09-02-2006 17:44:

Ho già risolto. Ma sarò gnucca ma ho un altro problema.

Possibile che quando cerco di accedere ad un file il mio sistema mi dice che si è verificato un errore, potrebbe esserci la perdita dei dati su cui sto lavorando... ?


Posted by ornati on 09-02-2006 17:52:

Originally posted by Diuzza
Ho già risolto. Ma sarò gnucca ma ho un altro problema.

Possibile che quando cerco di accedere ad un file il mio sistema mi dice che si è verificato un errore, potrebbe esserci la perdita dei dati su cui sto lavorando... ?


Strano... non mi è mai successa una cosa simile...
prova a postare il codice che ti dà problemi.


Posted by Ari_85 on 09-02-2006 17:57:

Se creiamo un albero per le mappe e un albero per i punti dovremo creare due alberi separati nel senso che dovremo scrivere due volte il codice perchè ad es la f inserisci del primo albero è diversa da quella del secondo perchè lavorano su nodi diversi..Certo, ci si guadagna in tempo di calcolo...
Ciao Lomba!

__________________
Good wombs hath borne bad sons


Posted by ornati on 09-02-2006 18:05:

Originally posted by Ari_85
Se creiamo un albero per le mappe e un albero per i punti dovremo creare due alberi separati nel senso che dovremo scrivere due volte il codice perchè ad es la f inserisci del primo albero è diversa da quella del secondo perchè lavorano su nodi diversi..Certo, ci si guadagna in tempo di calcolo...
Ciao Lomba!


Non è detto... guarda per esempio la mia Hash_Table, c'è una sola implementazione e viene usata per inserire cose diverse (perchè usa internamente puntatori "void*").

L'unico problema dei puntatori "void*" è che perdi il controllo sui tipi dato dal compilatore.


Posted by Diuzza on 09-02-2006 18:25:

ho un char* nome

faccio
int c;
FILE * valpunti;
valpunti=fopen(nome, "r");
fscanf(valpunti,"%d",&c);


magari ho fatto io qualche s....


Posted by ornati on 09-02-2006 19:05:

Originally posted by Diuzza
ho un char* nome

faccio
int c;
FILE * valpunti;
valpunti=fopen(nome, "r");
fscanf(valpunti,"%d",&c);


magari ho fatto io qualche s....


Sembra corretto.

Prova a mettere un controllo sulla "fopen":

code:
valpunti = fopen(nome, "r"); if (valpunti == NULL) { printf("Errore: impossibile aprire '%s'\n", nome); exit(1); }


Posted by Dav83 on 10-02-2006 00:15:

in alternativa si può usare la 'fread' che legge parte del file(indicato dai parametri)...http://www.cplusplus.com/ref/cstdio/fread.html

__________________
Ciao miao bau


Posted by Dav83 on 10-02-2006 00:15:

in alternativa si può usare la 'fread' che legge parte del file(indicato dai parametri)...http://www.cplusplus.com/ref/cstdio/fread.html

__________________
Ciao miao bau


Posted by ornati on 10-02-2006 07:23:

Originally posted by Dav83
in alternativa si può usare la 'fread' che legge parte del file(indicato dai parametri)...http://www.cplusplus.com/ref/cstdio/fread.html


In alternativa a cosa?


Posted by Diuzza on 10-02-2006 09:06:

No mi va fino alla fopen perchè ho messo un fprint dopo e stampa quindi lì' ci arriva..
non mi va la fscanf. moh


Posted by Diuzza on 10-02-2006 09:09:

il fatto è che la fopen mi sembra che vada anche se il file che gli passo come parametro non esiste. Non è che nn mi trova il file anche se il nome è corretto. Il file l'ho messo nella stessa directory del programmino che ho fatto, giusto?


Posted by Simeon on 10-02-2006 10:34:

Originally posted by Diuzza
il fatto è che la fopen mi sembra che vada anche se il file che gli passo come parametro non esiste. Non è che nn mi trova il file anche se il nome è corretto. Il file l'ho messo nella stessa directory del programmino che ho fatto, giusto?


Magari sarò scontato ma... hai provato a verificare se il nome del file preso in input è corretto?


Posted by ornati on 10-02-2006 10:40:

Originally posted by Diuzza
il fatto è che la fopen mi sembra che vada anche se il file che gli passo come parametro non esiste. Non è che nn mi trova il file anche se il nome è corretto. Il file l'ho messo nella stessa directory del programmino che ho fatto, giusto?


è esattamento il motivo per cui ti ho detto di mettere il controllo. Se la fopen fallisce restituisce NULL... bisogna sempre mettere un controllo, così se è quello il problema si capisce.

Se vuoi mettere un controllo veloce veloce puoi usare anche "assert()":

code:
#include <assert.h> ... file = fopen(nome ,"r"); assert (file != NULL);


in questo modo se la fopen fallisce il programma termina dando un messaggio di errore significativo.

Ad ogni modo il file da aprire lo devi mettere nella diretory di lavoro (o corrente, chiamala come vuoi), quella da cui lanci il programma e non quella dove si trova il suo eseguibile.


Posted by ornati on 10-02-2006 10:53:

Originally posted by Diuzza
il fatto è che la fopen mi sembra che vada anche se il file che gli passo come parametro non esiste. Non è che nn mi trova il file anche se il nome è corretto. Il file l'ho messo nella stessa directory del programmino che ho fatto, giusto?


forse ho capito... stai confondendo il C con Java ;)

Se la fopen fallisce NON viene terminato il programma, NON viene sollevata un'eccezione (non esistono in C) ...

L'unica cosa che succede è che viene restituito NULL. Se poi tu non controlli e chiami "fscanf" & company passandogli questo puntatore NULL allora vai in cerca di guai...


Posted by Simeon on 10-02-2006 13:12:

Ok, per quanto mi riguarda sono a posto con tutte le operazioni che riguardano le mappe (inserimento eliminazione ricerca blablabla), almeno concettualmente dato che il codice lo devo ancora scrivere.

Stavo pensando alla funzione per calcolare il percorso ottimale... ma bisogna analizzare TUTTE le possibili permutazioni di lunghezza minima da (x,y) a (w,z)? Mi sembra parecchio strano ed inefficiente. Sto ancora cercando di capire come ragionare, forse alla fine si puo' risolvere il tutto utilizzando i grafi.

Boh se qualcuno ci sta pensando dica la sua :)

EDIT : mmm forse bisogna partire dal fondo...

EDIT2 : programmazione dinamica ? :look:


Posted by GiaXVI on 10-02-2006 14:20:

qualcuno che ci capisce qualcosa di questo progetto?


Posted by maynard80 on 10-02-2006 14:58:

dunque allora sono contento che la nota 3 sia ormai chiara (il file contiene semplicemente nxm dati utilizzati per riempire il piano), i punti del piano esistono chiaramente solo nella nostra testa e si concreatizzano solo se fanno parte di una (o più) mappe, se poi cambiamo valore ad un punto agiamo manualmente sul dato che esplica il valore del punto che precedentemente era stato calcolato automaticamente tramite la formulina della nota 3.

ora ci troviamo quindi con delle mappe che hanno un nome, un punto di partenza e un percorso definito dalla specifica, le mappe sono selezionate tramite il nome quindi definire una struttura unica per contenere tutti i punti è una cacchiata, meglio una struttura come insieme di mappe, e ogni mappa una struttura contenente tutti i punti della specifica.. ora è meglio creare tutti i punti di ogni mappa oppure mantenere semplicemente il punto di partenza e lavorare con le specifiche? in teoria ogni mappa è un grafo che può contenere cicli e dove ogni punto può prendere 4 direzioni, ottimizzarlo vuol dire prima di tutto eliminare i cicli, quindi quale struttura può fare al caso nostro?

__________________
msn Messenger: giamma80 at tiscali.it
ATHENA !


Posted by Simeon on 10-02-2006 15:04:

Originally posted by maynard80
... quindi quale struttura può fare al caso nostro?


Come dicevo prima... un grafo? Inteso proprio come struttura. Non ho idea di come si implementi però, mi affido al Cormen :asd:


Posted by am445733 on 10-02-2006 16:37:

Scusate: ma qualcuno mi può spiegare come si riece ad associare ad un punto un Val negativo se: Val(x,y)=V(a+mb) ed i resti di a e b (come da definizione) non sono mai negativi?...qualcosa non torna!


Posted by Simeon on 10-02-2006 16:40:

Originally posted by am445733
Scusate: ma qualcuno mi può spiegare come si riece ad associare ad un punto un Val negativo se: Val(x,y)=V(a+mb) ed i resti di a e b (come da definizione) non sono mai negativi?...qualcosa non torna!


Guarda che a+mb e' l'indice del valore (che dev'essere >=0).


Posted by Ari_85 on 10-02-2006 17:47:

Originally posted by ornati
Non è detto... guarda per esempio la mia Hash_Table, c'è una sola implementazione e viene usata per inserire cose diverse (perchè usa internamente puntatori "void*").

L'unico problema dei puntatori "void*" è che perdi il controllo sui tipi dato dal compilatore.


Già ma metti che creo una funzione che cerca un nodo all'interno di un albero. Per farlo dovrei accedere anche ai campi della struttura di cui sono composti i nodi. Se perdo il controllo sui tipi di dato posso fare ad es. ele->nome dove ele è il puntatore void a cui è stato associato un nodo? o forse dovrei vedere come la strutture viene fisicamente memorizzata e aggiungere al puntatore tot byte? In questo modo potrei risolvere il problema dei campi

__________________
Good wombs hath borne bad sons


Posted by marcomaria on 10-02-2006 17:49:

[QUOTE]Originally posted by Simeon
Stavo pensando alla funzione per calcolare il percorso ottimale... ma bisogna analizzare TUTTE le possibili permutazioni di lunghezza minima da (x,y) a (w,z)? Mi sembra parecchio strano ed inefficiente. Sto ancora cercando di capire come ragionare, forse alla fine si puo' risolvere il tutto utilizzando i grafi.
QUOTE]
...stavo pensando a Dijkstra per il cammino minimo con pesi per i valori dei punti....idea allo stato embrionale...da approfondire nel w-e
E' stato visto a lezione?


Posted by ornati on 10-02-2006 17:52:

Originally posted by Ari_85
Già ma metti che creo una funzione che cerca un nodo all'interno di un albero. Per farlo dovrei accedere anche ai campi della struttura di cui sono composti i nodi. Se perdo il controllo sui tipi di dato posso fare ad es. ele->nome dove ele è il puntatore void a cui è stato associato un nodo? o forse dovrei vedere come la strutture viene fisicamente memorizzata e aggiungere al puntatore tot byte? In questo modo potrei risolvere il problema dei campi


In C puoi fare un po' tutto.

Ovviamente NON puoi usare "ele->nome_campo" se "ele" è di tipo "void*", proprio perchè il compilatore non sa a cosa punta...

Puoi invece fare un cast: "((struct mia_struttura*)ele)->nome".

Oppure:
code:
struct mia_struttura *m = ele; m->nome = ...


Posted by Simeon on 10-02-2006 17:57:

Originally posted by marcomaria

...stavo pensando a Dijkstra per il cammino minimo con pesi per i valori dei punti....idea allo stato embrionale...da approfondire nel w-e
E' stato visto a lezione?


Si è stato visto una delle ultime lezioni... ci stavo pensando pure io visto che è nominato spesso anche nei thread dei progetti passati.

Cmq ho ancora un casino di dubbi sulla gestione dei valori dei punti e delle mappe. Ora ho infatti implementato solo la struttura per memorizzare le mappe ed alcune funzioni sono incomplete (dato che la stampa richiede che venga stampato anche il valore della mappa)


Posted by lfn on 10-02-2006 19:48:

scusate la domanda idiota, ma se dichiaro un array extern inizializzato come
int = array[] il compilatore mi segnala "array assumed to have one element"
cioè è come se lo inizializzassi con un solo valore in questo modo?? (calcolate poi in un'altra funzione il valore viene modificato )
perchè non vorrei ke poi mi desse qualche errore successivamente,
ovviamente come variabile esterna non posso ankora fornigli un valore xkè questo mi deriva da un'altra funzione..
lo sclero da progettino sta prendendo il sopravvento..
lfn :cool:

__________________
an arrow from the sun


Posted by YoMo on 10-02-2006 19:52:

Secondo me dei cicli te ne fotti (se no il nostro progetto include anche quello di gennaio?!?!?), data una mappa e la relativa specifica devi ricavare due cose: origine e destinazione. Questo è ciò che ti basta per calcolarti la riduzione.
Per quanto riguarda i grafi, tra src e dst si potrebbe costruire un grafo e poi utilizzare un algoritmo per trovare i cammini minimi, ma a questo punto sorge un problema: nel progetto sono i PUNTI che hanno un valore, non gli ARCHI. Soluzione: ad es. valore[arco(u,v)] = valore[punto(v)]. Altro problema: ATTENZIONE, l'algoritmo di Dijkstra non è utilizzabile in quanto calcola il cammino minimo in un grafo nel caso in cui tutti i pesi degli archi siano positivi. Nel progetto (secondo la notazione di prima) un arco può avere valori negativi. Soluzione: sul Cormen due pagine dopo Dijkstra c'è l'algoritmo di Bellman-Ford che fa al caso nostro, ma cavolo, tra pseudocodice e C ci passa un mare!!!!
Cmq se volete qualche implementazione dei grafi guardatevi l'ultima lezione di Aguzzoli, proprio le ultime slide, altrimenti provate su http://www.algoteam.dsi.unimi.it/

Originally posted by maynard80
dunque allora sono contento che la nota 3 sia ormai chiara (il file contiene semplicemente nxm dati utilizzati per riempire il piano), i punti del piano esistono chiaramente solo nella nostra testa e si concreatizzano solo se fanno parte di una (o più) mappe, se poi cambiamo valore ad un punto agiamo manualmente sul dato che esplica il valore del punto che precedentemente era stato calcolato automaticamente tramite la formulina della nota 3.

ora ci troviamo quindi con delle mappe che hanno un nome, un punto di partenza e un percorso definito dalla specifica, le mappe sono selezionate tramite il nome quindi definire una struttura unica per contenere tutti i punti è una cacchiata, meglio una struttura come insieme di mappe, e ogni mappa una struttura contenente tutti i punti della specifica.. ora è meglio creare tutti i punti di ogni mappa oppure mantenere semplicemente il punto di partenza e lavorare con le specifiche? in teoria ogni mappa è un grafo che può contenere cicli e dove ogni punto può prendere 4 direzioni, ottimizzarlo vuol dire prima di tutto eliminare i cicli, quindi quale struttura può fare al caso nostro?


Posted by lfn on 10-02-2006 20:39:

niente lasciate stare ho risolto, non fate caso a quello che ho scritto T_T sono proprio fusa
lfn :cool:

__________________
an arrow from the sun


Posted by ornati on 11-02-2006 12:54:

Originally posted by YoMo
[B]Secondo me dei cicli te ne fotti (se no il nostro progetto include anche quello di gennaio?!?!?), data una mappa e la relativa specifica devi ricavare due cose: origine e destinazione. Questo è ciò che ti basta per calcolarti la riduzione.
Per quanto riguarda i grafi, tra src e dst si potrebbe costruire un grafo e poi utilizzare un algoritmo per trovare i cammini minimi, ma a questo punto sorge un problema: nel progetto sono i PUNTI che hanno un valore, non gli ARCHI. Soluzione: ad es. valore[arco(u,v)] = valore[punto(v)].


Non credo che ci sia bisogno di scomodare i grafi.

Per la riduzione, usando la programmazione dinamica, si può fare in tempo O(dx * dy). Dove dx = |src.x - dst.x| e dy = |src.y - dst.y|.

Non penso che si possa fare di meglio... nel caso generico. Poi magari si può velocizzare nel caso medio con qualche euristica, boh!


Posted by Nosferatu on 12-02-2006 09:31:

Sarà una stupidata ma io non riesco proprio a permettere la lettura sulla stessa linea di interi e di stringhe, come ad esempio nel comando m qualcuno può aiutarmi?


Posted by Diuzza on 12-02-2006 10:55:

Chissà come mai oggi ho riprovato a leggere il file s funzia.... mah


Posted by Diuzza on 12-02-2006 10:58:

prima fai un getchat e leggi il carattere che identificherebbe l'istruzione. Poi usi uno switch per riconoscere l'istruzione ed eseguire le relative operazioni. Dopodichè (in caso di c), gai un fscanf per leggere i valori o quel che sono.
E' questo che intendevi? o ho capito male?


Originally posted by Nosferatu
Sarà una stupidata ma io non riesco proprio a permettere la lettura sulla stessa linea di interi e di stringhe, come ad esempio nel comando m qualcuno può aiutarmi?


Posted by Nosferatu on 12-02-2006 11:01:

I miei problemi sono nel caso del comando m, quando devi permettere prima di inserire una stringa di lunghezza arbitraria, poi 2 interi e poi ancora una stringa


Posted by Polsy on 12-02-2006 11:55:

Originally posted by Nosferatu
I miei problemi sono nel caso del comando m, quando devi permettere prima di inserire una stringa di lunghezza arbitraria, poi 2 interi e poi ancora una stringa

scaricati qualche progetto vecchio dall'area filez, in tutti a un certo punto hai un comando misto tra interi e stringhe


Posted by maynard80 on 12-02-2006 13:52:

allora io ho 2 quesiti:
1)Per il discorso dei valori alla fine come calcoliamo il modulo? nel senso che 7mod2 fa 1 e su questo non ci sono problemi, ma -7mod2 dovrebbe fare -7 ma nel nostro caso a quanto pare non possiamo avere risultati della funzione modulo negativi (chiaro visto che il risultato stesso è l'indice per trovare il valore nel file), ecco voi coe operate??

2)stavo pensando che alla fine ogni mappa potrebbe essere una piccola lista di adiacenze, e ad essa applicare gli algoritmi per gli shortest path, no? unica cosa come si fa a modificare Dijkstra per il caso dei pesi negativi?

__________________
msn Messenger: giamma80 at tiscali.it
ATHENA !


Posted by ornati on 12-02-2006 16:28:

Originally posted by maynard80
allora io ho 2 quesiti:
1)Per il discorso dei valori alla fine come calcoliamo il modulo? nel senso che 7mod2 fa 1 e su questo non ci sono problemi, ma -7mod2 dovrebbe fare -7 ma nel nostro caso a quanto pare non possiamo avere risultati della funzione modulo negativi (chiaro visto che il risultato stesso è l'indice per trovare il valore nel file), ecco voi coe operate??


-7 mod 2 = 1
http://www.google.it/search?hl=it&q=-7+mod+2

E dalla pagina 2 di questo thread:
http://en.wikipedia.org/wiki/Modulo_operation

code:
int modulo(int a, int b) { int x; if (a < 0) { x = -a + b - 1; a += x - x % b; return a; } return a % b; }


Posted by Polsy on 12-02-2006 16:46:

Originally posted by maynard80

2)stavo pensando che alla fine ogni mappa potrebbe essere una piccola lista di adiacenze, e ad essa applicare gli algoritmi per gli shortest path, no? unica cosa come si fa a modificare Dijkstra per il caso dei pesi negativi?


io mi terrei come riferimento una matrice dei punti compresi tra l'origine e la destinazione della mappa coi valori per ogni punto
poi farei una seconda matrice in cui ogni cella (i,j) è una struct che tiene le coordinate del punto appena precedente a (i,j) nel cammino (quale scegliere te lo calcoli con dijkstra, ovviamente modificato x cercare il cammino di peso massimo) e il valore totale del cammino fino a quel punto
il cammino te lo trovi riguardando a ritroso i punti della seconda matrice, tempo di calcolo O(n*m) considerando una matrice nxm

non ti preoccupare dei pesi negativi, di solito dijkstra si incasina perchè cerca il cammino di peso minimo e coi valori negativi rischia di andare in loop, qui non hai di questi problemi perchè 1) cerchi il cammino di peso massimo e 2) visto che devi trovare il cammino di lunghezza minima imponi movimenti solo nelle 2 direzioni che ti fanno avvicinare al punto di destinazione => niente cicli


Posted by tyzer on 12-02-2006 16:47:

Unhappy

Non credo che ci sia bisogno di scomodare i grafi.

Per la riduzione, usando la programmazione dinamica, si può fare in tempo O(dx * dy). Dove dx = |src.x - dst.x| e dy = |src.y - dst.y|.

Non penso che si possa fare di meglio... nel caso generico. Poi magari si può velocizzare nel caso medio con qualche euristica, boh!


Spero proprio che non ci sia da scomodare i grafi, e concordo col tempo che hai detto, ma l mia domanda è come si può implementare questo algoritmo? Come fai con la programmazione dinamica? Col backtracking? io ho riguardato il problema del cavallo (quello sulla scacchiera che devi andare su tutte le caselle eccetera..) però li non c'era da tenere conto dei pesi dei punti come qui...se qualcuno ha idee... :?:?:?:?


Posted by Simeon on 12-02-2006 18:02:

Avanzo un problema che magari per voi sarà scemo ma mi sta mandando in confusione.

Voi QUANDO invocate la funzione che calcola il valore totale di una mappa?

Nell'esempio del prof lui inizia con

c 4 4 primo.txt
m mappa1 4 3 blablabla
s mappa1
...

E stampando mappa1 viene visualizzato:

...
mappa1 4 7 1 EEESSSEENWWWWWWWSSEENNNWSSSSSWW
...

Il valore di mappa1 con quella specifica e' "1", quindi in quelle 3 istruzioni la in alto è gia stato calcolato.

Allora ho pensato :"bene, invoco la funzione di calcolo del valore della mappa quando la inserisco con m mappa1 etc...".

Poi sono andato avanti a leggere l'esempio e ho trovato sto passaggio:

...
s alfa
v -3 3 100
s alfa
...

Che in output produce

...
alfa -6 3 11 NEEEN
alfa -6 3 94 EEENN
...

E questo mi manda in crisi. Quello che facciamo noi tra le due stampe è soltanto inserire un nuovo valore. Com'è possibile che la seconda stampa abbia gia a disposizione il valore nuovo della mappa alfa? E la specifica "NEEEN" cambia in "EEENN"... ma perchè?!?!

Boh se qualcuno riesce a capire qualcosa del mio problema e mi da una risposta lo ringrazio tantissimo, può darsi che mi sfugga qualcosa di molto molto importante.

:help:

p.s Polsy ma la rappresentazione con la matrice non è inefficiente? Almeno a quanto dice il progetto si...


Posted by YoMo on 12-02-2006 18:13:

Originally posted by Simeon

...

Poi sono andato avanti a leggere l'esempio e ho trovato sto passaggio:

...
s alfa
v -3 3 100
s alfa
...

Che in output produce

...
alfa -6 3 11 NEEEN
alfa -6 3 94 EEENN
...

E questo mi manda in crisi. Quello che facciamo noi tra le due stampe è soltanto inserire un nuovo valore. Com'è possibile che la seconda stampa abbia gia a disposizione il valore nuovo della mappa alfa? E la specifica "NEEEN" cambia in "EEENN"... ma perchè?!?!

...


Se l'esempio dice che

r alfa
s alfa
v -3 3 100
s alfa

sputa fuori

alfa -6 3 11 NEEEN
alfa -6 3 94 EEENN

può significare solo una cosa: se riduco una mappa VOGLIO che quella mappa sia SEMPRE ridotta, qualsiasi cosa succeda (es. modifico il valore di un punto).
Ciò mi fa venire i brividi....


Posted by Simeon on 12-02-2006 18:17:

Originally posted by YoMo
Se l'esempio dice che

r alfa
s alfa
v -3 3 100
s alfa

sputa fuori

alfa -6 3 11 NEEEN
alfa -6 3 94 EEENN

può significare solo una cosa: se riduco una mappa VOGLIO che quella mappa sia SEMPRE ridotta, qualsiasi cosa succeda (es. modifico il valore di un punto).
Ciò mi fa venire i brividi....


:eek:

Oddio, sentiamo che dicono gli altri...

E che mi dici della prima parte invece? La funzione valore la calcoli quando fai "m mappa1 etc" oppure quando... la stampi?

p.s : ho mandato una mail al prof per chiarire un altro dubbio: "i valori che noi settiamo esplicitamente (tramite valore(x,y,n) valgono per un solo piano o per tutti quelli che creiamo?"

Se qualcuno avesse lo stesso dilemma domani dovrei ricevere la risposta, saluti :)


Posted by Polsy on 12-02-2006 18:44:

Originally posted by Simeon
Avanzo un problema che magari per voi sarà scemo ma mi sta mandando in confusione.

Voi QUANDO invocate la funzione che calcola il valore totale di una mappa?

Nell'esempio del prof lui inizia con

c 4 4 primo.txt
m mappa1 4 3 blablabla
s mappa1
...

E stampando mappa1 viene visualizzato:

...
mappa1 4 7 1 EEESSSEENWWWWWWWSSEENNNWSSSSSWW
...

Il valore di mappa1 con quella specifica e' "1", quindi in quelle 3 istruzioni la in alto è gia stato calcolato.

Allora ho pensato :"bene, invoco la funzione di calcolo del valore della mappa quando la inserisco con m mappa1 etc...".

Poi sono andato avanti a leggere l'esempio e ho trovato sto passaggio:

...
s alfa
v -3 3 100
s alfa
...

Che in output produce

...
alfa -6 3 11 NEEEN
alfa -6 3 94 EEENN
...

E questo mi manda in crisi. Quello che facciamo noi tra le due stampe è soltanto inserire un nuovo valore. Com'è possibile che la seconda stampa abbia gia a disposizione il valore nuovo della mappa alfa? E la specifica "NEEEN" cambia in "EEENN"... ma perchè?!?!

Boh se qualcuno riesce a capire qualcosa del mio problema e mi da una risposta lo ringrazio tantissimo, può darsi che mi sfugga qualcosa di molto molto importante.

:help:


mumble...
i casi sono 2, o il prof ha sbagliato e si è dimenticato una riduzione nel mezzo, o ha ragione yomo e le mappe vanno ridotte automaticamente...in tal caso non fai altro che richiamare riduci quando vuoi stampare una mappa (le riduci solo quando le vuoi stampare, se no sarebbe inefficientissimo) ma mi sembra strano...l'avrebbe scritto nelle specifiche...provate a mandargli una mail

edit: tra le altre cose, se riduci fosse implicita, a che pro richiamare r alfa prima di s alfa?


p.s Polsy ma la rappresentazione con la matrice non è inefficiente? Almeno a quanto dice il progetto si...

la rappresentazione del piano tramite una matrice è di sicuro inefficiente, dato che il piano è infinito ;)
le matrici che dico io riguardano solo la porzione di piano compresa tra l'inizio e la fine della mappa da ridurre


Posted by Simeon on 12-02-2006 18:52:

Originally posted by Polsy
mumble...
i casi sono 2, o il prof ha sbagliato e si è dimenticato una riduzione nel mezzo, o ha ragione yomo e le mappe vanno ridotte automaticamente...in tal caso non fai altro che richiamare riduci quando vuoi stampare una mappa (le riduci solo quando le vuoi stampare, se no sarebbe inefficientissimo) ma mi sembra strano...l'avrebbe scritto nelle specifiche...provate a mandargli una mail

edit: tra le altre cose, se riduci fosse implicita, a che pro richiamare r alfa prima di s alfa?


Non è per fare lo scarica barili, ma gli ho gia mandato 2 mail in 4 giorni e non vorrei che si alteri :look:, non può pensarci uno di voi?


la rappresentazione del piano tramite una matrice è di sicuro inefficiente, dato che il piano è infinito ;)
le matrici che dico io riguardano solo la porzione di piano compresa tra l'inizio e la fine della mappa da ridurre


No ho capito che non intendevi rappresentare TUTTO il piano, è che mi sa che avevo frainteso la nota del progetto (che parla della minima porzione rettangolare contenente tutti i percorsi specificati da mappe).

Bah intanto mi implemento l'alberello per memorizzare i punti non di default... poi si vedrà.

Non ho ancora la minima idea di come fare riduci(..) e sottopercorso(..)


Posted by tyzer on 12-02-2006 20:29:

Polsy (cioè Paola vero? :D), ho provato a seguire il tuo suggerimento, per fare la funzione riduci usando Dijkstra modificandolo perchè trovi il valore massimo , il fatto è che non funziona lo stesso...
anche tenendo conto dei soli spostamenti possibili e che cerco il cammino massimo quindi non va in loop su cicli negativi.

Il problema è che se i valori dei punti fossero tutti positivi allora l'algoritmo greedy insegue quelli piu grossi (cioè ogni volta che devo scegliere il prossimo punto scelgo quello piu grosso spostandomi nelle due uniche direzioni possibili per avvicinarmi al punto destinazione) e arrivo a determinare la soluzione ottimale...

Invece essendo presenti valori negativi, l'algoritmo può inseguire lo stesso i valori più grossi, ma magari poi trova dei valori negativi (nei punti successivi...) e la soluzione non è ottima perchè ci potrebbe essere il caso che scegliendo un percorso in cui ci sono punti negativi, poi magarai ce ne sono altri positivi che mi danno un percorso di valore maggiore che se nn avessi inseguito quelli di valore maggiore...

Non so se sono stato chiaro, in pratica credo che la struttura su cui applichiamo questo algoritmo non sia un matroide e quindi gli algoritmi greedy (compreso il caro Dijkstra...) non vanno...


Posted by Polsy on 12-02-2006 21:49:

Originally posted by tyzer
Polsy (cioè Paola vero? :D), ho provato a seguire il tuo suggerimento, per fare la funzione riduci usando Dijkstra modificandolo perchè trovi il valore massimo , il fatto è che non funziona lo stesso...
anche tenendo conto dei soli spostamenti possibili e che cerco il cammino massimo quindi non va in loop su cicli negativi.

Il problema è che se i valori dei punti fossero tutti positivi allora l'algoritmo greedy insegue quelli piu grossi (cioè ogni volta che devo scegliere il prossimo punto scelgo quello piu grosso spostandomi nelle due uniche direzioni possibili per avvicinarmi al punto destinazione) e arrivo a determinare la soluzione ottimale...

Invece essendo presenti valori negativi, l'algoritmo può inseguire lo stesso i valori più grossi, ma magari poi trova dei valori negativi (nei punti successivi...) e la soluzione non è ottima perchè ci potrebbe essere il caso che scegliendo un percorso in cui ci sono punti negativi, poi magarai ce ne sono altri positivi che mi danno un percorso di valore maggiore che se nn avessi inseguito quelli di valore maggiore...

Non so se sono stato chiaro, in pratica credo che la struttura su cui applichiamo questo algoritmo non sia un matroide e quindi gli algoritmi greedy (compreso il caro Dijkstra...) non vanno...

si, Paola :P ti conosco?

il fatto è che tu calcoli per ogni punto del rettangolo compreso tra la sorgente e la destinazione qual'è il cammino migliore dalla sorgente e in esso memorizzi il valore dell'intero cammino che ti porta fin lì
poniamo di dover andare da SW a NE
alla cella (i,j) ci puoi arrivare solo dalla cella (i-1,j) o da (i,j-1) e scegli quella col cammino parziale di valore massimo (mettiamo sia i-1,j)
nella cella (i,j) memorizzerò come valore $valore_cella(i-1,j) + $valore_punto(i,j)
in questo modo ogni cella ha il valore dell'intero cammino che lo precede, per cui è come se avesse memoria sia dei punti positivi che di quelli negativi
ad esempio se per arrivare alla cella (i,j-1) ho passato punti con valori inizialmente molto alti come 15, 20, 32 e poi valori negativi come -35, -30 avrò come valore della cella 2
mentre se per arrivare alla cella (i-1,j) avevo valori del tipo -1, 0, 0, 3, 4 avrò come valore della cella 6
di conseguenza l'algoritmo sceglie (i-1,j) come cella predecessore e pone il valore della cella i,j (il cui punto corrispondente facciamo che vale 3) a 6+3=9

praticamente l'idea è che per ogni punto intermedio si è calcolato il percorso ottimo per arrivarci, se esclude un percorso è solo perchè ne ha trovato un altro che lo porta nello stesso punto con un guadagno maggiore
come dire, tu non scegli dove ti conviene andare, ma da dove ti conviene arrivare


Posted by darkAntAreS on 12-02-2006 22:24:

domanda stupida: e se trovo 2 percorsi ottimali con la riduzione? sulla descrizione del progetto dice che la riduzione di una mappa è la mappa stessa con un percorso ridotto, ma quell' "un" è articolo indeterminativo o effettivamente se ci sono più percorsi ottimali ne scelgo uno a caso???

__________________
"Ash nazg durbatulûk, ash nazg gimbatul, ash nazg thrakatulûk agh burzum-ishi krimpatul"


Posted by Polsy on 12-02-2006 22:28:

Originally posted by darkAntAreS
domanda stupida: e se trovo 2 percorsi ottimali con la riduzione? sulla descrizione del progetto dice che la riduzione di una mappa è la mappa stessa con un percorso ridotto, ma quell' "un" è articolo indeterminativo o effettivamente se ci sono più percorsi ottimali ne scelgo uno a caso???

se ne hai più ottimali ne scegli 1 a caso


Posted by Simeon on 13-02-2006 10:32:

Ok ragazzi, sul sito di laboratorio c'è l'errata corrige del problema di ieri, ci voleva una riduzione prima della seconda stampa :)

Per quanto riguarda i valori settati esplicitamente, il prof ha detto che alla creazione di un nuovo piano devono essere svuotati.


Posted by miles on 13-02-2006 10:38:

mi sto accingendo a realizzare il progetto e pensavo alla rappresentazione del piano. se uso un albero binario di ricerca e (x,y) rappresenta la chiave l'albero non è sbilanciato?


Posted by tyzer on 13-02-2006 11:17:


il fatto è che tu calcoli per ogni punto del rettangolo compreso tra la sorgente e la destinazione qual'è il cammino migliore dalla sorgente e in esso memorizzi il valore dell'intero cammino che ti porta fin lì


Ho capito ciò che dici, ma secondo me ci sono dei problemi:

1) Come fai fare quello che ti ho quotato sopra? Per migliore intendi con peso massimo spero...

2) Anche ammettendo che si riesca a trovare per ogni punto (i,j) nel rettangolo il valore del cammino di peso massimo...potrebbe succedere che poi procedendo a ritroso dalla seconda matrice


il cammino te lo trovi riguardando a ritroso i punti della seconda matrice, tempo di calcolo O(n*m) considerando una matrice nxm


trovi che i punti (i-1,j) ed (i,j-1) hanno come valore del cammino migliore per raggiungerli lo stesso costo ed allora quale dei due scegli? Non puoi sceglierne uno a caso fra i 2 perchè non saprai mai se magari sceglievi quello che decidi scartare quali altri costi incontravi e che non incontrerai scegliendo l'altro punto...

P.S.
Di vista forse mi conosci, ero a fare metodi col Mereghet l'anno scorso...eravamo io e un mio amico tutti e due del primo anno...


Posted by Polsy on 13-02-2006 13:45:

Originally posted by tyzer
Ho capito ciò che dici, ma secondo me ci sono dei problemi:

1) Come fai fare quello che ti ho quotato sopra? Per migliore intendi con peso massimo spero...


si, peso massimo
alla prima iterazione tu non sai niente di nessuna cella, sai solo che il punto di origine vale $valore_punto_00 e che appartiene sicuramente al cammino, per cui nella matrice associ alla cella (0,0) le coordinate (0,0) (all'origine ci arrivi dall'origine :P) e $valore_cella_00 = $valore_punto_00

alla seconda iterazione analizzi la diagonale successiva, cioè (0,1) e (1,0)

(0,1) -> ci puoi arrivare solo dall'origine, quindi
$coordinate_punto_precedente_a_01 = (0,0)
$valore_cella_01 = $valore_cella_00 + $valore_punto_01

(1,0) -> ci puoi arrivare solo dall'origine, quindi
$coordinate_punto_precedente_a_10 = (0,0)
$valore_cella_10 = $valore_cella_00 + $valore_punto_10


terza iterazione, terza diagonale: (0,2) , (1,1) , (2,0)

(0,2) -> ci puoi arrivare solo da (0,1), quindi
$coordinate_punto_precedente_a_02 = (0,1)
$valore_cella_02 = $valore_cella_01 + $valore_punto_02

(1,1) -> ci puoi arrivare sia da (0,1) che da (1,0)
$coordinate_punto_precedente_a_11 = $punto_associato_alla_cella_con_valore_max
$valore_cella_11 = $valore_cella_con_valore_max + $valore_punto_11
(NOTA: se (0,1) e (1,0) hanno valori uguali è indifferente quale scegliere, vuol dire che entrambi i percorsi ti portano lo stesso guadagno)

(2,0) -> ci puoi arrivare solo da (1,0), quindi
$coordinate_punto_precedente_a_20 = (1,0)
$valore_cella_20 = $valore_cella_10 + $valore_punto_20


2) Anche ammettendo che si riesca a trovare per ogni punto (i,j) nel rettangolo il valore del cammino di peso massimo...potrebbe succedere che poi procedendo a ritroso dalla seconda matrice



trovi che i punti (i-1,j) ed (i,j-1) hanno come valore del cammino migliore per raggiungerli lo stesso costo ed allora quale dei due scegli? Non puoi sceglierne uno a caso fra i 2 perchè non saprai mai se magari sceglievi quello che decidi scartare quali altri costi incontravi e che non incontrerai scegliendo l'altro punto...


quando vai a ritroso per ritrovare il cammino non devi scegliere, hai già scelto prima, il punto precedente ce l'hai nel campo $coordinate_punto_precedente


P.S.
Di vista forse mi conosci, ero a fare metodi col Mereghet l'anno scorso...eravamo io e un mio amico tutti e due del primo anno...


la mia memoria è terribile...:oops:


Posted by tandrea85 on 14-02-2006 14:23:

ho appena iniziato sto progetto ed ho gia un dubbio..

per associare ad ogni punto val basta seguire la nota 3 e fin qua ci sono.. ma x e y dove li prendo? sono semplicemente fatti scorrere partendo dai parametri m e n?
nel caso di c 4 4 primo.txt abbiamo 16 punti e primo.txt contiene 16 valori.. quindi ogni punto avrà un valore.. io facendo 2 calcoli mi è venuto fuori cosi:

(1,1) -> v5
(1,2) -> v9
(1,3) -> v13
(1,4) -> v1
(2,1) -> v6
(2,2) -> v10
(2,3) -> v14
(2,4) -> v2
(3,1) -> v7
(3,2) -> v11
(3,3) -> v15
(3,4) -> v3
(4,1) -> v4
(4,2) -> v8
(4,3) -> v12
(4,4) -> v0

è corretto?


Posted by MaurizioL on 14-02-2006 15:50:

Originally posted by miles
mi sto accingendo a realizzare il progetto e pensavo alla rappresentazione del piano. se uso un albero binario di ricerca e (x,y) rappresenta la chiave l'albero non è sbilanciato?


Potenzialmente sì,

si suppone che le coordinate dei punti inseriti con il comando v x y siano casuali, in quel caso l'albero è relativamente bilanciato

__________________
Maurizio Lombardi
Linux 2.6.14.2
-----------------------


Posted by maynard80 on 14-02-2006 16:07:

Originally posted by tandrea85
ho appena iniziato sto progetto ed ho gia un dubbio..

per associare ad ogni punto val basta seguire la nota 3 e fin qua ci sono.. ma x e y dove li prendo? sono semplicemente fatti scorrere partendo dai parametri m e n?
nel caso di c 4 4 primo.txt abbiamo 16 punti e primo.txt contiene 16 valori.. quindi ogni punto avrà un valore.. io facendo 2 calcoli mi è venuto fuori cosi:

(1,1) -> v5
(1,2) -> v9
(1,3) -> v13
(1,4) -> v1
(2,1) -> v6
(2,2) -> v10
(2,3) -> v14
(2,4) -> v2
(3,1) -> v7
(3,2) -> v11
(3,3) -> v15
(3,4) -> v3
(4,1) -> v4
(4,2) -> v8
(4,3) -> v12
(4,4) -> v0

è corretto?


veramente con C crei il piano ed il piano è immenso e non è altro che un insieme di quadrati costruiti come il tuo... ma ripetuti all'infinito. il fatto che ti dia m ed n non vuol dire che è un piano mxn, infatti poi potrebbe darti una mappa che inizia in 4,7

__________________
msn Messenger: giamma80 at tiscali.it
ATHENA !


Posted by Simeon on 14-02-2006 16:41:

Originally posted by tandrea85
ho appena iniziato sto progetto ed ho gia un dubbio..

per associare ad ogni punto val basta seguire la nota 3 e fin qua ci sono.. ma x e y dove li prendo? sono semplicemente fatti scorrere partendo dai parametri m e n?
nel caso di c 4 4 primo.txt abbiamo 16 punti e primo.txt contiene 16 valori.. quindi ogni punto avrà un valore.. io facendo 2 calcoli mi è venuto fuori cosi:

(1,1) -> v5
(1,2) -> v9
(1,3) -> v13
(1,4) -> v1
(2,1) -> v6
(2,2) -> v10
(2,3) -> v14
(2,4) -> v2
(3,1) -> v7
(3,2) -> v11
(3,3) -> v15
(3,4) -> v3
(4,1) -> v4
(4,2) -> v8
(4,3) -> v12
(4,4) -> v0

è corretto?


Se ti leggi una delle pagine iniziali di questo thread trovi la spiegazione del prof sulla nota 3 :)


Posted by tandrea85 on 14-02-2006 16:59:

Originally posted by Simeon
Se ti leggi una delle pagine iniziali di questo thread trovi la spiegazione del prof sulla nota 3 :)


ok grazie.. ho piu o meno capito.. quindi piano infinito, valori dei generci punti del piano ricavati o tramite v0, v1.. dal file, o tramite valore(s,y,n) o 0 altrimenti.

mettiamo ke io voglia scegliere l'albero binario di ricerca per il piano.. ma se è infinito cosa ci salvo dentro? quali punti?


Posted by maynard80 on 14-02-2006 17:28:

Originally posted by tandrea85
ok grazie.. ho piu o meno capito.. quindi piano infinito, valori dei generci punti del piano ricavati o tramite v0, v1.. dal file, o tramite valore(s,y,n) o 0 altrimenti.

mettiamo ke io voglia scegliere l'albero binario di ricerca per il piano.. ma se è infinito cosa ci salvo dentro? quali punti?


solo i punti che ti interessano


ma quello che io sinceramente non capisco è: se a noi essenzialmente interessano solo le mappe, e ogni mappa ha la sua identità precisa (2 mappe sovrapposte non ci interessano)

non basterebbero semplicemente i grafi per ogni mappa? oppure pensate di mettere come dato nel grafo della singola mappa un puntatore ad una struttura che contiene le info su tutti i punti?

certo sarebbe un problema quando si modifica un valore di un punto andare a modificarlo per ogni mappa è contenuto.


al massimo si potrebbe tenere traccia solo dei punti modificati tramite un albero binario e controllare ogni volta se il punto che ci interessa è contenuto nell'albero, in caso differente ha valore standard (il famoso valore della nota3)

voi che dite?

__________________
msn Messenger: giamma80 at tiscali.it
ATHENA !


Posted by tandrea85 on 14-02-2006 17:44:

Originally posted by maynard80
solo i punti che ti interessano


quelli del percorso? se mi fai un esempietto te ne sarei grato..

piu che altro vorrei capire concettualmente la cosa..

quello che ho capito fin ora è (ed è ben poco):
- ho un piano infinito composto da punti
- ogni punto di questo piano infinito ha un valore calcolato secondo la nota3
- esistone delle mappe (che sono dei percorsi di punti all'interno del piano)

il piano quindi alla fin dei conti è una struttura (albero, hash o altro) vuota, che poi riempirò con i punti del percorso di una mappa.

boh.. ci sono concettualmente?


Posted by maynard80 on 14-02-2006 20:24:

Originally posted by tandrea85
quelli del percorso? se mi fai un esempietto te ne sarei grato..

piu che altro vorrei capire concettualmente la cosa..

quello che ho capito fin ora è (ed è ben poco):
- ho un piano infinito composto da punti
- ogni punto di questo piano infinito ha un valore calcolato secondo la nota3
- esistone delle mappe (che sono dei percorsi di punti all'interno del piano)

il piano quindi alla fin dei conti è una struttura (albero, hash o altro) vuota, che poi riempirò con i punti del percorso di una mappa.

boh.. ci sono concettualmente?



io la vedo + o - così

__________________
msn Messenger: giamma80 at tiscali.it
ATHENA !


Posted by Simeon on 15-02-2006 00:34:

Originally posted by tandrea85


boh.. ci sono concettualmente?


Credo di si, piu o meno.. Cioe nemmeno io ho ancora le idee chiare al 100%.

Nel mio programma c'e' una struttura che ospita i punti inseriti con valore(x,y,n), un'altra struttura che memorizza le mappe...

Mi mancano riduci() e sottopercorso()... Ho solo una vaga idea di come farli ma ho paura che dovro' modificare qualcosa nella vecchia roba... buaaah.


Posted by marcomaria on 15-02-2006 10:00:

Originally posted by ornati
-7 mod 2 = 1
http://www.google.it/search?hl=it&q=-7+mod+2

E dalla pagina 2 di questo thread:
http://en.wikipedia.org/wiki/Modulo_operation

code:
int modulo(int a, int b) { int x; if (a < 0) { x = -a + b - 1; a += x - x % b; return a; } return a % b; }

esiste una funzione fmod nella libreria std math.h; non funziona allo stesso modo...?


Posted by jonnypee on 15-02-2006 11:21:

HELP ME!
Ho il primo progetto "Mappe" non riesco a modificarlo per formare il secondo "Mappe 2", in più sto preparando altri esami...c'è qualcuno che per favore me lo può fareee???

Ci sarà una riconpensa!


Posted by diocla2 on 15-02-2006 12:53:

Raga qualcuno del primo turno che ha finito il progetto me lo potrebbe dare gentilmente io sono del secondo turno con torelli vi pago cazzooooooo helpme

ciaooooo


Posted by maynard80 on 15-02-2006 13:01:

quindi la tabellona hash che veniva usata nel progetto mappe N°1 qui non ha senso? allora è come penso io servono solo i grafi delle mappe ed una struttura per i punti modificati.

certo bisogna dire che una struttura che contenga tutti i punti delle mappe non sarebbe male, in questo caso basterebbe un puntatore all'interno di ogni punto della mappa (nel caso si voglia modificare un punto appartenente a + mappe)

__________________
msn Messenger: giamma80 at tiscali.it
ATHENA !


Posted by tandrea85 on 15-02-2006 17:23:

per l'input bisogna semplicemente leggere 1 riga alla volta?

per es. io scrivo:
c 1 1 asd.txt -> premo INVIO
rislutato istruzione
m 4 7 EWNNN -> premo INVIO
risultato istruzione
f -> premo INVIO
fine

oppure

c 1 1 asd.txt
m 4 7 EWNNN
f
-> premo INVIO
tutti i risultati 1 dopo l'altro come nel pdf


Posted by maynard80 on 15-02-2006 18:01:

si penso di si

allora io ho pensato di prender in esame il rettangolo di punti compresi tra i vertici P e Q per la riduzione della mappa (e quindi la lista di adiacenze di quei punti) mentre per il sottocammino solo i punti compresi nella mappa.

giusto?

per il primo caso bisogna adattare un alg. per shortest path (esempio Dijksta) per il secondo... qualcuno ha idee?

__________________
msn Messenger: giamma80 at tiscali.it
ATHENA !


Posted by Simeon on 15-02-2006 18:23:

Certo che se dovessimo essere in troppi ad utilizzare l'approccio proposto da Polsy... :look:

Voi dite che basta che non ci copiamo il codice e tutto ok?


Posted by Simeon on 15-02-2006 19:28:

Originally posted by tandrea85
per l'input bisogna semplicemente leggere 1 riga alla volta?

per es. io scrivo:
c 1 1 asd.txt -> premo INVIO
rislutato istruzione
m 4 7 EWNNN -> premo INVIO
risultato istruzione
f -> premo INVIO
fine

oppure

c 1 1 asd.txt
m 4 7 EWNNN
f
-> premo INVIO
tutti i risultati 1 dopo l'altro come nel pdf


Si chiaro 1 riga alla volta. Ovvio che poi se rediRIGI l'input con <input.txt allora ti sputa fuori tutto in una botta sola come nel pdf


Posted by ornati on 16-02-2006 09:45:

Originally posted by marcomaria
esiste una funzione fmod nella libreria std math.h; non funziona allo stesso modo...?


No, esempio:

paolo@tux ~/tmp $ ./a.out
-7 2
-7 mod 2 = -1.000000 (invece che +1)

inoltre: perchè tirare in ballo i floating point quando puoi farne a meno?


Posted by maynard80 on 16-02-2006 10:24:

ragazzi ma Dijkstra coi pesi negativi come fate? in alternativa avete materiale sugli algoritmi DSP?

__________________
msn Messenger: giamma80 at tiscali.it
ATHENA !


Posted by poledrisk85 on 16-02-2006 11:22:

ciao a tutti!volevo sapere da voi se e dove piazzare l'output...è 1 pò difficile da spiegare:
nel progettino c'è una sfilza di righe di input e alla fine dice l'output prodotto deve essere bla bla bla...ma l'ouput lo devo salvare in un file e alla fine dell'esecuzione(cioè quando si premi in input il tasto f) si stampa a video o durante l'esecuzione?grazie a tutti!

__________________
Het is allemaal naar de zak!!!


Posted by darkAntAreS on 16-02-2006 16:58:

per come ho capito io...ogni riga dell'input dev'essere seguita dal relativo output...altrimenti non avrebbe senso memorizzare i comandi per poi eseguirli uno dopo l'altro...o no???

__________________
"Ash nazg durbatulûk, ash nazg gimbatul, ash nazg thrakatulûk agh burzum-ishi krimpatul"


Posted by darkAntAreS on 16-02-2006 17:10:

domanda:
ho il mio piano, con una struttura che contiene tutti i punti modificati con il comando valore(x,y,v)...se poi cambio il piano col comando crea(m,n,nome), i punti cambiati precedentemente rimangono tali o devo cancellare la struttura che li conteneva perchè sono stati "rivalutati" dalla creazione del nuovo piano????

__________________
"Ash nazg durbatulûk, ash nazg gimbatul, ash nazg thrakatulûk agh burzum-ishi krimpatul"


Posted by YoMo on 16-02-2006 18:25:

Originally posted by maynard80
ragazzi ma Dijkstra coi pesi negativi come fate? in alternativa avete materiale sugli algoritmi DSP?

Svolta due pagine dopo sul cormen...


Posted by Simeon on 16-02-2006 18:29:

Porco cane credevo di avercela fatta e invece sto avendo dei problemoni. Tutto funziona quando l'origine e' minore della destinazione ed entrambe sono positive...

Se invece ho tipo origine 2 2 e destinazione -4 -5 e' il caos, uff...


Posted by YoMo on 16-02-2006 18:41:

Originally posted by darkAntAreS
domanda:
ho il mio piano, con una struttura che contiene tutti i punti modificati con il comando valore(x,y,v)...se poi cambio il piano col comando crea(m,n,nome), i punti cambiati precedentemente rimangono tali o devo cancellare la struttura che li conteneva perchè sono stati "rivalutati" dalla creazione del nuovo piano????

Beh direi che con "c m n nome" si azzera tutto, piano, mappe, punti, sistema operativo e bisogna pure riavviare il pc.


Posted by Simeon on 16-02-2006 18:51:

Originally posted by darkAntAreS
domanda:
ho il mio piano, con una struttura che contiene tutti i punti modificati con il comando valore(x,y,v)...se poi cambio il piano col comando crea(m,n,nome), i punti cambiati precedentemente rimangono tali o devo cancellare la struttura che li conteneva perchè sono stati "rivalutati" dalla creazione del nuovo piano????


Guardati qualche pagina addietr del thread... In un mio post c'è la risposta che cerchi.


Posted by darkAntAreS on 16-02-2006 19:54:

visto, grazie ;)

__________________
"Ash nazg durbatulûk, ash nazg gimbatul, ash nazg thrakatulûk agh burzum-ishi krimpatul"


Posted by maynard80 on 17-02-2006 00:03:

Originally posted by darkAntAreS
domanda:
ho il mio piano, con una struttura che contiene tutti i punti modificati con il comando valore(x,y,v)...se poi cambio il piano col comando crea(m,n,nome), i punti cambiati precedentemente rimangono tali o devo cancellare la struttura che li conteneva perchè sono stati "rivalutati" dalla creazione del nuovo piano????


beh se dice di creare un nuovo piano, è logico che si cancella tutto anche le modifiche

__________________
msn Messenger: giamma80 at tiscali.it
ATHENA !


Posted by doddy on 17-02-2006 14:44:

Ho un piccolo problema cioe' e' proprio piccolissimo...nn ho controllato tutte le pagine dietro e quindi nn so se qualkun'altro ha avuto il mio stesso problemino cmq...il file di ornati nn mi stampa nulla cm output...so che nn me ne dovrebbe sbattere molto visto che i due proge sono differenti pero' volevo almeno vedere un po' mappe e zero nn mi da output...
ciao


Posted by ornati on 17-02-2006 14:52:

Originally posted by doddy
Ho un piccolo problema cioe' e' proprio piccolissimo...nn ho controllato tutte le pagine dietro e quindi nn so se qualkun'altro ha avuto il mio stesso problemino cmq...il file di ornati nn mi stampa nulla cm output...so che nn me ne dovrebbe sbattere molto visto che i due proge sono differenti pero' volevo almeno vedere un po' mappe e zero nn mi da output...
ciao


Ehh???

Il mio programma funziona benissimo!


Posted by Polsy on 17-02-2006 15:59:

Originally posted by doddy
Ho un piccolo problema cioe' e' proprio piccolissimo...nn ho controllato tutte le pagine dietro e quindi nn so se qualkun'altro ha avuto il mio stesso problemino cmq...il file di ornati nn mi stampa nulla cm output...so che nn me ne dovrebbe sbattere molto visto che i due proge sono differenti pero' volevo almeno vedere un po' mappe e zero nn mi da output...
ciao

hai provato a dargli input? :asd:


Posted by YoMo on 17-02-2006 19:00:

Originally posted by doddy
Ho un piccolo problema cioe' e' proprio piccolissimo...nn ho controllato tutte le pagine dietro e quindi nn so se qualkun'altro ha avuto il mio stesso problemino cmq...il file di ornati nn mi stampa nulla cm output...so che nn me ne dovrebbe sbattere molto visto che i due proge sono differenti pero' volevo almeno vedere un po' mappe e zero nn mi da output...
ciao


Magari nn usi un sistema operativo serio.... a parte gli scherzi, secondo me hai sbagliato gli input o li hai passati male.


Posted by Simeon on 18-02-2006 00:23:

Oooh che bello ho praticamente finito riduci()... madonna santa che fatica.

Qualcuno ha gia implementato sottopercorso() ? Idee ?


Posted by darkAntAreS on 18-02-2006 07:47:

io ho fatto sottopercorso!!!
un consiglio: NON fare l'errore di calcolarti ogni sottopercorso da ogni punto..ragiona su come è fatto un sottopercorso e da dove deve, per forza di cose, partire per essere tale...
nel caso peggiore a me viene (nlogn)/2, ma bisogna essere proprio sfigati...e nel caso medio viene circa n/2

__________________
"Ash nazg durbatulûk, ash nazg gimbatul, ash nazg thrakatulûk agh burzum-ishi krimpatul"


Posted by maynard80 on 18-02-2006 09:25:

Originally posted by darkAntAreS
io ho fatto sottopercorso!!!
un consiglio: NON fare l'errore di calcolarti ogni sottopercorso da ogni punto..ragiona su come è fatto un sottopercorso e da dove deve, per forza di cose, partire per essere tale...
nel caso peggiore a me viene (nlogn)/2, ma bisogna essere proprio sfigati...e nel caso medio viene circa n/2


ci dai maggiori dritte sul ragionamento che hai fatto? io mi scervello ma non arrivo, il sottopercorso è un frammento continuo del percorso della mappa, esso è incluso in P+1.......Q-1 , ma non riesco a capire se non facendo tutti i possibili sottocammini tra 2 punti come fare....

__________________
msn Messenger: giamma80 at tiscali.it
ATHENA !


All times are GMT. The time now is 13:59. Pages (2): [1] 2 »
Show all 246 posts from this thread on one page

Powered by: vBulletin Version 2.3.1
Copyright © Jelsoft Enterprises Limited 2000 - 2002.