无法解决 KeyError:“索引 'slice(None, None, None)' 对于索引组件 'MindtPy_utils.objective_value' 无效”

问题描述 投票:0回答:1
import pandas as pd
import random as r
import numpy as np
import glpk
from pyomo.environ import *
from amplpy import AMPL

def pyblock(pyp, pytau, pyr, pys):
  
  
  M = ConcreteModel()
  
  M.m = Set(initialize = list(range(int(len(pyp)))))
  M.e = Set(initialize = list(range(int(len(pyr)))))
  M.s = Set(initialize = list(range(int(pys))))
  
  M.r = Param(M.e, initialize = pyr)
  M.tau = Param(M.m, initialize = pytau)
  M.p = Param(M.m, M.e, M.s, initialize = 0)
      
  M.n = Var(M.m, M.e, M.s, domain=NonNegativeIntegers, initialize=0)
  
  def obj(M):
    return sum(-log(1-prod((1-pyp[i,j,k])**(M.n[i,j,k]) for j in M.e for k in M.s)) for i in M.m)
  M.obj=Objective(rule=obj, sense=minimize)
  
  def fire_rate(M, j, k):
    return sum(M.n[i,j,k] for i in M.m) <= M.r[j]
  M.fire_rate=Constraint(M.e, M.s, rule = fire_rate)

  opt = SolverFactory('mindtpy')
  results = opt.solve(
    M,
    mip_solver = 'cplex',
    nlp_solver = 'ipopt',
    tee=True
  )
  # results.write()
     
  return M.n.extract_values()

目前正在尝试用 pyomo 和 Mindtpy 解决这个 MINLP。参数是从 R 中通过网状调用的。 Ipopt 使用非整数解决方案解决了这个问题,但是我希望使用 Mindtpy 来提供整数解决方案。当我运行它时,出现以下错误:

py_call_impl(callable, call_args$unnamed, call_args$named) 中的错误: KeyError:“索引 'slice(None, None, None)' 对于索引组件 'MindtPy_utils.objective_value' 无效”

非常感谢任何帮助。

python python-3.x pyomo
1个回答
0
投票

我已在我的系统上使用 MindtPy 成功运行您提供的代码,并且它毫无问题地解决了您的模型。

看来您面临的问题可能源于过时的 Pyomo 版本。我强烈建议将 Pyomo 更新到最新版本,以获得更好的兼容性和性能。

在检查您的模型时,我注意到这是一个非凸 INLP(整数非线性规划)问题。在这种情况下,在 MindtPy 中采用全局外近似 (GOA) 策略可能非常有益。此外,考虑到您的目标函数包含对数表达式,建议向参数添加一个小值(例如 1e-6),以避免由于 log(0) 导致的任何潜在计算错误。实施此调整应该会增强模型的稳健性。

希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.