【问题标题】:Bass model in DoCplex: how to assign variables in constraintsDoCplex 中的 Bass 模型:如何在约束中分配变量
【发布时间】:2020-03-23 15:48:31
【问题描述】:

我正在尝试构建一个基于 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】:

    您不能像定义宏或类似的那样“定义”变量。你可以这样做:

    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

    您也可以在模型外部创建这种定义。也就是说,您可以这样做:

    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 以消除它。但是,由此产生的约束可能是非凸的。这也不支持。您可能必须将此约束线性化。

    【讨论】:

    • 感谢您的帮助!!很抱歉延迟回复(不知何故没有收到通知)。
    猜你喜欢
    • 1970-01-01
    • 2014-01-04
    • 2020-06-25
    • 1970-01-01
    • 2020-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    相关资源
    最近更新 更多