【问题标题】:python pulp: How do I create LpMaximize and LpMinimize problem?python 纸浆:如何创建 LpMaximize 和 LpMinimize 问题?
【发布时间】:2020-03-29 22:59:52
【问题描述】:

如何创建 LpMaximize 利润和 LpMinimize 方差的优化?

我尝试将 var 设为负数而不是使用 LpMaximize。下面的代码只是 var 的最大值,而不是 var 的最小值和利润的最大值。

  prob += lpSum([profits[i]*x[i] for i in N] and [var[v]*x[v] for v in N]) #tried this

  my full code is below 


 from pulp import *
 # PROBLEM DATA:
 costs = [15, 25, 35, 40, 45, 55]
 profits = [1.7, 2, 2.4, 3.2, 5.6, 6.2]
 var=[24, 12, 24, 32, 52, 62]
 city = ["NYC","SF","LA","SF","NYC","LA"] 
 max_cost = 2500
 max_to_pick = 4

 # DECLARE PROBLEM OBJECT:
 prob = LpProblem("Mixed Problem", LpMaximize)
 # VARIABLES
 n = len(costs)
 N = range(n)
 x = LpVariable.dicts('x', N, cat="Binary")

 # OBJECTIVE
 prob += lpSum([profits[i]*x[i] for i in N] and [var[v]*x[v] for v in N])



 # CONSTRAINTS
 prob += lpSum([x[i] for i in N]) == max_to_pick   # to include
 prob += lpSum([x[i]*costs[i] for i in N]) <= max_cost  # Limit max.

# NEW CONSTRAINT
for c in set(city):
  index_list = [i for i in N if city[i] == c] 
  prob += lpSum([x[i] for i in index_list]) <= 1

# SOLVE & PRINT RESULTS
prob.solve()
print(LpStatus[prob.status])
print('Profit = ' + str(value(prob.objective)))
print('Cost = ' + str(sum([x[i].varValue*costs[i] for i in N])))

for v in prob.variables ():
   print (v.name, "=", v.varValue)

非常感谢!

我认为这是最终的答案

   from pulp import *
   # PROBLEM DATA:
   costs = [15, 25, 35, 40, 45, 55]
   profits = [1.7, 2, 2.4, 3.2, 5.6, 6.2]
   var=[24, 12, 24, 32, 52, 62]
   city = ["NYC","SF","LA","SF","NYC","LA"] 
   max_cost = 2500
   max_to_pick = 4

   # DECLARE PROBLEM OBJECT:
   prob = LpProblem("Mixed Problem", LpMaximize)
   # VARIABLES
   n = len(costs)
   N = range(n)
   x = LpVariable.dicts('x', N, cat="Binary")

    # OBJECTIVE
   prob += lpSum([profits[i]*x[i] for i in N])



   # CONSTRAINTS
  prob += lpSum([x[i] for i in N]) == max_to_pick    #Limit number 
  prob += lpSum([x[i]*costs[i] for i in N]) <= max_cost  #max cost


  # NEW CONSTRAINT
 for c in set(city):
   index_list = [i for i in N if city[i] == c] 
   prob += lpSum([x[i] for i in index_list]) <= 1





  # SOLVE & PRINT RESULTS
  prob.solve()

  obj = value(prob.objective)
  print(LpStatus[prob.status])
  print('obj = ' + str(value(prob.objective)))

 # MODIFY PROBLEM FOR 2ND PROBLEM
  prob.sense = LpMinimize # change sense to LpMinimize
  prob += lpSum([var[v]*x[v] for v in N]) # Reset the objective
  prob += lpSum([profits[i]*x[i] for i in N]) == obj #Add constraint 
  fixes profits

  # SOLVE 2ND PROBLEM
 prob.solve()
 print(LpStatus[prob.status])
 print('obj = ' + str(value(prob.objective)))
 print('Profits ='+str(sum([x[i].varValue*profits[i] for i in N])))
 print('Variance = ' + str(sum([x[i].varValue*var[i] for i in N])))
 print('Cost = ' + str(sum([x[i].varValue*costs[i] for i in N])))

我使用 Magnus Åhlander 的组合解决方案。最大化利润和最小化变量。

【问题讨论】:

    标签: python pandas optimization mathematical-optimization pulp


    【解决方案1】:

    两种可能的方法:

    1. 最大化一个目标(利润),然后将其添加为约束并求解另一个目标(方差)。
    2. 使目标成为加权和(就像您正在做的那样,只需否定方差部分)。

    编辑:

    方法 1 的详细信息:

    首先,解决第一个问题(最大化利润):

    ...
    # DECLARE PROBLEM OBJECT:
    prob = LpProblem("Mixed Problem", LpMaximize)
    
    # OBJECTIVE
    prob += lpSum([profits[i]*x[i] for i in N])
    ...
    

    然后,解决第二个问题(最小化方差),从而通过额外的约束来固定利润(使用第一个解决方案中的 obj 值):

    ...    
    # DECLARE PROBLEM OBJECT:
    prob = LpProblem("Mixed Problem", LpMinimize)
    
    # OBJECTIVE
    prob += lpSum([var[v]*x[v] for v in N])
    
    # Extra constraint that fixes profits     
    prob += lpSum([profits[i]*x[i] for i in N]) == <<obj from solving first problem>>
    ...
    

    编辑 2

    如何修改第二个问题的模型(目标被修改后会发出警告):

    ...
    prob.solve()
    obj = value(prob.objective)
    print(LpStatus[prob.status])
    print('obj = ' + str(value(prob.objective)))
    
    # MODIFY PROBLEM FOR 2ND PROBLEM
    prob.sense = LpMinimize # change sense to LpMinimize
    prob += lpSum([var[v]*x[v] for v in N]) # Reset the objective
    prob += lpSum([profits[i]*x[i] for i in N]) == obj # Add constraint that fixes profits
    
    # SOLVE 2ND PROBLEM
    prob.solve()
    print(LpStatus[prob.status])
    print('obj = ' + str(value(prob.objective)))
    print('Profits = ' + str(sum([x[i].varValue*profits[i] for i in N])))
    print('Variance = ' + str(sum([x[i].varValue*var[i] for i in N])))
    print('Cost = ' + str(sum([x[i].varValue*costs[i] for i in N])))
    ...
    

    【讨论】:

    • 1 听起来不错,我将如何编码 1?假设我不能得到 1,我正在考虑获得利润/var 的最大值,这类似于金融中的急剧比率。
    • 我已经编辑了概述第一种方法的答案。
    • 答案已更新,展示了如何连接这两个问题的解决方案。
    • 感谢一百万!顺便说一句,我将解决方案添加到我的答案中。如果我做得对,请告诉我。
    • 是的,这就是我想要的方式。
    猜你喜欢
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多