首页 > 解决方案 > 优化纸浆中与目标的偏差

问题描述

我正在使用pulp以尽量减少与目标的偏差。在下面的 MRE 中,假设项目 1-50 具有特征 A、B、C、D。优化器应分配等于 100% 的“预算”,同时尝试使特征“A”的平均值等于tgt_apulp告诉强制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())

标签: pythonpulp

解决方案


问题正是错误消息告诉您的:pulp没有在仿射表达式上定义这些操作。这有点像多项式或函数的乘法:必须定义操作并编写实现。

非常简单,您必须查找仿射函数的基本定义,研究支持的操作,编写一个函数来执行给定这些构建块的所需操作。


推荐阅读