Saltar al contenido

[2021] Cómo resolver problemas de optimización con Python {DH}

junio 23, 2022
05z5Kszb0t 5suydH


Cómo usar la biblioteca PuLP para resolver problemas de programación lineal con unas pocas líneas de código

31 de enero·6 minutos de lectura

Foto de Charles Deluvio en Unsplash

La programación lineal (u optimización lineal) es el proceso de obtener el mejor resultado en problemas matemáticos con restricciones. PuLP es una biblioteca poderosa que ayuda a los usuarios de Python a resolver este tipo de problemas con solo unas pocas líneas de código.

Descubrí que PuLP es la biblioteca más fácil de resolver tHEste tipo de problemas de optimización lineal. La función objetivo y las restricciones se pueden agregar en un interesante enfoque de varias capas con solo una línea de código a la vez. Esto significa que podemos pasar menos tiempo codificando y más tiempo resolviendo el problema. La documentación también es fácil de leer e incluye cinco estudios de casos fáciles de entender.

En este artículo, usamos datos de Fanduel Daily Fantasy Sports (DFS) para demostrar cómo resolver un problema de maximización de restricciones múltiples. La intención es que estos pasos sean generalizables a otros problemas que quieras resolver.

Trabajaremos con datos DFS, ya que nos permite pasar por todo el proceso, desde comprender un problema del mundo real hasta definir el problema en términos de una función objetivo y restricciones, hasta codificar una solución en Python. Todos estos pasos son una parte importante de cualquier problema de programación lineal. DFS es un contexto que es lo suficientemente simple para comprender estos pasos, pero lo suficientemente complejo como para permitir la discusión sobre ellos.

Si desea continuar, los datos están disponibles gratuitamente siguiendo los pasos a continuación:

  1. Crea una cuenta de fantasía gratis en Fanduel
  2. Ve a la pestaña NBA en el lobby
  3. Haga clic en una de las competencias a continuación, luego haga clic en el botón Ingresar nueva alineación.
  4. Finalmente, haga clic en «Descargar lista de jugadores» en la parte superior de la página para recibir los datos como un archivo csv.
Foto de JC Gallidon en Unsplash

Antes de sumergirnos en el artículo, echemos un vistazo rápido a cómo Fanduel estructura sus competiciones de la NBA.

Este trasfondo forma la base de cómo queremos establecer nuestras restricciones en el problema que estamos tratando de resolver. Siempre es necesario comprender el problema de la programación lineal antes de sentarse a escribir código. Esto nos ayuda a formular nuestras restricciones y funciones objetivo cuando nos sentamos a escribir el código.

El objetivo es construir una alineación de 9 jugadores que anote tantos puntos como sea posible. Los jugadores ganan puntos haciendo cosas exitosas en el juego ese día, como: B. anotar puntos o recibir un rebote, y perder puntos por acciones negativas, como. Cada jugador de baloncesto recibe un salario imaginario (de Fandeul) para ese día y obtienes $60,000 para asignar a esos jugadores. Debes seleccionar 2 bases, 2 escoltas, 2 aleros, 2 ala-pivotes y 1 pívot.

Foto de rupixen.com en Unsplash

Ahora que tenemos una buena comprensión del problema que estamos tratando de resolver, defínalo formalmente usando nuestra función objetivo:

  • Maximiza los puntos esperados de nuestros 9 jugadores.

y limitaciones que queremos agregar a nuestro problema:

  1. Solo compre un jugador un máximo de 1 vez.
  2. Tiene 2 bases, 2 escoltas, 2 aleros, 2 ala-pivotes y 1 centro.
  3. No gastes más de $60,000.

Ahora podemos comenzar a escribir código para resolver este problema. Dado que este es un artículo de optimización (y no resultados pronosticados), usaremos los puntos promedio anotados por cada jugador como nuestros puntos pronosticados para hoy. Si tuviéramos que construir un verdadero optimizador de Fanduel, querríamos refinar nuestras estimaciones para incluir otras variables como enfrentamientos y tiempo de juego esperado para cada jugador.

configuración inicial

Primero, instalemos el paquete usando pip en la línea de comando:

pip install pulp

e importe los paquetes requeridos en nuestro cuaderno Jupyter o IDE:

from pulp import *
import pandas as pd

Entonces también leeremos nuestros datos pd.read_csv() Danos un Pandas DataFrame que contenga Nickname (nombre del jugador en fanduel), FPPG (puntaje promedio que este jugador tiene por juego), SalaryY Position llamaremos variables data.

Configurar estructuras de datos

Ahora necesitamos definir nuestras variables usando diccionarios ya que estas son las estructuras de datos que PuLP Aplicaciones:

# Get a list of players
players = list(data['Nickname'])
# Initialize Dictionaries for Salaries and Positions
salaries = dict(zip(players, data['Salary']))
positions = dict(zip(players, data['Position']))
# Dictionary for Projected Score for each player
project_points = dict(zip(players, data['FPPG']))
# Set Players to Take either 1 or 0 values (owned or not)
player_vars = LpVariable.dicts("Player", players, lowBound=0, upBound=1, cat="Integer")

Todas menos las últimas líneas configuran diccionarios que hacen referencia a los nombres de los jugadores almacenados en ellas Nickname otras variables que nos interesan.

La última línea utilizada LpVariables define las variables asociadas con el segundo argumento…


[2021] Cómo resolver problemas de optimización con Python {DH}