跳到主要内容

不等式约束定义

OPTIMake支持以下类型的不等式约束:

  • general_inequality: 通用类型, 通过表达式直接定义
  • external_general_inequality: 通用类型, 通过外部C/C++函数定义

同时, 在OPTIMake的collision avoidance扩展功能中, 实现了对几何图形避障约束的直接支持, 支持以下类型的避障不等式约束:

  • point_to_rectangle_inequality: 点对矩形的避障不等式约束
  • rectangle_to_rectangle_inequality: 矩形对矩形的避障不等式约束

在完成约束定义后, 通过以下接口添加该约束:

prob.inequality(ineq, weight_soft, penalty_type)

其中, inequality接口的函数入参的定义如下 (约束软化下详见 建模接口 > 约束软化) :

  • ineq: 不等式约束, 类型为general_inequality, external_general_inequality, collision_avoidance_inequality
  • weight_soft: 该约束软化时的惩罚权重list, 必须为非负, 可以为常数或关于参数pp的表达式, 默认值为全inf, 表示硬约束
  • penalty_type: 该约束软化的惩罚类型list, 可选值为'none', 'quadratic', 'l1', 默认值为全'none', 表示硬约束
信息
  • 当约束类型为external_general_inequality时, 只能调用一次prob.inequality设置约束
  • 当约束为其他类型时, 可调用多次prob.inequality添加多个约束

general_inequality

下面为通过general_inequality定义不等式约束的例子:

# -1.0 <= x + y <= 1.0
ineq = general_inequality(
expr = [x + y, x + y],
sign = ['>=', '<='],
bound = [-1.0, 1.0])
prob.inequality(ineq)

其中, general_inequality接口的入参如下:

  • expr: 不等式约束的表达式的list
  • sign: 不等式约束的符号, 可选值为"<=", ">="的list
  • bound: 不等式约束的边界, 可以为常数或关于参数pp的表达式的list

当所有的不等式约束都具备一样的sign和bound时, 可简化sign和bound的定义. 如以上的不等式约束也可通过以下实现:

# -1.0 <= x + y <= 1.0
ineq = general_inequality(
expr = [x + y, -(x + y)],
sign = '<=',
bound = 1.0)
prob.inequality(ineq)

external_general_inequality

通过外部C/C++函数定义的general_inequality, 其表达式为g(v,p)0g(v,p) \geq 0. 在建模时, 可以指定其Jacobian & Hessian的稀疏性加速运算.

下面为external_general_inequality的例子:

ineq_spy_jac = \
[[1, 1, 0, 0],
[1, 1, 0, 0]]

ineq_spy_hess = \
[[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]]

ineq = external_general_inequality(
dim = 2,
sparsity_jacobian=ineq_spy_jac,
sparsity_hessian=ineq_spy_hess)
prob.inequality(ineq)

其中, external_general_inequality接口的入参如下:

  • dim: 该约束的维度
  • sparsity_jacobian (optional): g(v,p)g(v, p)的Jacoboian的sparsity pattern, 维度为dim×nv\times n_{v}的矩阵, 0代表稀疏, 1代表稠密;其默认值为全1.0
  • sparsity_hessian (optional): zTg(v,p)z^T g(v, p)的Hessian的sparsity pattern (z为维度为dim×1\times 1的拉格朗日乘子), 维度为nv×nvn_{v} \times n_{v}的对称矩阵, 0代表稀疏, 1代表稠密;其默认值为全1.0