Come fare in modo che il programma tenga in memoria dei dati

di il
10 risposte

Come fare in modo che il programma tenga in memoria dei dati

Ciao a tutti, sono uno studente di economia. E per un lavoro devo implementare un algoritmo ad un programma scritto in C. La mia poca esperienza con la programmazione fa si che io abbia non pochi problemi.
Innanzitutto cerco di farvi capire com'è il programma. In pratica si può decidere tramite un parametro di quanti step sarà composto un grosso ciclo for (che dentro ha poi una marea di funzioni che vengono richiamate ma queste non è un problema). Cioè se ad esempio questo all'inizio viene posto a 200..il for avrà 200 step, ognuno dei quali nel mio programma è un periodo..in pratica il programma è come se simulasse una serie di "giornate"..possono essere 10, 100, 1000 ecc.

Io dovrei fare in modo che in ognuno di questi periodi..il programma si tenga in memoria alcuni dati che ha generato in precedenza, in particolare mi occorre che in ogni periodo tenga in memoria dei dati relativi ai 5 periodi precedenti. Questo perchè in ogni periodo t, gli agenti che popolano questa sorta di mondo devono fare la media di alcuni valori che hanno avuto a t-1,t-2,t-3,t-4 e t-5..e con una serie di if decidere poi il da farsi.
Non so se sono riuscito ad essere chiaro, immagino che quello di tenere in memoria dei dati durante l'esecuzione del programma sia una cosa abbastanza banale per gente che ne sa
Io so soltanto come fare in modo che i dati generati vengano scritti su file, ma come dare "in pasto" questi dati ad un pezzo di codice non so come si fa, ed è quello che mi servirebbe capire..
Qualsiasi aiuto o consiglio è ben accetto.

Grazie in anticipo!

