如何在CVXPY中实现带循环的二次规划及形式适配疑问
CVXPY二次规划扩展与循环构建方法
CVXPY并非仅支持cp.Minimize(cp.sum_squares(A @ x - b))这类形式的二次规划,它兼容所有符合DCP规则的凸二次目标与约束,包括各类求和形式的表达式。
用循环构建求和式目标函数
完全可以像PULP那样通过嵌套for循环定义目标函数与约束,无需特殊API,直接结合Python原生循环与CVXPY表达式语法即可实现。以下是具体示例:
假设目标为求和形式的二次函数(对应你提供的图片形式):
$$\text{minimize} \quad \sum_{i=1}^N \sum_{j=1}^M \left( Q_{ij} x_i x_j + c_{ij} x_i \right)$$
代码实现:
import cvxpy as cp # 定义变量(支持连续/整数变量) N = 5 M = 3 x = cp.Variable(N, integer=False) # 整数变量设integer=True # 初始化目标,循环累加项 objective = cp.Minimize(0) Q = [[1.0]*M for _ in range(N)] # 示例系数矩阵 c = [[0.5]*M for _ in range(N)] for i in range(N): for j in range(M): quad_term = Q[i][j] * x[i] * x[j] linear_term = c[i][j] * x[i] objective += quad_term + linear_term
若为单维度求和(如$\sum_{i=1}^N (a_i x_i^2 + b_i x_i)$),单循环即可:
objective = cp.Minimize(0) a = [2.0]*N b = [1.0]*N for i in range(N): objective += a[i] * cp.square(x[i]) + b[i] * x[i]
用循环批量添加约束
约束同样可通过循环批量定义:
constraints = [] # 添加变量非负约束 for i in range(N): constraints.append(x[i] >= 0) # 添加线性等式约束 d = [5.0]*M for j in range(M): constraints.append(cp.sum(x) == d[j])
混合整数二次规划的循环实现
涉及混合整数变量时,仅需在定义变量时指定integer=True,循环逻辑保持一致:
x_int = cp.Variable(N, integer=True) x_cont = cp.Variable(M) # 构建混合整数目标 objective = cp.Minimize(0) for i in range(N): objective += cp.square(x_int[i]) for j in range(M): objective += x_cont[j] * x_int[0] # 添加约束 constraints = [x_int[i] <= 10 for i in range(N)] constraints += [x_cont[j] >= 0 for j in range(M)]
只要最终表达式符合DCP规则,CVXPY即可正常调用求解器完成求解。
内容的提问来源于stack exchange,提问作者happy
相关产品推荐
相关产品推荐

