DoCplex中的低音模型:如何在约束中分配变量

问题描述 投票:0回答:1

我正在尝试基于Bass模型构建优化程序(见下文):

  • 决策变量:p,m,q
  • 问题:最低RMSE
  • 约束:
    • Ft =(p + q(C(t-1)/ m)(m-C(t-1))
    • Et = Ft-St

[C(t)是累计销售额,St是实际销售额,Ft是周期t的预计销售额,Et是误差项。

我似乎无法弄清楚如何编写将这些值分配给新变量的约束(不一定使用比较运算符...

目前,我创建了一个Bass_F函数,执行上面的方程Ft,并创建了一个rmse函数来计算rmse。我还编写了以下代码(我的实际销售价值是变量y,并且其中有4条记录):

import docplex.mp.model as cpx
opt_model = cpx.Model(name="Bass")

opt_model.continuous_var(name = "p")
opt_model.continuous_var(name = "q")
opt_model.continuous_var(name = "m")

F = [None]*4
E = [None]*4
opt_model.add_constraint_(F[0] = p*m)
opt_model.add_constraint_(E[0] = F[0] - y[0])
for i in range(1,len(F)):
    opt_model.add_constraints_(F[i] = Bass_F(F[i-1], p, q, m))
    opt_model.add_constraints_(E[i] = F[i] - y[i])

显然,这给了我一个错误,是:

opt_model.add_constraint_(F[0] = p*m)                             ^
SyntaxError: keyword can't be an expression

有人可以帮忙吗?预先感谢!

python optimization constraints bass docplex
1个回答
0
投票

您不能像定义宏或类似内容那样“定义”变量。您可以执行以下操作:

opt_model.add_constraint_(F[0] == p*m)
opt_model.add_constraint_(E[0] == F[0] - y[0])
for i in range(1,len(F)):
    opt_model.add_constraints_(F[i] == Bass_F(F[i-1], p, q, m))
    opt_model.add_constraints_(E[i] == F[i] - y[i])

例如,这强制F[0]p * m相同。必要时,求解器引擎将用F[0]替换p * m

您还可以在模型[[outside中创建此类定义。也就是说,您可以执行以下操作:

F = [] F.append(p * m)
此后,F[0]是您要引用p * m时可以使用的表达式。因此,您的代码可以写为(用适当的限制替换M

F = [None] * M E = [None] * M F[0] = p * m E[0] = F[0] - y[0] for i in range(1, M): F[i] = Bass_F(F[i - 1], p, q, m) E[i] = F[i] - y[i]

因此,您可以将F[i]E[i]用作各个表达式的“快捷方式”。

据我所知,您的模型有问题。您定义

Ft = (p + q(C(t-1)/m)(m - C(t-1))

这需要除以决策变量m。不支持按决策变量划分。您可以将两边都乘以m来消除这一点。但是,结果约束可能是非凸的。也不支持。您可能必须线性化此约束。
© www.soinside.com 2019 - 2024. All rights reserved.