TdP-prove-finali / Introduzione

Istruzioni e documentazione per la proposta e lo svolgimento delle prove finali relative al corso di Tecniche di Programmazione.
http://bit.ly/tecn-progr
Apache License 2.0
4 stars 13 forks source link

Ottimizzazione della performance di un mazzo in un gioco di carte collezionabili #88

Closed leopriami closed 2 years ago

leopriami commented 2 years ago

Studente proponente

s244710 Priami Leonardo

Titolo della proposta

Applicazione per la simulazione dei formati limited di magic: the gathering e conseguente ottimizzazione del mazzo da utilizzare in tali formati in modo da renderlo il più performante possibile.

Descrizione del problema proposto

Magic: the gathering è il gioco di carte collezionabili più conosciuto e giocato al mondo; la sua popolarità deriva dal fatto che può essere giocato in più modalità (formati) differenti, attirando quindi un maggior numero di giocatori rispetto ad altri suoi competitors.

Essendo un gioco di carte collezionabili, ogni giocatore utilizza un mazzo proprio, composto da carte appartenenti alla sua collezione personale rispettando dei vincoli che possono variare a seconda del formato scelto; in alcuni di questi formati però, denominati appunto “limited”, la scelta delle carte da includere nel mazzo è limitata al contenuto di 6 pacchetti da 15 carte ciascuno aperti poco prima dell’inizio della partita o del torneo.

I giocatori dovranno quindi creare un mazzo di 40 carte a partire dalle 90 aperte in questo modo e da altre carte “base”, messe a disposizione gratuitamente dall’organizzatore dell’evento e uguali per tutti i giocatori.

Questa applicazione si pone l’obiettivo di simulare l’apertura dei pacchetti e di creare il mazzo più performante possibile tramite l’utilizzo di un algoritmo ricorsivo.

Descrizione della rilevanza gestionale del problema

Nonostante per la maggior parte dei giocatori sia solo un passatempo, c’è chi ha fatto di magic la sua professione e chi aspira a farlo.

A tale scopo, fare le scelte giuste durante la costruzione del mazzo è importante tanto quanto fare le giocate migliori durante una partita, e questo richiede una particolare abilità nel calcolare a mente numerose probabilità con poco tempo a disposizione.

Questa applicazione risolverebbe tale problema e sarebbe di aiuto a tutti i giocatori che vogliono migliorare la propria performance senza il bisogno di acquisire le conoscenze statistiche necessarie.

Inoltre, il modello utilizzato per ottimizzare il mazzo potrebbe essere applicato anche alla risoluzione di problemi in ambito industriale o aziendale.

Descrizione dei data-set per la valutazione

I dati utilizzati per la risoluzione del problema verranno tratti dal database al link seguente: https://mtgjson.com/

Tutti gli attributi necessari alla risoluzione del problema sono contenuti nel file denominato AllPrintings (esportabile in SQL) o sono da questi calcolabili.

Le tabelle del database utilizzate saranno Set, che rappresenta le diverse espansioni del gioco, e Card, che rappresenta singolarmente ciascuna carta con i propri parametri di gioco necessari all’implementazione dell’algoritmo.

Descrizione preliminare degli algoritmi coinvolti

Il primo passo per la risoluzione del problema consiste nel simulare l’apertura di 6 pacchetti da 15 carte ciascuno.

Per fare ciò, verranno selezionate in maniera casuale 15 carte tra quelle contenute nell’espansione selezionata dall’utente per 6 volte (la stessa carta non può essere presente in più di una copia nello stesso pacchetto, ma potrebbe essere contenuta in più pacchetti).

Una volta determinate le 90 carte disponibili, a ciascuna di esse verrà attribuito un valore che ne indica la forza, ovvero il vantaggio che fornisce a chi la gioca nel corso di una partita, basandosi su parametri di gioco già contenuti all’interno della tabella Card presente nel database.

Le carte di magic: the gathering si suddividono in 5 colori (bianco, blu, nero, rosso, verde) e in 2 tipi (terra e magia).

Le terre avranno un valore di forza nullo, poiché il loro unico scopo all’interno del gioco è quello di consentire al giocatore di giocare le magie: ogni magia ha un costo in termini di terre necessarie per poter essere giocata, che ne specifica il numero e il colore.

Le magie avranno invece un valore di forza proporzionale al loro costo e alla loro rarità.

A questo punto verrà implementata una funzione di ottimizzazione ricorsiva che partendo dalla carta più forte costruirà un mazzo di 40 carte ottimizzandone la performance, dove per performance si intende la somma delle forze delle singole magie contenute al suo interno, ciascuna moltiplicata per la probabilità di pescare le terre necessarie a giocare la rispettiva magia.

Si noti che non sarà sufficiente selezionare le carte più forti, perché costi di gioco troppo alti o troppo differenti tra loro in termini di colore diminuiranno notevolmente la probabilità di pescare le terre necessarie per poter giocare tutte le magie all’interno del mazzo.

