Julia调用QPDAS的QuadraticProgram报无匹配方法错误
QPDAS 调用 QuadraticProgram 触发 MethodError 修复方案
核心错误原因
报错信息已经明确给出关键提示:QuadraticProgram 构造函数不支持 z、P 这两个关键字参数,你的代码存在两个核心问题:
- 参数顺序和传参方式完全错误
你错误将约束参数放在了参数列表最前方,且把目标函数必需的两个核心参数当成了关键字传入。QPDAS 中接受semidefinite/ϵ等关键字的6参数构造函数,位置参数严格按照「目标函数参数在前,约束/边界参数在后」排列,其中二次项矩阵P、线性项向量q是前两个必填位置参数,不支持作为关键字传入。 - 等式约束右端向量维度不匹配
你将等式约束矩阵A处理为1行length(points)列的矩阵,但对应生成的右端向量b长度为length(points),和约束矩阵维度不匹配,就算参数顺序正确后续也会触发维度错误。
正确参数顺序
6位置参数版本的QuadraticProgram参数顺序为:
- 第1位(矩阵类型):目标函数二次项矩阵
P,对应你代码中constructMatrix(points)生成的M - 第2位(向量类型):目标函数线性项向量
q,对应你代码中命名为z的全1向量 - 第3位(矩阵类型):等式约束矩阵
Aeq,对应你代码中定义的A - 第4位(向量类型):等式约束右端向量
beq,需匹配Aeq的行数,你的场景下应为长度1的0向量 - 第5位(向量/矩阵类型):不等式约束或变量下界,你的场景下是
x≥0约束,直接传长度为变量数的0向量作为下界即可,无需手动构造-I对角矩阵 - 第6位(任意类型):变量上界或其他约束参数,你的场景下无统一上界可传
fill(Inf, n)
修正后的可运行代码
function getSolution(points) # array of tuples with a tuple and an Int64 n = length(points) # 目标函数参数 P = constructMatrix(points) q = ones(n) # 等式约束:sum(points[i][2] * x[i]) = 0 Aeq = reshape([points[i][2] for i=1:n], 1, n) beq = [0.0] # 变量非负约束 x ≥ 0,无统一上界 lb = zeros(n) ub = fill(Inf, n) qp = QuadraticProgram(P, q, Aeq, beq, lb, ub; semidefinite = true, ϵ = sqrt(eps(Float64)), smartstart = true, scaling = true) sol, val = solve!(qp) return sol end
补充说明
报错中出现的::UniformScaling{Bool}类型参数,是因为你传参时误将LinearAlgebra包的单位矩阵I作为位置参数传入了,修正参数顺序、移除z/P的关键字传参写法后该问题会自动消失。
如果你需要传入非边界形式的一般线性不等式Cx ≤ d,需要调用QPDAS对应多参数构造函数,不要直接传入6参数版本。
内容的提问来源于stack exchange,提问作者mushrooms
相关产品推荐
相关产品推荐