10 Risposte

  • Re: Come fare in modo che il programma tenga in memoria dei dati

    In generale potresti usare degli array per conservare i dati che ti servono ma devi chiarire un po' ...
  • Re: Come fare in modo che il programma tenga in memoria dei dati

    Ok, chiarire cosa?
  • Re: Come fare in modo che il programma tenga in memoria dei dati

    In realtà le cose non sono proprio chiare.

    Ho capito, forse sbaglio, che devi salvare dei dati all'interno di un ciclo, lo sapresti fare su un file ma non sai poi questi possa utilizzarli, ossia non sai darli in input ad altre funzioni del tuo programma.

    Se è così, allora c'è prima di tutto da chiedersi è necessario salvare su file oppure è sufficiente salvare in ram, il programma così sarebbe più efficiente.

    Poi se è non è necessario salvare su file, c'è da capire che tipo di struttura dati utilizzare, una semplice struct, un vettore di struct, o altro; se invece è necessario salvare su file, bisogna scegliere come formatti l'output su file.

    A questo punto si possono utilizzare i dati, se salvati in ram sono praticamente pronti, se salvati su file è necessario leggerli da file, ci sono apposite funzioni standard, e memorizzarli in una qualche struttura per potervi fare delle manipolazioni.

    La mia non può che essere una risposta generica, perchè non ho idea del progetto, come potrai facilmente comprendere.
  • Re: Come fare in modo che il programma tenga in memoria dei dati

    Devi chiarire

    1) che tipo di dati vuoi memorizzare
    2) quanti sono questi dati
    3) cosa vorresti farci dopo e in quale punto del programma

    In pratica, se mostri anche solo uno scheletro del codice, capiamo meglio ...
  • Re: Come fare in modo che il programma tenga in memoria dei dati

    SVNiko ha scritto:


    In realtà le cose non sono proprio chiare.

    Ho capito, forse sbaglio, che devi salvare dei dati all'interno di un ciclo, lo sapresti fare su un file ma non sai poi questi possa utilizzarli, ossia non sai darli in input ad altre funzioni del tuo programma.

    Se è così, allora c'è prima di tutto da chiedersi è necessario salvare su file oppure è sufficiente salvare in ram, il programma così sarebbe più efficiente.

    Poi se è non è necessario salvare su file, c'è da capire che tipo di struttura dati utilizzare, una semplice struct, un vettore di struct, o altro; se invece è necessario salvare su file, bisogna scegliere come formatti l'output su file.

    A questo punto si possono utilizzare i dati, se salvati in ram sono praticamente pronti, se salvati su file è necessario leggerli da file, ci sono apposite funzioni standard, e memorizzarli in una qualche struttura per potervi fare delle manipolazioni.

    La mia non può che essere una risposta generica, perchè non ho idea del progetto, come potrai facilmente comprendere.
    No no, tutta la mole di dati che viene generata e scritta su file blocco note mi è comunque necessaria, il programma mi serve proprio per ottenere quei file di dati e farci inferenza con un altro software (R). Soltanto che siccome questo programma ora va reso più "complesso", mentre prima il programma prendeva in pasto un parametro esogenamente, che gli dettavo io all'inizio..ora occorre che questo cambi endogenamente col passare dei periodi. Il criterio con cui questo cambia endogenamente si basa sul fatto che durante ogni step del ciclo (periodo), il codice vada a ripescare dei dati dai 5 periodi prima, e ne faccia la media..poi if la media è < x il parametro cambia, if la media è > x rimane uguale. Questo in modo molto stilizzato..per essere più preciso potrei anche postarvi uno "pseudo codice" che ho scritto su carta, magari così si capisce meglio.
    Azzarderei nel dire che i dati da tenere in memoria andrebbero letti da file, visto che come per tante altre statistiche che vengono generate, su quei 2 dati che mi servono ho creato un print su file apposito. Il problema è: nella funzione quei dati come li richiamo? Come faccio a dirgli che mi servono solo quelli dei 5 periodi prima? Come gli dico di farci la media?

    oregon ha scritto:


    Devi chiarire

    1) che tipo di dati vuoi memorizzare
    2) quanti sono questi dati
    3) cosa vorresti farci dopo e in quale punto del programma

    In pratica, se mostri anche solo uno scheletro del codice, capiamo meglio ...
    I dati dei periodi passati da memorizzare sono 2: uno è di tipo int (è il parametro stesso da rendere endogeno), l'altro è di tipo long. Come ho detto si tratta che per ogni periodo si memorizzi quelli dei 5 periodi prima. In modo iterativo questa sorta di media andrebbe sempre avanti modificandosi. Per il codice, ve lo scrivo al più presto.
  • Re: Come fare in modo che il programma tenga in memoria dei dati

    Beh ... meglio che posti del codice o psudocodice perché sono più confuso di prima ...
  • Re: Come fare in modo che il programma tenga in memoria dei dati

    Int main{
    For(n_sim=0; n_sim<TOT_sim; n_sim++){


    While(t<T){


    For(j=0; j=Bk; j++){
    Srand(time(0))
    ran=rand() % 2+1

    if(media(profitB[j]) >= profitB[j](t-1)){
    if(ran < 50){
    betaI[j] = media(betaI[j]) + 1
    }
    Elseif(ran > 50){
    betaI[j] = media(betaI[j]) – 1
    }
    }
    Elseif(media(profitB[j]) < profitB[j](t-1)){
    betaI[j] = betaI[j](t-1)
    }


    }
    t++
    }
    }
    }

    La variabile n_sim non ve l’avevo neanche citata perché è il numero di volte che questo “giochetto” si ripete, è posta a 1 e non dà problemi, e anche nel momento in cui verrà alzata non cambia niente.
    Anche T, è semplicemente il numero di periodi di ogni sim.
    La variabile ran è solo un espediente per generare dei numeri casuali tra 0 e 100, in modo tale che come vedete sotto, se esce sotto 50 c’è +1 mentre se esce sopra c’è -1.
    Bk è il numero di “agenti” che popolano il sistema, anche questa la si decide all’inizio, ora è a 50. La variabile j è il generico elemento di questo vettore.
    betaI[j] è il parametro che va reso endogeno, il j tra le quadre sta appunto ad identificare che ogni agente ha il suo betaI. Stesso discorso vale per profitB[j], sono i profitti di ogni agente j del gruppo Bk.
    Media(betaI[j]) e media(profitB[j]) rappresentano i problemi, è un modo umano che ho usato io per intendere la media di quei due dati negli ultimi 5 periodi prima. Stesso discorso per betaI[j](t-1) e profitB[j](t-1) che invece sono i due dati a t-1, cioè al periodo precedente.
    Il primo for e il primo while li ho inseriti solo per farvi capire lo scheletro generale del programma, non fanno parte del mio problema. Inoltre in realtà l’algoritmo non sarebbe lì nel codice, farebbe parte di una funzione staccata che viene chiamata dentro il main, lo dico per scrupolo.
    Poi per semplicità ho omesso alcune cose: va detto che in realtà il codice non sarebbe completo, perché beta deve oscillare tra 0 e 8 quindi dovrei aggiungere dei controlli in modo tale che se scende sotto 0 la mette a 0 e se sale sopra a 8 va ad 8. Inoltre c’è anche il problema del fatto che mentre il ciclo t non è arrivato a t=5, il programma non troverebbe 5 dati passati, quindi anche per questa cosa bisognerebbe che mi inventi qualcosa, ma non credo sia un problema. Infine almeno per il primo periodo, bisognerebbe generare il primo beta casualmente per far partire tutto il processo, ad esempio nello stesso modo che ho usato per ran ma facendo in modo che si generi un numero tra 0 e 8.
  • Re: Come fare in modo che il programma tenga in memoria dei dati

    Ascolta hai una linea di testo del file da caricare?
    Esempio di testo scritto nel file:

    18 25 pippo 2 pluto
    10 21 paperino 84 topolino

    ecc...

    Di questa lista tu hai l'esigenza di avere sempre le ultime 5 righe, Queste si aggiornano in real time?
    Che dati vuoi caricare? Di questi dati quali medie vuoi fare?

    E' complicato cercare di aiutarti se no.
  • Re: Come fare in modo che il programma tenga in memoria dei dati

    SVNiko ha scritto:


    Ascolta hai una linea di testo del file da caricare?
    Esempio di testo scritto nel file:

    18 25 pippo 2 pluto
    10 21 paperino 84 topolino

    ecc...

    Di questa lista tu hai l'esigenza di avere sempre le ultime 5 righe, Queste si aggiornano in real time?
    Che dati vuoi caricare? Di questi dati quali medie vuoi fare?

    E' complicato cercare di aiutarti se no.
    Quali medie vuoi fare?
    La media che voglio fare è quella aritmetica, tipo (8+4)/2=4. Dove ad ogni tempo t viene fatta la media dei valori del dato agli ultimi 5 periodi.

    Che dati vuoi caricare?
    nei file di testo i dati che voglio caricare rappresentano due colonne, non so se nel forum si può fare ma in caso posso allegare un file blocco note per far vedere come sono fatti i dati che vengono generati. Se con quali dati intendevi il tipo di dato, come ho già scritto uno è un int e uno è long.

    Si aggiornano in real time?
    Non so di preciso cosa intendi per real time, ma credo di sì. Quando il programma corre, il dato viene man mano stampato sul file. Faccio un esempio: poniamo una delle variabili che mi serve che è ProfitB[j]....innanzitutto gli agenti j sono bk, che è posto a 50, siccome ogni agente ha il suo profitB, ciò significa che di questi profitB[j] ce ne sono 50...poi siccome i periodi (del ciclo while) T, sono posti a 200...ciò significa che verrà generato un file blocco note che per quanto riguarda profitB[j] sarà dato da una colonna di 50*200 valori...perchè gli agenti sono 50, i periodi sono 200..il totale in questo esempio è 10000. Man mano che il programma corre, i file generati in ogni periodo vengono stampati su file.

    La colonna è fatta in questo modo: ci sono i bk (50) valori di profitB del periodo t=0 (uno per ogni agente j)...i 50 valori di profitB del periodo t=1..i 50 di t=2........fino a t=199 (sono 200, da 0 a 199). Io ho bisogno che ogni agente j, ad ogni periodo t, abbia in memoria i SUOI dati di betaI e profitB di:t-1,t-2,t-3,t-4,t-5 e che ne faccia la media aritmetica, che come si vede viene richiamata nell'algoritmo che ho scritto nel messaggio precedente. Nel caso specifico, visto che io ho bisogno di due dati tenuti in memoria, per ogni t io ho bisogno che l'agente abbia in memoria 5(betaI) + 5(profitB)=10 valori. E visto che gli agenti sono 50, in totale i valori da tenere in memoria ad ogni t sarebbero 10*50=500.
  • Re: Come fare in modo che il programma tenga in memoria dei dati

    Nessuno riesce ad aiutarmi? Se ancora qualcosa non è chiaro chiedete pure!
Devi accedere o registrarti per scrivere nel forum
10 risposte