2015-04-14 2 views
0

J'essaie de résoudre un problème linéaire dans PuLP qui minimise une fonction de coût. La fonction de coût est elle-même fonction de la valeur maximale de la fonction de coût, par exemple, j'ai un coût journalier et j'essaie de minimiser le coût mensuel, qui est la somme du coût journalier plus le coût journalier maximum du mois . Je ne pense pas que je capture la valeur maximale de la fonction dans la solution finale, et je ne suis pas sûr de savoir comment résoudre ce problème. Les grandes lignes du code est ci-dessous:Comment trouver le maximum d'un prob dans PuLP

# Initialize the problem to be solved 
prob = LpProblem("monthly_cost", LpMinimize) 

# The number of time steps 
# price is a pre-existing array of variable prices 
tmax = len(price) 
# Time range 
time = list(range(tmax)) 

# Price reduction at every time step 
d = LpVariable.dict("d", (time), 0, 5) 
# Price increase at every time step 
c = LpVariable.dict("c", (time), 0, 5) 

# Define revenues = price increase - price reduction + initial price 
revenue = ([(c[t] - d[t] + price[t]) for t in time]) 
# Find maximum revenue 
max_revenue = max(revenue) 

# Initialize the problem 
prob += sum([revenue[t]*0.0245 for t in time]) + max_revenue 

# Solve the problem 
prob.solve() 

La max_revenue variable est égale à toujours c_0 - D_0 + prix [0] même si le prix [0] n'est pas le maximum de prix et c_0 et les deux D_0 égale à 0. Est quelqu'un sait comment s'assurer que le maximum dynamique est inséré dans le problème? Merci!

Répondre

1

Je ne pense pas que vous pouvez faire ce qui suit dans Pulpes ou tout autre solveurs standard LP:

max_revenue = max(revenue)

En effet, déterminer le maximum exigera le solveur d'évaluer revenue équations; Donc, dans ce cas, je ne pense pas que vous pouvez extraire un modèle LP standard. De tels modèles sont en fait non-smooth.

Dans de telles situations, vous pouvez facilement reformuler le problème comme suit:

max_revenue >= revenue = ([(c[t] - d[t] + price[t]) for t in time])

Cela fonctionne, comme pour toute valeur de revenue: max_revenue >= revenue. Ceci aide à son tour à extraire un modèle LP standard des équations. Ainsi, la formulation du problème original est étendue avec des contraintes d'inégalité supplémentaires (les contraintes d'égalité et les fonctions objectives doivent être les mêmes qu'avant). Ainsi, il pourrait ressembler à ceci (mise en garde: Je n'ai pas testé):

# Define variable 
max_revenue = LpVariable("Max Revenue", 0) 

# Define other variables, revenues, etc. 

# Add the inequality constraints 
for item in revenue: 
    prob += max_revenue >= item 

Je suggère également que vous avez un oeil à scipy.optimize.linprog. PuLP écrit le modèle dans un fichier intermédiaire, puis appelle le solveur installé pour résoudre le modèle. D'un autre côté, dans scipy.optimize.linprog tout est fait en python et devrait être plus rapide. Cependant, si votre problème ne peut pas être résolu en utilisant un algorithme simplex, ou si vous avez besoin d'autres solveurs professionnels (par exemple CPlex, Gurobi, etc.) alors PuLP est un bon choix.

Voir également la discussion sur l'ajustement des données (page 19) dans Introduction to Linear Optimisation by Bertsimas.

Espérons que cela aide. À votre santé.

+0

Nous vous remercions de votre réponse. Je me doutais qu'il y avait un terme mathématique pour ce type de modélisation, je n'avais tout simplement pas compris. – Adam

+0

En ce qui concerne la reformulation du problème, je ne comprends pas très bien où cette ligne serait employée. Proposez-vous 'max_price> = revenue = ([(c [t] - d [t] + prix [t]) pour t dans le temps])' comme nouveau problème? Et max_revenue serait une variable? – Adam

+0

Oui, 'max_revenue' serait une variable. Ensuite, vous avez un autre ensemble de contraintes d'inégalité sous la forme: 'max_revenue> = revenue', à côté des contraintes d'égalité d'origine:' revenue = ([(c [t] - d [t] + prix [t]) pour t in temps]) '. Désolé, c'était un peu vague - je l'ai réparé maintenant. J'espère que cela t'aides. À votre santé. –