Pyomo:类型错误:类型'NoneType'的参数不可迭代



我尝试用Python中的pyomo在正整数y上最大化非线性函数。当涉及到优化时。目标函数是近似的,因为它包含正态分布的pdf和cdf。我认为问题不在于目标函数或约束,而在于软件包,请注意,我没有安装最新版本的NLP求解器ipopt。下面是代码和错误消息:

conda install -c conda-forge pyomo
conda install -c conda-forge ipopt=3.11.1
conda install -c conda-forge glpk
import math
from pyomo.environ import *
import numpy as np
import pandas as pd
#average
mu={'A':30,'B':23,'C':9}
#variances
sigma={'A':10,'B':4,'C':5}
#selling price
e={'A':10,'B':12,'C':30}
#capital
K=300
#storage size per item of product
w={'A':3,'B':2,'C':5}
#Fixed costs
F=50
#rent for storage
M=40
#size of storage
G=30
#Products
products=['A','B','C']
max_production={'A':400,
'B':300,
'C':200}
production_costs={'A':5,
'B':4,
'C':20}

model= ConcreteModel()
#y ist variable die zu optimieren ist
model.y=Var(products,domain=PositiveIntegers  )
#constraints
model.constraints=ConstraintList()
for p in products:
model.constraints.add(model.y[p]<=max_production[p]) #upper bound of production capacity for each product


#capital restriction
model.constraints.add(model.y['A']*production_costs['A']+model.y['B']*production_costs['B']+model.y['C']*production_costs['C']<=K)
#normal pdf
#1/(sigma[p]*np.sqrt(2*math.pi))*exp(-1/2*((model.y[p]-mu[p])/sigma[p])**2)
#approximate normal cdf see: https://mathoverflow.net/questions/19404/approximation-of-a-normal-distribution-function
#1/((model.y[p]-mu[p])/sigma[p]*np.sqrt(2*math.pi))*(1-1/(((model.y[p]-mu[p])/sigma[p])**2)+3/(((model.y[p]-mu[p])/sigma[p])**4)-15/(((model.y[p]-mu[p])/sigma[p])**6)+105/(((model.y[p]-mu[p])/sigma[p])**8))

#objective
profit=sum(-2*sigma[p]*1/(sigma[p]*np.sqrt(2*math.pi))*exp(-1/2*((model.y[p]-mu[p])/sigma[p])**2)*e[p]
+mu[p]*e[p]-sigma[p]*1/(sigma[p]*np.sqrt(2*math.pi))*exp(-1/2*((model.y[p]-mu[p])/sigma[p])**2)*w[p]*M/G
+mu[p]*1/((model.y[p]-mu[p])/sigma[p]*np.sqrt(2*math.pi))*(1-1/(((model.y[p]-mu[p])/sigma[p])**2)+3/(((model.y[p]-mu[p])/sigma[p])**4)-15/(((model.y[p]-mu[p])/sigma[p])**6)+105/(((model.y[p]-mu[p])/sigma[p])**8))*w[p]*M/G
+sigma[p]*1/(sigma[p]*np.sqrt(2*math.pi))*exp(-1/2*((model.y[p]-mu[p])/sigma[p])**2)*production_costs[p]
+(model.y[p]-mu[p])/sigma[p]*production_costs[p]-mu[p]*production_costs[p]-(model.y[p]-mu[p])/sigma[p]*1/((model.y[p]-mu[p])/sigma[p]*np.sqrt(2*math.pi))*(1-1/(((model.y[p]-mu[p])/sigma[p])**2)+3/(((model.y[p]-mu[p])/sigma[p])**4)-15/(((model.y[p]-mu[p])/sigma[p])**6)+105/(((model.y[p]-mu[p])/sigma[p])**8))*production_costs[p]
+mu[p]*1/((model.y[p]-mu[p])/sigma[p]*np.sqrt(2*math.pi))*(1-1/(((model.y[p]-mu[p])/sigma[p])**2)+3/(((model.y[p]-mu[p])/sigma[p])**4)-15/(((model.y[p]-mu[p])/sigma[p])**6)+105/(((model.y[p]-mu[p])/sigma[p])**8))*production_costs[p]-production_costs[p]*(model.y[p]-mu[p])/sigma[p]  for p in products       
)
model.objective = Objective(expr = profit, sense=maximize)
SolverFactory('mindtpy').solve(model,
strategy='GOA',
mip_solver='glpk',
nlp_solver='ipopt')

,我得到错误信息:

----> 1 SolverFactory('mindtpy').solve(model,
2                                    strategy='GOA',
3                                    mip_solver='glpk',
4                                    nlp_solver='ipopt')
~anaconda3libsite-packagespyomocontribmindtpyMindtPy.py in solve(self, model, **kwds)
229             # Initialize the main problem
230             with time_code(solve_data.timing, 'initialization'):
--> 231                 MindtPy_initialize_main(solve_data, config)
232 
233             # Algorithm main loop
~anaconda3libsite-packagespyomocontribmindtpyinitialization.py in MindtPy_initialize_main(solve_data, config)
90     # Do the initialization
91     if config.init_strategy == 'rNLP':
---> 92         init_rNLP(solve_data, config)
93     elif config.init_strategy == 'max_binary':
94         init_max_binaries(solve_data, config)
~anaconda3libsite-packagespyomocontribmindtpyinitialization.py in init_rNLP(solve_data, config)
158                 add_oa_cuts(solve_data.mip, dual_values, solve_data, config)
159             elif config.strategy == 'GOA':
--> 160                 add_affine_cuts(solve_data, config)
161             for var in solve_data.mip.MindtPy_utils.discrete_variable_list:
162                 # We don't want to trigger the reset of the global stale
~anaconda3libsite-packagespyomocontribmindtpycut_generation.py in add_affine_cuts(solve_data, config)
264             # mcpp stuff
265             try:
--> 266                 mc_eqn = mc(constr.body)
267             except MCPP_Error as e:
268                 config.logger.debug(
~anaconda3libsite-packagespyomocontribmcpppyomo_mcpp.py in __init__(self, expression, improved_var_bounds)
406         self.mc_expr = None
407 
--> 408         self.mcpp = _MCPP_lib()
409         self.pyomo_expr = expression
410         self.visitor = MCPP_visitor(expression, improved_var_bounds)
~anaconda3libsite-packagespyomocontribmcpppyomo_mcpp.py in _MCPP_lib()
60         return _MCPP_lib._mcpp
61 
---> 62     _MCPP_lib._mcpp = mcpp = ctypes.CDLL(Library('mcppInterface').path())
63 
64     # Version number
~anaconda3libctypes__init__.py in __init__(self, name, mode, handle, use_errno, use_last_error, winmode)
362                 import nt
363                 mode = nt._LOAD_LIBRARY_SEARCH_DEFAULT_DIRS
--> 364                 if '/' in name or '\' in name:
365                     self._name = nt._getfullpathname(self._name)
366                     mode |= nt._LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR
TypeError: argument of type 'NoneType' is not iterable

有没有人知道,哪个对象是不可迭代的,或者为什么它不起作用?

看起来你还没有构建mc++接口。

Mindtpy GOA策略依赖于mc++的接口来构建有效的切割。由于潜在的不兼容许可(mc++是EPL, fadbad++是自定义双许可,Pyomo是BSD),编译后的mc++接口没有作为Pyomo发行版的一部分捆绑在一起。用户需要在安装Pyomo后下载并构建mc++库。最简单的方法是使用pyomo脚本:

pyomo download-extensions
pyomo build-extensions

一个(大)问题是你似乎在运行Windows,而我从来没有幸运地在Windows下构建mc++。

最新更新