python pulp:如何创建 LpMaximize 和 LpMinimize 问题?
python pulp: How do I create LpMaximize and LpMinimize problem?
我如何着手创建 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 的联合解决方案。最大化利润并最小化var。
两种可能的方法:
- 最大化一个 objective(利润),然后将其添加为约束并求解另一个 objective(方差)。
- 使 objective 成为加权和(就像您所做的那样,只需取反方差部分)。
编辑:
方法 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:
第二个问题如何修改模型(修改objective后会出现警告):
...
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])))
...
我如何着手创建 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 的联合解决方案。最大化利润并最小化var。
两种可能的方法:
- 最大化一个 objective(利润),然后将其添加为约束并求解另一个 objective(方差)。
- 使 objective 成为加权和(就像您所做的那样,只需取反方差部分)。
编辑:
方法 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:
第二个问题如何修改模型(修改objective后会出现警告):
...
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])))
...