我对 Pyomo 比较陌生,正在尝试找到一种方法来执行以下操作:我有一个机器人模型,其中包含许多变量、参数、约束和目标函数。该模型由扭矩和接触损失组成。运行 ipopt 求解器(指定初始和最终条件以及初始化变量)后,解决方案是最佳的。目标函数仅包含接触惩罚。
我想使用上述解决方案作为初始化值重新运行模型,但更新目标函数(包括接触惩罚和扭矩^2)。有办法做到这一点吗?
不将其包含在第一次运行中的原因是求解器往往需要超长的时间,并且要么返回不可行,要么出现恢复错误。这样做可以让我找到一个可行的解决方案,然后找到最佳的解决方案。
我已经尝试了以下示例here。但是,我不确定如何合并更新的目标函数。
有一些选项可以在求解之间更改目标函数。第一种是声明多个
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