MATLAB:一种特殊线性规划的快速高效求解方法
我有一点编程经验,所以我很确定我没有以最佳方式编写问题代码,所以我很乐意听到任何提示 我有两个参数:问题的维度MATLAB:一种特殊线性规划的快速高效求解方法,matlab,mathematical-optimization,linear-programming,Matlab,Mathematical Optimization,Linear Programming,我有一点编程经验,所以我很确定我没有以最佳方式编写问题代码,所以我很乐意听到任何提示 我有两个参数:问题的维度n和约束矩阵nxn其中n=2n。在我的例子中,B是对称的,只有正值。我需要解决以下问题 也就是说,我需要根据B(I,j)给出的成对距离约束,最大化某个平均距离 我现在的做法是实现linprog(-f,A,b)where f = ones([1,n])/n; f = [f -f] 及 而A的定义如下 A = zeros([N^2,N]); for i = 1:N for j =
n
和约束矩阵nxn
其中n=2n
。在我的例子中,B
是对称的,只有正值。我需要解决以下问题
也就是说,我需要根据B(I,j)
给出的成对距离约束,最大化某个平均距离
我现在的做法是实现linprog(-f,A,b)
where
f = ones([1,n])/n;
f = [f -f]
及
而A
的定义如下
A = zeros([N^2,N]);
for i = 1:N
for j = 1:N
if i ~= j
A((i-1)*N + j,i) = 1;
A((i-1)*N + j,j) = -1;
end
end
end
然而,当
n=500
时,即使是a
的简单构造也需要相当长的时间,更不用说线性规划的解需要多长时间。非常感谢您提供的任何提示,请随时重新标记。首先,请尝试构建A
,如下所示:
AI = eye(N);
AV = ones(N, 1);
A = kron(AI, AV) - kron(AV, AI);
我认为它的运行速度应该至少比您创建它的方式快一个数量级。除了以更有效的方式创建问题矩阵外,您可能还需要考虑使用MATLAB接口。我发现我的解决时间可以大大减少。根据问题的大小,您可能会看到另一个数量级的减少
如果您是一名学者,您可以免费获得CPLEX或Gurobi许可证,这将进一步缩短求解时间,而无需大量修改解算器参数。这对于您描述的大小的问题可能是必要的。看起来您的解决方案的维度是2n。@Jacob:您是对的,修复了,谢谢您的建议,但令人惊讶的是,它比我的帖子中的
a
的原始定义运行得慢。例如,当n=200
因此n=400
时,原始代码在0.1秒内构造A
,而您建议的代码在2秒内运行。如果您感兴趣,我可以提供m文件
AI = eye(N);
AV = ones(N, 1);
A = kron(AI, AV) - kron(AV, AI);