Python pulp amaç fonksiyonunda mutlak değer nasıl kullanılır?
Amaç işlevinde mutlak değeri kullanmaya çalışıyorum. Aşağıdaki denklemin mutlak değerini en aza indirmek istiyorum
|(m[i] - (x1 * a1[i] + x2 * a2[i] + x3 * a3[i])|
Aşağıdakileri denedim
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)
ve aşağıdaki hatayı al
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'
Amaç işlevindeki farkın mutlak değerini nasıl kullanırım?
Yanıtlar
Bunu yapmanın bir yolu, toplamınızı temsil edecek bir değişken tanımlamak ve ardından, toplamın hem pozitif hem de negatif değerinden daha büyük olmasını sınırlayabileceğiniz bu toplamın mutlak değerini temsil eden başka bir değişken tanımlamaktır.
Bu, değişken mutlak değerin 'en azından toplam değişkeninin büyüklüğü kadar büyük' olmasını sınırlar. Daha büyük olabileceğini unutmayın, ancak sorun, bu mutlak değer toplamı değişkenini en aza indirecek şekilde kurulduğundan bu bir sorun değildir.
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)
İadeler:
abs_sum_var = 0.0
sum_var = -1.7462298e-10
x1 = 0.94766587
x2 = 0.052334135
x3 = 0.0
Olması gereken abs_sum_varve olması gereken arasındaki küçük tutarsızlık, çözücünün 1.7462298e-10kısıtlama toleransı ile ilgili olduğundan şüpheleniyorum - bunu değiştirebilirsin - PuLP'nin (Python için) kısıt toleransını değiştirme bölümüne bakınız .