约束环节和写目标函数当中,不可以直接的出现非线性项,gurobi和cplex都不支持非线性项的直接计算。
例如:这里的 f(i) ^ num_mk(i),次方项就不允许计算。
% 定义变量
f = sdpvar(data.n, 1,'full');
num_mk = intvar(data.n, 1,'full');
% 约束
Constraints = [];
for i = 1:data.n
Constraints = [Constraints, sum_mk(i) == f(i) ^ num_mk(i)];
end
改进措施:
1. 如果num_mk当中的值是固定的,比如都是3
即可拆开写约束,引入辅助变量:sum_mk1 = sdpvar(data.n, 1,'full');
for i = 1:data.n
Constraints = [Constraints, sum_mk1(i) == f(i) * f(i)];
end
for i = 1:data.n
Constraints = [Constraints, sum_mk(i) == sum_mk1(i) * f(i)];
end
这里有一个值得注意的一点:千万不要写成f(i) * f(i)* f(i),一定要拆开写约束
否则会报错,不支持多项式的运算
2. 如果幂次是小数或者幂次向量当中元素不尽相同的话,可以根据实际问题尝试建立辅助函数。
3.进行近似话处理(存在误差),如果向量当中元素约束的量值差别不是很大,可以进行近似化处理