[英]How to use absolute value in python pulp objective function?
我试图在目标函数中使用绝对值。 我想最小化以下等式的绝对值
|(m[i] - (x1 * a1[i] + x2 * a2[i] + x3 * a3[i])|
我尝试了以下
from pulp import LpVariable, LpProblem, lpSum, LpMinimize, LpStatus, value
import numpy as np
import pandas as pd
df = pd.DataFrame({
'm':[375575.583,367790.9166,353404.7496],
'a1':[351170.56,359097.94,321573.44],
'a2':[785612.241849173,762821.6656155427,724076.4664063533],
'a3':[410363.40625,378311.78125,397014.53125]
},index = ['2020-01-01','2020-01-02', '2020-01-03' ])
prob = LpProblem('Ensemble', LpMinimize)
date_index = list(df.index)
a1 = dict(zip(date_index, df.iloc[:,1]))
a2 = dict(zip(date_index, df.iloc[:,2]))
a3 = dict(zip(date_index, df.iloc[:,3]))
m = dict(zip(date_index, df.iloc[:, 0]))
index_var = LpVariable.dict("Date", date_index, lowBound = 0, upBound = 1, cat = 'Continuous')
x1 = LpVariable('x1', lowBound = 0, upBound = 1, cat = 'Continuous')
x2 = LpVariable('x2', lowBound = 0, upBound = 1, cat = 'Continuous')
x3 = LpVariable('x3', lowBound = 0, upBound = 1, cat = 'Continuous')
prob += np.abs(lpSum((m[i] - (x1 * a1[i] + x2 * a2[i] + x3 * a3[i])) for i in date_index))
limit = x1 + x2 + x3
prob += (limit == 1)
prob.solve()
print(LpStatus[prob.status])
for v in prob.variables():
print(v.name, "=", v.varValue)
value(prob.objective)
并得到以下错误
prob += np.abs(lpSum((m[i] - (x1 * a1[i] + x2 * a2[i] + x3 * a3[i])) for i in date_index))
TypeError: bad operand type for abs(): 'LpAffineExpression'
如何使用目标函数中差异的绝对值?
一种方法是定义一个变量来表示您的总和,然后定义另一个变量来表示该总和的绝对值,您可以将其限制为大于总和的正值和负值。
这将绝对值变量限制为“至少与总和变量的大小一样大”。 请注意,它可能更大,但这不是问题,因为设置问题是为了最小化和的绝对值变量。
from pulp import LpVariable, LpProblem, lpSum, LpMinimize, LpStatus, value
import numpy as np
import pandas as pd
df = pd.DataFrame({
'm':[375575.583,367790.9166,353404.7496],
'a1':[351170.56,359097.94,321573.44],
'a2':[785612.241849173,762821.6656155427,724076.4664063533],
'a3':[410363.40625,378311.78125,397014.53125]
},index = ['2020-01-01','2020-01-02', '2020-01-03' ])
prob = LpProblem('Ensemble', LpMinimize)
date_index = list(df.index)
a1 = df['a1']
a2 = df['a2']
a3 = df['a3']
m = df['m']
index_var = LpVariable.dict("Date", date_index, lowBound = 0, upBound = 1, cat = 'Continuous')
x1 = LpVariable('x1', lowBound = 0, upBound = 1, cat = 'Continuous')
x2 = LpVariable('x2', lowBound = 0, upBound = 1, cat = 'Continuous')
x3 = LpVariable('x3', lowBound = 0, upBound = 1, cat = 'Continuous')
# Variable to hold sum
sum_var = LpVariable('sum_var')
abs_sum_var = LpVariable('abs_sum_var')
# Objective
prob += abs_sum_var
# Constraints which define sum_var and abs_sum_var
prob += sum_var == lpSum([(m[i] - (x1 * a1[i] + x2 * a2[i] + x3 * a3[i])) for i in date_index])
prob += abs_sum_var >= sum_var
prob += abs_sum_var >= -sum_var
# Constraint
prob += (x1 + x2 + x3 == 1)
prob.solve()
print(LpStatus[prob.status])
for v in prob.variables():
print(v.name, "=", v.varValue)
value(prob.objective)
返回:
abs_sum_var = 0.0
sum_var = -1.7462298e-10
x1 = 0.94766587
x2 = 0.052334135
x3 = 0.0
abs_sum_var
和它应该是1.7462298e-10
之间的小差异,我怀疑与求解器的约束容差有关 - 您可以修改 - 请参阅更改 PuLP's (for Python) constraint tolerance 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.