Descrizione preliminare delle funzionalità previste per l’applicazione software

L’utente potrà selezionare l’espansione della quale ricevere i 6 pacchetti da aprire, e cliccando un pulsante “apri pacchetti” riceverà come output una lista dei nomi delle carte aperte in questo modo.

Dopodiché, cliccando un pulsante “crea mazzo perfetto”, l’utente potrà visionare la lista delle 40 carte contenute nel mazzo più performante possibile, selezionate tra le 90 aperte e quelle “base” messe a disposizione di tutti i giocatori.

Inoltre, nel caso in cui l’utente avesse trovato una o più carte che gli piacciono al punto di volerle giocare a tutti i costi, sarà disponibile una funzione in grado di determinare il mazzo migliore tra tutti quelli possibili che includono le carte selezionate.

fulcorno commented 2 years ago

Premesso che non ci capisco nulla sui giochi di carte, mi sembra una proposta interessante. I dati di partenza mi sembrano tutti disponibili e ben validati (da capire se il formato SQL disponibile sia compatibile con MariaDB, in caso contrario conviene ripartire dal JSON). L'idea di "forzare" alcune carte da parte dell'utente mi sembra utile, e direi di lasciarla sicuramente tra le specifiche.

L'unico dubbio che mi rimane è il criterio con cui si dice che un mazzo è "perfetto", o in generale un mazzo sia migliore di un altro. La formula che proponi (somma di forze x probabilità) è stata inventata, o è in qualche modo riconosciuta dai giocatori? esiste qualche criterio per dire che questa formula fornisca realmente una maggior probabilità di vincita? Altrimenti, si rischia di ottimizzare rispetto ad una funzione di ottimizzazione "qualsiasi", ed allora tanto vale...

La proposta è accettata, ma ti chiederei di precisare meglio in merito alla funzione di valutazione.

leopriami commented 2 years ago

Buongiorno professore, mi scuso per il ritardo nella risposta ma ho avuto dei problemi di connessione in casa. Per quanto riguarda la formula proposta, è riconosciuta dai giocatori la correlazione tra il costo di una carta e l'impatto che essa avrà nel corso di una partita; ho scelto io di moltiplicare quel valore per la probabilità di riuscire a giocarla per evitare che l'algoritmo scelga semplicemente le 40 carte più forti senza tenere conto dei diversi requisiti di gioco di ognuna. In alternativa alla forza determinata dal costo, che come valore è accurato ma potrebbe presentare delle lievi eccezioni in alcune carte, esiste un voto attribuito a ciascuna carta dai giocatori più forti del mondo sulla base della propria esperienza; il problema è che non sono riuscito a trovare un database che includesse anche la valutazione delle carte, che andrebbe quindi inserita manualmente per ciascuna. Magari posso far scegliere all'utente se utilizzare questo metodo di valutazione alternativo per l'espansione più recente? (inserire il voto manualmente per tutte le espansioni non è fattibile, si parla di decine di migliaia di carte) Grazie in anticipo

Leonardo Priami

Il 2022-06-05 22:41 Fulvio Corno ha scritto:

Premesso che non ci capisco nulla sui giochi di carte, mi sembra una proposta interessante. I dati di partenza mi sembrano tutti disponibili e ben validati (da capire se il formato SQL disponibile sia compatibile con MariaDB, in caso contrario conviene ripartire dal JSON). L'idea di "forzare" alcune carte da parte dell'utente mi sembra utile, e direi di lasciarla sicuramente tra le specifiche.

L'unico dubbio che mi rimane è il criterio con cui si dice che un mazzo è "perfetto", o in generale un mazzo sia migliore di un altro. La formula che proponi (somma di forze x probabilità) è stata inventata, o è in qualche modo riconosciuta dai giocatori? esiste qualche criterio per dire che questa formula fornisca realmente una maggior probabilità di vincita? Altrimenti, si rischia di ottimizzare rispetto ad una funzione di ottimizzazione "qualsiasi", ed allora tanto vale...

La proposta è accettata, ma ti chiederei di precisare meglio in merito alla funzione di valutazione.

-- Reply to this email directly, view it on GitHub [1], or unsubscribe [2]. You are receiving this because you were assigned.Message ID: @.> [ { @.": "http://schema.org", @.": "EmailMessage", "potentialAction": { @.": "ViewAction", "target": "https://github.com/TdP-prove-finali/Introduzione/issues/88#issuecomment-1146880171", "url": "https://github.com/TdP-prove-finali/Introduzione/issues/88#issuecomment-1146880171", "name": "View Issue" }, "description": "View this Issue on GitHub", "publisher": { @.***": "Organization", "name": "GitHub", "url": "https://github.com" } } ]

Links:

[1] https://github.com/TdP-prove-finali/Introduzione/issues/88#issuecomment-1146880171 [2] https://github.com/notifications/unsubscribe-auth/AOYTW5R7UK2SRY2BQHDKKXLVNUGI7ANCNFSM5W4VY3RQ