不等式约束定义
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, 必须为非负, 可以为常数或关于参数的表达式, 默认值为全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: 不等式约束的边界, 可以为常数或关于参数的表达式的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
, 其表达式为. 在建模时, 可以指定其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): 的Jacoboian的sparsity pattern, 维度为dim的矩阵, 0代表稀疏, 1代表稠密;其默认值为全1.0
- sparsity_hessian (optional): 的Hessian的sparsity pattern (z为维度为dim的拉格朗日乘子), 维度为的对称矩阵, 0代表稀疏, 1代表稠密;其默认值为全1.0