python - 优化纸浆中与目标的偏差
问题描述
我正在使用pulp
以尽量减少与目标的偏差。在下面的 MRE 中,假设项目 1-50 具有特征 A、B、C、D。优化器应分配等于 100% 的“预算”,同时尝试使特征“A”的平均值等于tgt_a
。pulp
告诉强制a
等于目标是相当容易的,但在现实生活中,可能无法准确地达到目标。此外,我最终希望系统使用偏差平方和的方法来平衡所有各种功能,这使得完美解决方案的存在变得更加不可能。
下面的代码运行良好,但只是将实际“A”特征值与目标之间的差异最小化。我需要将差异平方以使其有用。但是,如果您将 a 添加**2
到适当的代码行,您会得到:
类型错误:** 或 pow() 不支持的操作数类型:“LpAffineExpression”和“int”
我正在寻找的是一种平方a_dev
然后设置求解器以优化变量以最小化平方差的方法。
import pandas as pd
import numpy as np
import pulp
def contrib(p, col):
c = df.loc[p, col]
return c
df_data = {'A':np.random.randint(20, 50, 50),
'B':np.random.randint(0, 50, 50),
'C':np.random.randint(20, 50, 50),
'D':np.random.randint(20, 100, 50)}
df = pd.DataFrame(data=df_data)
picks = df.index
#Set up variable
pct = pulp.LpVariable.dicts('Pct', (p for p in picks), 0, 0.05)
#Create problem
ideal = pulp.LpProblem('Sq_dev', pulp.LpMinimize)
tgt_a = 35
a = [pct[p] * contrib(p, 'A') for p in picks]
a_tgt = [pct[p] * tgt_a for p in picks]
a_dev = (pulp.lpSum(a) - pulp.lpSum(a_tgt))
#I need a_dev to be squared in order to be useful!
ideal += a_dev
ideal += pulp.lpSum([pct[p] for p in picks]) == 1
ideal.solve()
for p in picks:
if pct[p].value() > 0:
print(p, pct[p].value())
解决方案
问题正是错误消息告诉您的:pulp
没有在仿射表达式上定义这些操作。这有点像多项式或函数的乘法:您必须定义操作并编写实现。
非常简单,您必须查找仿射函数的基本定义,研究支持的操作,并编写一个函数来执行给定这些构建块的所需操作。
推荐阅读
- mysql - 2 列的唯一约束,其中一列具有特定值
- ios - 使用两个轴时如何将 ScrollView 内容对齐到顶部?
- reactjs - 在 React Js 应用程序中导入图像时出错
- javascript - 为什么隐藏和显示密码功能无法正常工作?
- java - 如何打破 kotlin when 子句?
- python - 创建列 df[New_column] 并根据 pandas 中的其他多列值写入是/否
- gekko - 关于延迟完全不同的 CV 的 cv_wgt_start
- matlab - 更改 matlab .fig 的刻度值
- flutter - Flutter 中使用 TextField 和 Button 创建消息气泡
- python - 获取不和谐频道的所有连接成员