如何在Drake中固定部分决策变量以实现交替优化
Drake固定指定决策变量的实现方法
针对交替优化Lyapunov函数系数的场景,有两种常用实现方案,可根据使用频率选择:
方法1:求解时传入固定值(推荐用于交替优化)
该方案无需反复修改优化问题定义,仅需在调用solve时传入需要固定的变量与对应取值,迭代效率最高:
from pydrake.solvers import MathematicalProgram, Solve # 提前一次性搭建完整优化问题,包含所有决策变量、约束与目标 prog = MathematicalProgram() V_coeffs = prog.NewContinuousVariables(10, "V_coeff") # Lyapunov函数系数变量示例 other_vars = prog.NewContinuousVariables(5, "other_var") # 另一部分待交替优化的变量示例 # 交替优化循环 current_other_val = [0.0]*5 # 另一部分变量的初始值 for _ in range(10): # 第一轮:固定other_vars,优化V_coeffs fixed_var_map = {var: current_other_val[i] for i, var in enumerate(other_vars)} res1 = Solve(prog, variable_values=fixed_var_map) current_V_val = res1.GetSolution(V_coeffs) # 第二轮:固定V_coeffs,优化other_vars fixed_var_map = {var: current_V_val[i] for i, var in enumerate(V_coeffs)} res2 = Solve(prog, variable_values=fixed_var_map) current_other_val = res2.GetSolution(other_vars)
你只需要提前一次性定义好包含所有约束的完整优化问题,后续迭代仅需更换fixed_var_map里的固定变量和取值即可,无需重建问题。
方法2:添加等式约束固定(适合长期固定变量场景)
如果某部分变量需要在所有迭代中固定,不需要切换,可直接给变量添加上下界相等的边界约束实现固定:
# 固定单个变量为指定值 prog.AddBoundingBoxConstraint(2.5, 2.5, V_coeffs[0]) # 批量固定变量为数组fixed_vals中的对应值 prog.AddBoundingBoxConstraint(fixed_vals, fixed_vals, V_coeffs)
注意:该方式会直接修改优化问题本身,后续如果需要取消固定,需要手动删除对应的约束实例,灵活度低于方法1。
内容的提问来源于stack exchange,提问作者noopygbhat
相关产品推荐
相关产品推荐

