PDA

View Full Version : [C]Progetto algoritmi "Bunga-Bunga"


matteo.pata
24-01-2011, 21:16
Buonasera a tutti ragazzi,
sono alle prese con il mio progetto di algoritmi per l'università.
E' il terzo che cerco di fare i primi due non sono andati nel senso che non sono mai riuscito a consegnare purtroppo.
Le mie conoscenze del C sono molto basse e in più non sono molto ferrato lo ammetto senza nessun problema.
Sono qui a chiedervi una mano a tutti per poter consegnare con il vostro aiuto il progetto.
Vi posto le specifiche con la speranza che voi con la vostra capacità di programmatori riusciate a portarmi sulla strada giusta per utilizzare la miglior struttura dati e che non sia troppo complicata.;) :help:

SPECIFICHE:

Bisogna scrivere un programma che legga da un le una sequenza di eventi, come l'introduzione di una
nuova persona nel gruppo delle cene, l'estromissione dallo stesso gruppo di elementi caduti in disgrazia, o
l'indizione di una cena nella villa del presidente. Per alcuni eventi, il programma deve produrre in output
alcuni dati statistici (vedi sotto).
Nel seguito compare una descrizione dei tre tipi di evento, compreso il modo in cui vengono codi cati nel file di input.

1.1 Evento: introduzione di una persona

http://img820.imageshack.us/img820/654/cattura3h.jpg (http://img820.imageshack.us/i/cattura3h.jpg/)


Il campo presenze è una stringa, costruita sull'alfabeto fL,M,E,G,V,S,Dg, che descrive i giorni della
settimana nei quali il nuovo arrivato o la nuova arrivata è disponibile per le cene (ogni settimana). I giorni della settimana da Lunedì a Domenica sono rappresentati rispettivamente dalle lettere maiuscole
L,M,E,G,V,S,D (mErcoledì dalla lettera E).
Se il nuovo arrivato è un uomo, allora si tratta di un membro del governo o di altra persona entrata
nelle simpatie del presidente. In questo caso, il dato denaro rappresenta la somma massima che questa
persona può corrispondere a una persona che bene cia della sua disinteressata generosità (in una singola
operazione di donazione), mentre i campi da età a costituzione non si riferiscono ai suoi tratti sici ma
rappresentano i tratti che tendono a stimolare in lui istinti lantropici. Ad esempio, se età vale 17,
signi ca che il membro dell'entourage presidenziale in questione si prende particolarmente a cuore i casi
dei cittadini di 17 anni di età.
Se il nuovo arrivato è di sesso femminile, allora è una giovane (o giovanissima) donna che è stata indivi-
duata tramite appositi meccanismi come bisognosa ed è ammessa a partecipare alle cene. In questo caso,
il campo denaro rappresenta l'entità monetaria del bisogno, e i campi da età a costituzione rappresentano
gli e ettivi tratti sici della persona.


1.2 Evento: estromissione di una persona

http://img248.imageshack.us/img248/3087/catturajr.jpg (http://img248.imageshack.us/i/catturajr.jpg/)



La persona che esce dal giro può essere un uomo o una donna. Non parteciperà più a nessuna cena del
presidente (gli uomini, perchè caduti in disgrazia - ad es. per tradimento; le donne, di solito, per perdita
dei requisiti).


1.3 Evento: cena sociale

http://img256.imageshack.us/img256/7715/cattura1s.jpg (http://img256.imageshack.us/i/cattura1s.jpg/)


