python纸浆:如何创建LpMaximize和LpMinimize问题?

2024-04-18 23:36:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我如何着手创建一个优化,使利润最大化和方差最小化

我试着将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])))

I使用MagnusÅhlander的组合溶液。利润最大化和风险值最小


Tags: toincityforvarmaxprintproblem
1条回答
网友
1楼 · 发布于 2024-04-18 23:36:38

两种可能的方法:

  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])))
...

相关问题 更多 >