You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gekko基于时间的间隔约束问题:最优解未达预期

Gekko无法找到满足间隔约束的最优解

我尝试对simu_total_volume向量的输出施加约束:要求解中x7=1的元素需间隔s个记录(周),同时控制x7=1的总次数上限。当前代码可运行,但添加间隔约束后,x7的总和从无约束时的10降至8——而根据约束条件,完全可以实现sum(x7)=10,我甚至能在Excel中手动规划出更优解,不清楚Gekko为何无法找到该最优解。

以下是可本地复现的完整代码(已验证准确性,修正了原代码中易混淆的循环写法):

import numpy as np
import pandas as pd
from gekko import GEKKO

m = GEKKO(remote=False)
m.options.NODES = 3
m.options.IMODE = 3
m.options.MAX_ITER = 1000

lnuc_weeks = [0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0]
min_promo_price = [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,3]
max_promo_price = [3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5, 3.5,3.5, 3.5, 3.5, 3.5, 3.5, 3.5]
base_srp = [3.48, 3.48, 3.48, 3.48, 3.0799, 3.0799, 3.0799, 3.0799,3.0799, 3.0799, 3.0799, 3.0799, 3.0799, 3.0799, 3.0799, 3.0799, 3.0799, 3.0799, 3.0799]
lnuc_min_promo_price = 1.99
lnuc_max_promo_price = 1.99

coeff_fedi = [0.022589]*19
coeff_feao = [0.02929995]*19
coeff_diso = [0.05292338]*19

sumproduct_base = [0.20560305, 0.24735297, 0.24957423, 0.23155435, 0.23424058,0.2368096 , 0.27567109, 0.27820648, 0.2826393 , 0.28660598, 0.28583971, 0.30238505, 0.31726649, 0.31428312, 0.31073792, 0.29036779, 0.32679041, 0.32156337, 0.24633734]
neg_ln_ppi_coeff = [1.22293879]*19
base_volume = [124.38, 193.2, 578.72, 183.88, 197.42, 559.01, 67.68, 110.01,60.38, 177.11, 102.65, 66.02, 209.83, 81.22, 250.44, 206.44, 87.99, 298.95, 71.07]
week = pd.Series([13, 14, 17, 18, 19, 26, 28, 33, 34, 35, 39, 42, 45, 46, 47, 48, 50, 51, 52])

n = 19

# 定义变量
x1 = m.Array(m.Var,(n), integer=True) # LNUC weeks
i = 0
for xi in x1:
    xi.value = lnuc_weeks[i]
    xi.lower = 0
    xi.upper = lnuc_weeks[i]
    i += 1

x2 = m.Array(m.Var,(n)) # Blended SRP
i = 0
for xi in x2:
    xi.value = 5
    m.Equation(xi >= m.if3((x1[i]) - 0.5, min_promo_price[i], lnuc_min_promo_price))
    m.Equation(xi <= m.if3((x1[i]) - 0.5, max_promo_price[i], lnuc_max_promo_price))
    i += 1

x3 = m.Array(m.Var,(n), integer=True) # F&D
x4 = m.Array(m.Var,(n), integer=True) # FO
x5 = m.Array(m.Var,(n), integer=True) # DO
x6 = m.Array(m.Var,(n), integer=True) # TPR

# 默认选择F&D
i = 0
for xi in x3:
    xi.value = 1
    xi.lower = 0
    xi.upper = 1
    i += 1

i = 0
for xi in x4:
    xi.value = 0
    xi.lower = 0
    xi.upper = 1
    i += 1

i = 0
for xi in x5:
    xi.value = 0
    xi.lower = 0
    xi.upper = 1
    i += 1

i = 0
for xi in x6:
    xi.value = 0
    xi.lower = 0
    xi.upper = 1
    i += 1

x7 = m.Array(m.Var,(n), integer=True) # Max promos
i = 0
for xi in x7:
    xi.value = 1
    xi.lower = 0
    xi.upper = 1
    i += 1

x = [x1,x2,x3,x4,x5,x6,x7]

# 定义中间变量
neg_ln = [m.Intermediate(-m.log(x[1][i]/base_srp[i])) for i in range(n)]
total_vol_fedi = [m.Intermediate(coeff_fedi[0] + sumproduct_base[i] + (neg_ln[i]*neg_ln_ppi_coeff[0])) for i in range(n)]
total_vol_feao = [m.Intermediate(coeff_feao[0] + sumproduct_base[i] + (neg_ln[i]*neg_ln_ppi_coeff[0])) for i in range(n)]
total_vol_diso = [m.Intermediate(coeff_diso[0] + sumproduct_base[i] + (neg_ln[i]*neg_ln_ppi_coeff[0])) for i in range(n)]
total_vol_tpro = [m.Intermediate(sumproduct_base[i] + (neg_ln[i]*neg_ln_ppi_coeff[0])) for i in range(n)]

simu_total_volume = [m.Intermediate((
    (m.max2(0, base_volume[i]*(m.exp(total_vol_fedi[i])-1)) * x[2][i] +
     m.max2(0, base_volume[i]*(m.exp(total_vol_feao[i])-1)) * x[3][i] +
     m.max2(0, base_volume[i]*(m.exp(total_vol_diso[i])-1)) * x[4][i] +
     m.max2(0, base_volume[i]*(m.exp(total_vol_tpro[i])-1)) * x[5][i]) + base_volume[i]) * x[6][i]) for i in range(n)]

# 约束:促销类型互斥
[m.Equation(x3[i] + x4[i] + x5[i] + x6[i] == 1) for i in range(n)]

# 约束:促销次数上限
m.Equation(sum(x7) <= 10)

# 约束:促销间隔
s = 1
for s2 in range(1, s+1):
    for i in range(0, n-s2):
        f = week[week == week[i] + s2].index
        if len(f) > 0:
            m.Equation(x7[i] + x7[f[0]] <= 1)

# 目标:最大化总销量
m.Maximize(m.sum(simu_total_volume))

m.options.SOLVER = 1
m.solve(disp=True)

内容的提问来源于stack exchange,提问作者datadude558

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 04:14:49