Dopo la cena svoltasi nel giorno speci cato, vengono scambiate fra i partecipanti <n> somme di denaro:
per <n> volte, si trova la coppia più affine di sesso opposto (che ancora non abbia interagito in questo bun-
gabunga) i cui membri siano entrambe presenti il giorno speci cato. L'uomo scelto aiuta economicamente
la ragazza scelta.
Come si può facilmente immaginare, la lantropia richiede di solito una certa privacy e quindi benefattore e bene ciata si appartano, ma non necessariamente a coppie. Infatti, secondo la regola descritta,
può benissimo succedere che un uomo (particolarmente generoso) bene ci più di un concittadino, o che
un concittadino (particolarmente in difficoltà) si faccia aiutare da più di un benefattore. Quello che
succede è che la comitiva si divide nel massimo numero di gruppetti, in modo che tutte le coppie bene-
fattore/bene ciato si trovino insieme. Ad esempio, se bungabunga G 7 calcola l'insieme delle 7 coppie
più affini presenti di giovedì, poniamo {(u1; d1); (u1; d3); (u2; d3); (u4; d2); (u4; d5); (u3; d4); (u5; d4)}, i tre
gruppetti {u1; u2; d1; d3}, {u4; d2; d5} e {u3; u5; d4} si apparteranno in tre stanze separate.
In risposta a questo evento, il programma dovràstampare in output una riga con tre numeri: il numero
di gruppi che vengono a formarsi e il numero di benefattori (uomini) e bene ciate (donne) presenti nel
gruppo piu' numeroso (in caso di parita', quello con piu' uomini), nell'esempio in questione, (3; 2; 2).
Nota: ci saranno di solito anche partecipanti alla cena di entrambi i sessi che non partecipano a nessuno
scambio di denaro; queste persone, durante il bungabunga in oggetto, rimangono a tavola e non vanno
conteggiate in nessun gruppo.


1.3.1 Determinare l'affinità di una coppia
Il grado di affinità di una coppia è quanti cabile con un numero reale che dipende dalla somiglianza, fra
i due, dei valori dei campi da denaro a costituzione (compresi). Speci catamente, sarà un valore dato
dalla somma pesata delle di erenze in modulo fra i rispettivi campi (il peso è il fattore di importanza del
rispettivo campo):

http://img146.imageshack.us/img146/9201/cattura2f.jpg (http://img146.imageshack.us/i/cattura2f.jpg/)


Gli eventuali casi di parità fra i gradi di affinità di due coppie si possono dirimere in maniera arbitraria.


2 Il progetto da consegnare
2.1 Input e Output
Il programma deve prendere dalla riga di comando il nome del le di input (un le di testo contente
un comando per riga). Deve scrivere in risposta, nello standard output, una riga per ogni evento di
bungabunga, come descritto sopra.

2.2 Altri vincoli
La correttezza delle soluzioni è un requisito necessario. Un progetto sarà considerato più o meno valido
rispetto all'efficienza (tempo di calcolo) nel risolvere le istanze del problema di dimensioni via via crescenti.
La s da consiste nel fornire una soluzione che riesca a risolvere in tempi ragionevoli le istanze più complesse
possibili.


