目前,我需要开发一种算法来解决优化问题
我遇到一个问题,我计算设施之间的距离是不够有效的。
现在,我给出了矩阵,这是设施的长度。
A = [0.0300 % The left most facility
0.0400 % 2nd
0.0500 % 3rd
0.0200 % 4th
0.0600]; % The right most facility
说,我想找到两个设施中心之间的距离。(假设之间没有差距)例如:
第2和第5设施中心之间的距离= 0.0400 / 2 + 0.0500 + 0.0200 + 0.0600 / 2 = 0.1200
由此,我们可以形成一个矩阵B,它是我想要的输出(也可以是对称矩阵)
B = [0 0.0350 0.0800 0.1150 0.1550
0 0 0.0450 0.0800 0.1200
0 0 0 0.0350 0.0750
0 0 0 0 0.0400
0 0 0 0 0];
我试图避免嵌套for循环。这是我能想到的最好的矩阵B。
n = numel(A);
x = triu(repmat(A,1,n));
B = zeros(5);
x = x - diag(diag(x)/2);
for i=1:4
x(i,:) = x(i,:)/2;
y = x;
B(i,:) = sum(y);
x(i,:) = 0;
end
B = B - diag(diag(B))
当然,矩阵大小在现实中非常大,而且我的方式不够有效。是否有任何技巧可以获得矩阵B而不是使用for循环?
答案 0 :(得分:1)
您可以用不同的方式思考问题 - 基本上您计算的是每个设施的起点与每个设施的终点之间的距离的平均值。即。
<------start dist------>
[ A ][ B ][ C ][ D ]
<--------------end dist-------------->
您可以使用以下方法计算每个设施的起点和终点:
end_pts = cumsum(A);
start_pts = end_pts - A;
然后您可以使用以下方法计算起点和终点距离:
start_dist = abs(bsxfun(@minus,start_pts,start_pts'));
end_dist = abs(bsxfun(@minus,end_pts,end_pts'));
然后取这些矩阵的平均值来找出中心之间的距离:
B = (start_dist + end_dist)./2;