热启动-Pyomo

问题描述 投票:0回答:1

我对 Pyomo 比较陌生,正在尝试找到一种方法来执行以下操作:我有一个机器人模型,其中包含许多变量、参数、约束和目标函数。该模型由扭矩和接触损失组成。运行 ipopt 求解器(指定初始和最终条件以及初始化变量)后,解决方案是最佳的。目标函数仅包含接触惩罚。

我想使用上述解决方案作为初始化值重新运行模型,但更新目标函数(包括接触惩罚和扭矩^2)。有办法做到这一点吗?

不将其包含在第一次运行中的原因是求解器往往需要超长的时间,并且要么返回不可行,要么出现恢复错误。这样做可以让我找到一个可行的解决方案,然后找到最佳的解决方案。

我已经尝试了以下示例here。但是,我不确定如何合并更新的目标函数。

pyomo ipopt
1个回答
0
投票

有一些选项可以在求解之间更改目标函数。第一种是声明多个

Objective
组件,并使用
activate
deactivate
交换将哪个组件发送到求解器:

m.obj1 = Objective(expr=m.x)
m.obj2 = Objective(expr=m.x + m.y**2)
m.obj2.deactivate()
SolverFactory('ipopt').solve(m) # obj1 is sent to the solver

m.obj1.deactivate()
m.obj2.activate()
SolverFactory('ipopt').solve(m) # obj2 is sent to the solver

另一种方法是使用可变的

Param
组件来更改目标函数中的权重:

m.p = Param(mutable=True, initialize=0)
m.obj = Objective(expr=m.x + m.p*m.y**2)
SolverFactory('ipopt').solve(m) # m.p is 0 so second term in obj is effectively removed

m.p = 10
SolverFactory('ipopt').solve(m) # m.p is 10 so second term in obj is seen by solver

最后,您可以对目标函数中的不同项使用

Expression
分量,这些分量可以在求解之间独立修改:

m.o_exp1 = Expression(expr=m.x)
m.o_exp2 = Expression(expr=0)
m.obj = Objective(expr=m.o_exp1 + m.o_exp2)
SolverFactory('ipopt').solve(m) # obj = m.x

m.o_exp2 = m.y**2
SolverFactory('ipopt').solve(m) # obj = m.x + m.y**2
© www.soinside.com 2019 - 2024. All rights reserved.