首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Pyomo (使用couenne)无法优化>= 3的功率

Pyomo (使用couenne)无法优化>= 3的功率
EN

Stack Overflow用户
提问于 2018-08-02 19:31:49
回答 1查看 635关注 0票数 0

我有一个MINLP问题要解决,当我试图优化它时,它会崩溃。我设法减少了它,但仍然崩溃,并找到了一个可能的罪魁祸首。

约化问题目标函数是一个交替的多项x[n] - x[n-1] + x[n-2] - ...。有一个变量x[k], k=n..1数组,其中索引表示x的指数,还有一个限制数组执行这个指数运算。

对于大于2的权力:

  • 如果我直接指数型x[k] = x[1]**k,就会有一些奇形怪状。
  • 如果我级联指数x[k] = x[k-1]*x[1],couenne就能正常求解。

所以我的问题是:从求解者的角度看,有什么不同?这是预料中的失败吗?我应该用另一个依赖项重新编译couenne吗?

  • 我的环境是Ubuntu18.04。
  • 我使用的是通过conda安装的Pyomo5.5(Linux4.15.0-29Generic上的CPython 3.6.5 )。
  • 我自己使用默认标志编译了couenne,并下载了以下依赖项(ThirdParties,所有这些依赖项都是使用存储库提供的wget脚本下载的):ASL、Blas、Lapack、Metis和腮腺炎。我没有下载HSL,SCIP和SoPlex。

下面是测试代码:

代码语言:javascript
运行
复制
#! /usr/bin/env python3

import pyomo.environ
import pyomo.core as pc
from pyomo.opt import SolverFactory

def run(max_pow, cascade):
  model = pc.ConcreteModel()
  model.s = pc.RangeSet(1, max_pow)
  model.x = pc.Var(model.s, bounds=(-1,1))

  model.s_rest = pc.Set(initialize=list(ii for ii in model.s)[1:])

  ## TWO DIFFERENT WAYS OF COMPUTING POWERS ##
  if cascade: # x[k] = x[k-1]*x[1]
    model.x_c = pc.Constraint(model.s_rest, rule=lambda m, s: m.x[s] == m.x[1]*m.x[s-1])
  else:       # x[k] = x[1]**k
    model.x_c = pc.Constraint(model.s_rest, rule=lambda m, s: m.x[s] == m.x[1]**s)

  # Alternating objective function: x[k] - x[k-1] + x[k-2] - ....
  def obj(x, s, pos=True):
    result = x[s]
    if s > 1:
      result = result + obj(x, s-1, not pos)
    if not pos:
      result = -result
    return result

  model.objective = pc.Objective(rule=lambda m: obj(m.x, max_pow), sense=pc.maximize)

  opt = SolverFactory("couenne")
  results = opt.solve(model)

  model.display()

# Test 3 different cases
for max_pow, cascade in [(2, False,), (3, False,), (3, True)]:
  print("\nDegree: {}, cascade: {}".format(max_pow, cascade))
  print("-"*25)
  try:
    run(max_pow, cascade)
  except Exception as e:
    print(e)

以下是研究结果:

代码语言:javascript
运行
复制
Degree: 2, cascade: False
-------------------------
Model unknown

  Variables:
    x : Size=2, Index=s
        Key : Lower : Value : Upper : Fixed : Stale : Domain
          1 :    -1 :  -1.0 :     1 : False : False :  Reals
          2 :    -1 :   1.0 :     1 : False : False :  Reals

  Objectives:
    objective : Size=1, Index=None, Active=True
        Key  : Active : Value
        None :   True :   2.0

  Constraints:
    x_c : Size=1
        Key : Lower : Body : Upper
          2 :   0.0 :  0.0 :   0.0

Degree: 3, cascade: False
-------------------------
ERROR: Solver (asl) returned non-zero return code (-11)
ERROR: Solver log: Couenne 0.5 -- an Open-Source solver for Mixed Integer
    Nonlinear Optimization Mailing list: couenne@list.coin-or.org
    Instructions: http://www.coin-or.org/Couenne couenne:
Solver (asl) did not exit normally

Degree: 3, cascade: True
-------------------------
Model unknown

  Variables:
    x : Size=3, Index=s
        Key : Lower : Value                  : Upper : Fixed : Stale : Domain
          1 :    -1 :  -0.002154434679988468 :     1 : False : False :  Reals
          2 :    -1 :  4.641588790337013e-06 :     1 : False : False :  Reals
          3 :    -1 : -9.999999860147783e-09 :     1 : False : False :  Reals

  Objectives:
    objective : Size=1, Index=None, Active=True
        Key  : Active : Value
        None :   True : 0.002149783091198271

  Constraints:
    x_c : Size=2
        Key : Lower : Body : Upper
          2 :   0.0 :  0.0 :   0.0
          3 :   0.0 :  0.0 :   0.0
EN

回答 1

Stack Overflow用户

发布于 2018-08-02 20:10:44

Pyomo倾向于将模型完全按照您所制定的方式发送给求解者,除非您应用了一些高级转换(如GDP或DAE)。

对于许多求解者来说,表单x * x * x的表达式处理方式与x ** 3不同。在某些系统中,甚至x ** 2pow(x, 2)sqr(x)也会给出不同的行为。虽然数学上是等价的,但对边界行为和域限制的处理可能有所不同。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51660932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档