如何通过先前的解决方案在Python Gekko中重新初始化优化

时间:2019-06-05 23:09:55

标签: 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: maximum recursion depth exceeded。从Gekko中的现有解决方案初始化值的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

对于稳态解决方案(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
  1. 使用以下命令表示初始猜测值应更改为新值:
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