Passa ai contenuti principali

PuLP – Un valido strumento per la didattica

L'insegnamento dei concetti di base della ricerca operativa, ovvero la programmazione lineare, ha trovato nel corso degli ultimi anni diversi strumenti di supporto. Sono ormai parecchi i software gratuiti e open source che permettono agli studenti e agli insegnanti di toccare con mano le nozioni e i concetti spiegati e studiati sui banchi. Ricordiamo, ad esempio, glpk che con il suoi linguaggio di modellazione MathProg permettete di scrivere e risolvere anche complessi modelli di programmazione lineare intera. Oppure citiamo anche lp_solve che con il suo ambiente impropriamente chiamato lp_solve IDE permette di scrivere e risolvere modelli di programmazione lineare direttamente nella formulazione matematica.
A mio avviso però le proposte appena citate sono limitate nella potenza espressiva e nelle capacità di integrarsi con altri software o moduli esterni. Queste limitazioni sono egregiamente risolte da PuLP: un modellatore di problemi di programmazione lineare intera basato sul linguaggio di programmazione Python e la sua potenza espressiva e capacità di estendersi.
L'autore di PuLP è Jean-Sebastien Roy, raggiungibile all'indirizzo di posta elettronica js at jeannot.org. Non lo conosco personalmente, quindi le uniche cose che posso dire sono quelle che si evincono dal suo sito web.
Iniziamo ad analizzare un primo esempio di modello in PuLP che per quanto banale ne mostra tutte le potenzialità. Cominciamo con il primo concetto: le variabili.
La riga:
x = LpVariable(“x”, 0, 3)
crea una variabile di nome x, continua e che varia tra 0 e 3. Notiamo subito che la variabile x a sinistra dell'uguale è un oggetto python, cioè una variabile nel nostro linguaggio ospite.
Il secondo concetto di PuLP è il problema. Per creare un problema di minimizzazione si può scrivere una cosa tipo:
problema = LpProblem(“problema”, LpMinimize)
Come prima notiamo che problema è un oggetto Python.
Per aggiungere un vincolo al problema scriviamo:
problema += x+y <= 2
mentre per aggiungere la funzione obiettivo scriviamo:
problema += 3*x + z
A questo punto il nostro problema è pronto per essere risolto. PuLP permettete di usare diversi ottimizzatori, tra i quali GLPK, COIN CLP/CBC, CPLEX e XPRESS. Ad esempio possiamo scrivere:
problema.solve(GLPK())
per risolvere il nostro problema usando GLPK e:
value(x)
per saperne il valore.
L'esempio riportato è puramente esemplificativo e non completo, perché mancano le definizioni delle variabili y e z. In un prossimo post riporterò un esempio completo e più esteso per esemplificare altre caratteristiche di PuLP.
PuLP è distribuito con la completa disponibilità del file sorgente. Questo da la possibilità di modificare ed estendere a piacimento la libreria. Ad esempio è possibile aggiungere altri risolutori tra quelli disponibili essendo l'interfacciamento con questi realizzato tramite scambio di flussi di testo. Il flusso PuLP -> risolutore è supportato dal formato MPS; il flusso opposto è obbligatoriamente legato all'output del risolutore.

Commenti

Post popolari in questo blog

Digital Twin – Il caso Hyperloop

  Con il termine  hyperloop  si identificano una serie di tecnologie che promettono di rivoluzionare il trasporto di persone e cose. L’idea di base è molto semplice: far viaggiare all’interno di tubi, dove viene creato il vuoto, delle capsule ad alta velocità con binari a levitazione magnetica.   Credits: Virgin Hyperloop on instagram.com/p/CRHEB9ctQ6u/   Qualche tempo fa, mi è capitato di leggere un interessante articolo su come la progettazione della soluzione guidata dal gruppo Virgin, sia stata affiancata da analisi svolte mediante un sistema di ottimizzazione matematica. Come meglio descritto nel seguito, un digital twin, completamente basato su un modello matematico di ottimizzazione, permette di valutare le migliori scelte progettuali tenendo in considerazione i vari obiettivi di progetto.   La necessità di avere un digital twin nasce probabilmente dal fatto che le tecnologie  hyperloop  non hanno una base di partenza già esistente. No...

Dispense di ricerca operativa

Vi sottopongo alla vostra attenzione le dispense del corso di ricerca operativa, a cura della professoressa Laura Palagi . Scorrendo l'indice si possono molti argomenti interessanti, sia teorici che pratici. Questa dispensa conta ben 229 pagine, per cui è molto più vicino ad un buon manuale che a delle semplici dispense di un corso universitario. Ricerca Operativa PDF

Teoria dell'incertezza

Dal sito internet del Prof. Baoding Liu ho trovato due interessanti libri sulla teoria dell'incertezza. Uncertainty Theory Uncertainty theory is a branch of mathematics based on normality, monotonicity, self-duality, and countable subadditivity axioms. The goal of uncertainty theory is to study the behavior of uncertain phenomena such as fuzziness and randomness. The main topics include uncertainty theory, probability theory, credibility theory, and chance theory. This book provides a self-contained, comprehensive and up-to-date presentation of uncertainty theory. The purpose is to equip the readers with an axiomatic approach to deal with uncertainty. Theory and Practice of Uncertain Programming Real-life decisions are usually made in the state of uncertainty (fuzziness and randomness). How do we model optimization problems in uncertain environments? How do we solve these models? In order to answer these questions, this book provides a self-contained, comprehensive and up-to-date ...