2.3 Dimensioni delle tipiche istanze del problema
La classe politica della Repubblica di Bananas (nella lingua locale: la \cricca") si sta velocemente espan-
dendo, per poter sempre meglio servire i propri cittadini. Si prevede che la pratica del bungabunga andrà
consolidandosi del pari, arrivando a coinvolgere un numero sempre maggiore di persone. Per il 2020, non
saranno forse infrequenti giri di migliaia di persone ospitate settimanalmente o forse anche più.


Ringrazio tutti in anticipo per l'aiuto che sono sicuro riuscirete a darmi...:help: :help: :help:

dojolab
24-01-2011, 21:20
Se studi all'Insubria e questo è un progetto del Prof. di ALgoritmi e Strutture dati (per privacy non faccio il nome) lo sto stimando troppo!

gugoXX
24-01-2011, 21:59
L'aiuto si puo' dare a chi deve correggere deglio errori o chiede cose specifiche.
Quindi non so quanto aiuto troverai qui.

Detto questo, chi ha inventato il testo e' davvero spiritoso.

Tommo
24-01-2011, 22:52
Chi è il genio della sottigliezza che ha creato questo testo :asd:

Cmq non si fanno compiti, too bad:D

matteo.pata
24-01-2011, 23:13
Ragazzi non vhiedo la soluzione (anche se sarebbe comoda)...chiedo solo unp o' di aiuto nel scegliere la struttura dati da utilizzare tutto qua....

Si faccio l'università a Varese...

dojolab
25-01-2011, 06:17
Si faccio l'università a Varese...

Sto stimando il Docente. :D :D :D :D :D.
Avessi avuto io questo compito ci avrei messo 100 volte l'impegno :D

matteo.pata
25-01-2011, 21:38
up

bobbytre
26-01-2011, 02:02
up

se non posti prima una tua soluzione , indicando dove non riesci ad andare avanti nessuno ti potrà dare una mano...

matteo.pata
26-01-2011, 18:37
VA bene ragazzi io ho provato a mettere giù qualcosa su carta. Ho pensato ad alberi per ogni ogni giorno della settimana e in più avevo pensato di fare due alberi uno per gli uomini e uno per le donne quindi in totale 14 alberi.
Il mio problema sta nel fatto di come inserire gli uomini e le donne negli alberi.
Nel senso....quale chiave uso per ordinarli?
La mia idea sta in piedi oppure per niente.
L'idea di avere alberi per ogni giorno della settimana è interessante oppure sono fuori strada?

Grazie per le risposte..:help: :help: :help:

matteo.pata
27-01-2011, 18:23
up....dai ragazzi qualche anima pia che mi da una mano per favore :help: :help:

matteo.pata
28-01-2011, 19:02
UP

matteo.pata
29-01-2011, 14:16
UP ragazzi nessuno riesce a darmi una mano...:help: :help: :help:

radeon_snorky
30-01-2011, 09:09
scusa la domanda... ma l'affinità M-F deve essere perfetta?
cioè il bungabunga avviene solo tra M-F perfettamente affini?
il bungabunga avviene sempre?
più volte in una cena?
un M dona solo una volta a cena?
una F si "dona" solo una volta a cena?
se tra M-F c'è affinità di caratteri ma la richiesta di F è minore si concretizza il bungabunga?

da meditare...

propenderei un approccio fuzzy.... o meglio fucky!

xura
30-01-2011, 21:37
ciao, voi come fareste per la parte delle coppie, tipo, se ho 7 coppie:
{ (u1, d1); (u1, d3); (u2,d3); (u4,d2); (u4,d5); (u3, d4); (u5,d4) }

come faccio a dividerle nel massimo numero di gruppetti, in modo che tutte le coppie si trovino insieme ??? :oink:

ottenendo quindi 3 gruppetti:

{ u1; u2; d1; d3 }, { u4; d2 ; d5 } e { u3; u5; d4 } :confused: :muro:

grazie dell'aiuto !! :help:

goldorak
31-01-2011, 08:00
ciao, voi come fareste per la parte delle coppie, tipo, se ho 7 coppie:
{ (u1, d1); (u1, d3); (u2,d3); (u4,d2); (u4,d5); (u3, d4); (u5,d4) }

come faccio a dividerle nel massimo numero di gruppetti, in modo che tutte le coppie si trovino insieme ??? :oink:

ottenendo quindi 3 gruppetti:

{ u1; u2; d1; d3 }, { u4; d2 ; d5 } e { u3; u5; d4 } :confused: :muro:

grazie dell'aiuto !! :help:

Usa un classico algoritmo di union-find. :p

xura
31-01-2011, 21:36
non avendo fatto nessun algo union find - ne fuzzy l'unica cosa che mi viene in mente sarebbe di utilizzare i grafi e calcolare le componenti connesse... ma forse :mc: è troppo...
grazie di eventuali suggerimenti !

goldorak
31-01-2011, 21:55
non avendo fatto nessun algo union find - ne fuzzy l'unica cosa che mi viene in mente sarebbe di utilizzare i grafi e calcolare le componenti connesse... ma forse :mc: è troppo...
grazie di eventuali suggerimenti !


Union Find : http://en.wikipedia.org/wiki/Union_find

Come punto di partenza puo' andare. Poi qualsiasi libro di algoritmi ha un capitolo dedicato agli algoritmi di union find.

E qui grazie a un po' di google-fu ha una pagina in italiano con tanti riferimenti agli algoritmi di union find.

http://www.google.it/search?hl=it&source=hp&q=algoritmi+union+find&aq=f&aqi=g10&aql=&oq=

Per risolvere il tuo problema non servono tecniche fuzzy o fare affidamento a grafi. Basta un semplice, e ripeto semplice algoritmo union find.

matteo.pata
01-02-2011, 21:20
qualche altra soluzione oltre all'algoritmo union find per raggruppare le coppie??
come sarebbe meglio gestirli le persone??

Darecon
02-02-2011, 18:25
qualche altra soluzione oltre all'algoritmo union find per raggruppare le coppie??
come sarebbe meglio gestirli le persone??

Perche' non va bene union find? Massazza l'ha sempre spiegato, quindi se la tua finalità e' passare l'esame non vedo perche' non usarlo.. Puo' anche essere usato con un solo array e/o con la compressione dei cammini.. :D

matteo.pata
02-02-2011, 21:07
Perche' non va bene union find? Massazza l'ha sempre spiegato, quindi se la tua finalità e' passare l'esame non vedo perche' non usarlo.. Puo' anche essere usato con un solo array e/o con la compressione dei cammini.. :D

Dicevo che va bene l'union find però volevo capire dove e come memorizzare le persone che struttura dati utilizzare.

goldorak
03-02-2011, 07:59
Dicevo che va bene l'union find però volevo capire dove e come memorizzare le persone che struttura dati utilizzare.


Le strutture dati da utilizzare dipendono dalle operazioni a cui devono essere soggette. E le operazioni sono determinate dalle specifiche del problema in questione. Dal problema risulta che devi avere delle operazioni per inserire e rimuovere persone dalla struttura dati, e inoltre le operazioni devono essere efficienti. Ovverosia devono avere una complessita' logaritmica. Roba tipo liste semplici o array non vanno bene perche' al crescere dei dati di input ti ritrovi con complessita' quadratica nel caso peggiore.
Vanno bene alberi (meglio se bilanciati quindi alberi AVL, alberi 2-3, alberi 2-3-4, alberi red-black etc...). La scelta e' sterminata prendi quello che ti risulta piu' semplice da implementare.
Un altra struttura dati efficiente e' quella delle skip lists.

Tutte queste strutture sono spiegate nei vari libri sugli algoritmi (Comer Leiserson Rivest, etc...)

Infine per memorizzare i dati. Le strutture dati si classificano in due grosse famiglie, strutture dati endogene e strutture dati esogene.
Nelle strutture dati endogene gli attributi dei dati che vuoi memorizzare vanno inseriti direttamente nei nodi della struttura dati. Nelle strutture dati esogene invece di mantenere direttamente gli attributi nel nodo si mantiene un semplice puntatore ad una struttura (in genere un record) che conterra' gli attributi dei dati.

Sta a te decidere se vuoi usare una struttura dati endogena o esogena. E una questione di comodita'. Ovviamente nei nodi della struttura dati ci potranno essere anche dei puntatori ad altre strutture dati se questo si rendesse necessario dal problema.

matteo.pata
03-02-2011, 16:02
Grazie mille sei stato molto esaustivo e di molto aiuto....

Vincenzo1968
04-02-2011, 16:59
http://milano.repubblica.it/cronaca/2011/02/03/foto/l_algoritmo_del_bunga_bunga-12017379/1/

goldorak
04-02-2011, 17:18
http://milano.repubblica.it/cronaca/2011/02/03/foto/l_algoritmo_del_bunga_bunga-12017379/1/


:sbonk: