使用PYOMO / PYSP解决MINLP

时间:2018-06-15 09:12:45

标签: optimization pyomo

队,

目前我正在研究非线性随机优化问题。到目前为止,工具箱真的很有帮助,谢谢!但是,添加非线性约束会导致错误。我使用gurobi求解器。问题是由以下约束引起的。

def max_pcr_power_rule(model, t):
    if t == 0:
        return 0 <= battery.P_bat_max-model.P_sc_max[t+1]-model.P_pcr
    else:       
        return model.P_trade_c[t+1] + np.sqrt(-2*np.log(rob_opt.max_vio)) \
        *sum(model.U_max_pow[t,i]**2 for i in set_sim.tme_dat_stp)**(0.5) \
        <= battery.P_bat_max-model.P_sc_max[t+1]-model.P_pcr
model.max_pcr_power = Constraint(set_sim.tme_dat_stp, rule=max_pcr_power_rule)

我收到此错误消息:

  

初始化随机规划的广泛形式算法   问题。遇到异常。场景树管理器尝试   关掉。 Traceback(最近一次调用最后一次):文件   &#34; C:\ Users \ theil \ Anaconda3 \ Scripts \ runef-script.py&#34;,第5行,in          sys.exit(pyomo.pysp.ef_writer_script.main())File&#34; C:\ Users \ theil \ Anaconda3 \ lib \ site-packages \ pyomo \ pysp \ ef_writer_script.py&#34;,   第863行,主要       traceback = options.traceback)文件&#34; C:\ Users \ theil \ Anaconda3 \ lib \ site-packages \ pyomo \ pysp \ util \ misc.py&#34;,   第344行,在launch_command中       rc = command(options,* cmd_args,** cmd_kwds)File&#34; C:\ Users \ theil \ Anaconda3 \ lib \ site-packages \ pyomo \ pysp \ ef_writer_script.py&#34;,   第748行,在runef       ef.solve()文件&#34; C:\ Users \ theil \ Anaconda3 \ lib \ site-packages \ pyomo \ pysp \ ef_writer_script.py&#34;,   第430行,在解决       ** solve_kwds)文件&#34; C:\ Users \ theil \ Anaconda3 \ lib \ site-packages \ pyomo \ opt \ parallel \ manager.py&#34;,   第122行,在队列中       return self._perform_queue(啊,* args,** kwds)文件&#34; C:\ Users \ theil \ Anaconda3 \ lib \ site-packages \ pyomo \ opt \ parallel \ local.py&#34;,   第59行,在_perform_queue中       results = opt.solve(* args,** kwds)File&#34; C:\ Users \ theil \ Anaconda3 \ lib \ site-packages \ pyomo \ opt \ base \ solvers.py&#34;,   第599行,在解决       self._presolve(* args,** kwds)文件&#34; C:\ Users \ theil \ Anaconda3 \ lib \ site-packages \ pyomo \ solvers \ plugins \ solvers \ GUROBI.py&#34;,   第224行,在_presolve中       ILMLicensedSystemCallSolver._presolve(self,* args,** kwds)文件&#34; C:\ Users \ theil \ Anaconda3 \ lib \ site-packages \ pyomo \ opt \ solver \ shellcmd.py&#34;,   第196行,在_presolve中       OptSolver._presolve(self,* args,** kwds)文件&#34; C:\ Users \ theil \ Anaconda3 \ lib \ site-packages \ pyomo \ opt \ base \ solvers.py&#34;,   第696行,在_presolve中       ** kwds)文件&#34; C:\ Users \ theil \ Anaconda3 \ lib \ site-packages \ pyomo \ opt \ base \ solvers.py&#34;,   第767行,在_convert_problem中       ** kwds)文件&#34; C:\ Users \ theil \ Anaconda3 \ lib \ site-packages \ pyomo \ opt \ base \ convert.py&#34;,   第110行,在convert_problem中       problem_files,symbol_map = converter.apply(* tmp,** tmpkw)File&#34; C:\ Users \ theil \ Anaconda3 \ lib \ site-packages \ pyomo \ solvers \ plugins \ converter \ model.py&#34;,   第96行,申请中       io_options = io_options)文件&#34; C:\ Users \ theil \ Anaconda3 \ lib \ site-packages \ pyomo \ core \ base \ block.py&#34;,   第1681行,写在       io_options)文件&#34; C:\ Users \ theil \ Anaconda3 \ lib \ site-packages \ pyomo \ repn \ plugins \ cpxlp.py&#34;,   第176行,致电       include_all_variable_bounds = include_all_variable_bounds)文件&#34; C:\ Users \ theil \ Anaconda3 \ lib \ site-packages \ pyomo \ repn \ plugins \ cpxlp.py&#34;,   第719行,在_print_model_LP中       &#34;具有非线性项。&#34; %(constraint_data.name))ValueError:无法写入合法的LP文件。约束&#39; 1.max_pcr_power [1]&#39;有个   身体与非线性术语。

我认为,问题可能存在于约束的嵌套公式中,即和和指数项的组合。因此,我将sum() - 项放入一个单独的变量中。这并没有改变核心非线性约束的特性,因此误差保持不变。我的另一个怀疑是,问题出现在gurobi求解器中。所以我试图利用ipopt,它产生了以下错误信息:

  

评估约束1时出错:无法评估pow&#39;(0,0.5)。错误:   Solver(ipopt)返回非零返回码(1)错误:请参阅求解器   在上面记录诊断信息。遇到异常。脚本   树经理试图关闭。追溯(最近的电话   最后):文件&#34; C:\ Users \ theil \ Anaconda3 \ Scripts \ runef-script.py&#34;,line   5,在       sys.exit(pyomo.pysp.ef_writer_script.main())File&#34; C:\ Users \ theil \ Anaconda3 \ lib \ site-packages \ pyomo \ pysp \ ef_writer_script.py&#34;,   第863行,主要       traceback = options.traceback)文件&#34; C:\ Users \ theil \ Anaconda3 \ lib \ site-packages \ pyomo \ pysp \ util \ misc.py&#34;,   第344行,在launch_command中       rc = command(options,* cmd_args,** cmd_kwds)File&#34; C:\ Users \ theil \ Anaconda3 \ lib \ site-packages \ pyomo \ pysp \ ef_writer_script.py&#34;,   第748行,在runef       ef.solve()文件&#34; C:\ Users \ theil \ Anaconda3 \ lib \ site-packages \ pyomo \ pysp \ ef_writer_script.py&#34;,   第434行,在解决       ** solve_kwds)文件&#34; C:\ Users \ theil \ Anaconda3 \ lib \ site-packages \ pyomo \ opt \ parallel \ manager.py&#34;,   第122行,在队列中       return self._perform_queue(啊,* args,** kwds)文件&#34; C:\ Users \ theil \ Anaconda3 \ lib \ site-packages \ pyomo \ opt \ parallel \ local.py&#34;,   第59行,在_perform_queue中       results = opt.solve(* args,** kwds)File&#34; C:\ Users \ theil \ Anaconda3 \ lib \ site-packages \ pyomo \ opt \ base \ solvers.py&#34;,   第626行,在解决       &#34;解算器(%s)没有正常退出&#34; %self.name)pyutilib.common._exceptions.ApplicationError:Solver(ipopt)没有   通常退出

我现在想知道,如果我的错误存在于约束的形式或我利用求解器的方式中。否则我必须简化我的问题以使其可解决。

如果你能指出我正确的方向,我会很高兴的。谢谢!

祝你好运 菲利普

1 个答案:

答案 0 :(得分:0)

正如欧文在评论中所提到的,Gurobi通常不适用于非线性问题。