python - 如何根据先前的解决方案在 Python Gekko 中重新初始化优化

标签 python optimization gekko

我正在循环中使用 Gekko 求解非线性优化问题,并希望使用先前的解决方案来初始化下一个解决方案。我使用下面的代码创建了一个简化的问题来显示该问题。

from gekko import GEKKO
m = GEKKO() # Initialize gekko
# Initialize variables
x1 = m.Var(value=1,lb=1,ub=5)
x2 = m.Var(value=5,lb=1,ub=5)
# Equations
m.Equation(x1==x2*2)
m.Equation(x1**2+x2**2==10)
m.Obj(x1*x2) # Objective
m.options.solver=1

m.solve(disp=False) # Solve
print('Iterations: ' + str(m.options.iterations))
print(x1.value[0], x2.value[0])
print('Objective: ' + str(m.options.objfcnval))

m.solve(disp=False) # Solve again
print('Iterations: ' + str(m.options.iterations))
print(x1.value[0], x2.value[0])
print('Objective: ' + str(m.options.objfcnval))

控制台打印:

  Iterations: 5
  2.8284271334 1.4142135667
  Objective: 4.0000000245
  Iterations: 5
  2.8284271334 1.4142135667
  Objective: 4.0000000245

x1x2 的值返回到尝试“再次求解”之前的初始猜测值 1 和 5。我尝试了x1.value = x1.value,但这返回了RecursionError:超出了最大递归深度。在 Gekko 中初始化先前解决方案中的值的正确方法是什么?

最佳答案

对于稳态解决方案(IMODE=1 或 3),Gekko 使用先前的 x1.valuex2.value,直到它们发生更改。 .value 有两个属性:.value.change。有多种方法可以表明它们已发生变化,包括:

  1. 通过以下方式设置先前解决方案中的值:
x1.value = x1.value.value  # = 2.8284271334
x2.value = x2.value.value  # = 1.4142135667
  • 通过以下方式发出信号,表明初始猜测值应更改为新值:
  • x1.value.change = True
    x2.value.change = True
    

    对于两个变量来说这很容易,但对于许多变量来说就更具挑战性。如果您想对所有变量自动执行此操作,您可以在 vi in m._variables 的循环中使用内置变量列表:

    from gekko import GEKKO
    m = GEKKO() # Initialize gekko
    # Initialize variables
    x1 = m.Var(value=1,lb=1,ub=5)
    x2 = m.Var(value=5,lb=1,ub=5)
    # Equations
    m.Equation(x1==x2*2)
    m.Equation(x1**2+x2**2==10)
    m.Obj(x1*x2) # Objective
    m.options.solver=1
    
    m.solve(disp=False) # Solve
    print('Iterations: ' + str(m.options.iterations))
    print(x1.value[0], x2.value[0])
    print('Objective: ' + str(m.options.objfcnval))
    
    for vi in m._variables:
        vi.value.change = True
    
    m.solve(disp=False) # Solve again
    print('Iterations: ' + str(m.options.iterations))
    print(x1.value[0], x2.value[0])
    print('Objective: ' + str(m.options.objfcnval))
    

    第二次求解问题时,求解器在 1 次迭代中完成,而不是 5 次迭代。它使用先前的解决方案作为起点。

      Iterations: 5
      2.8284271334 1.4142135667
      Objective: 4.0000000245
      Iterations: 1
      2.8284271247 1.4142135624
      Objective: 4.0
    

    关于python - 如何根据先前的解决方案在 Python Gekko 中重新初始化优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56469145/

    相关文章:

    python - 排序区分大小写

    python - GEKKO 是否有从 JSON 导入 Global、MV 和 CV 选项的方法?

    gekko - 使用 Gekko 和 Python 拟合数据的数值 ODE 解

    python - 在 Python 中使用 GEKKO 的 ODE 系统中的数组变量

    python - R 相当于 Python 的 np.select(conditions, Choices)

    python - GNU Radio (Companion) 在变量替换时给出 Python 语法错误

    algorithm - 在与大型集合匹配时,选择一组特征以排除基于位掩码的项目的最佳方法是什么?

    java - 我的 Android 应用程序正在耗尽电池电量吗?

    python - 为什么我在 Django 中会出现此错误?

    php - 在 PHP 中执行 "foreach x except y"最优雅的方法是什么?