卫生站选址问题 Matlab 代码示例

% 两个卫生站选址问题,卫生站问题
% 原理
% 穷举所有的排列组合计算每种组合的最大距离
% 对于每一种组合的每一对取最小:
% [matlab 找矩阵中每行或每列的最大值]
% (http://blog.csdn.net/carrie8899/article/details/8500088),
% 即从一个乡镇出发,到两个卫生站的距离取最近的距离
% 每一种取最大: max(),这一种排列组合下的最大距离
% About
% ringsaturn: https://github.com/ringsaturn
% 2017-04

% Graph
A=[  0    13     0     8    12     0    15     0     0     0     0     0     0     0
    13     0     8     0    13    10     0     0     0     0     0     0     0     0
     0     8     0     0     0     9     0     0    16     0     0     0     0     0
     8     0     0     0     0     0     8     0     0     0     0     0     0     0
    12    13     0     0     0     0     0    10     0     0     0     0     0     0
     0    10     9     0     0     0     0    12     0     0     0     0     0     0
    15     0     0     8     0     0     0    12     0    13     0     6     0     0
     0     0     0     0    10    12    12     0     7     0     0     0    14     8
     0     0    16     0     0     0     0     7     0     0     0     0     0    10
     0     0     0     0     0     0    13     0     0     0     7     0     0     0
     0     0     0     0     0     0     0     0     0     7     0     7     9     0
     0     0     0     0     0     0     6     0     0     0     7     0    10     0
     0     0     0     0     0     0     0    14     0     0     9    10     0    12
     0     0     0     0     0     0     0     8    10     0     0     0    12     0];
G=graph(A);
x=[ 32,  40,  41,  24,  27,  32,  18,  19,  25,   7,   8,  14,   6,  15];
y=[ 26,  16,   8,  26,  16,  10,  21,   9,   5,  26,  20,  17,  11,   3];
nlabels = cell(14,1);  for k=1:14  nlabels{k,1}=['V' num2str(k)]; end;
h=plot(G, 'EdgeLabel',G.Edges.Weight, 'NodeLabel',nlabels,'xdata',x,'ydata',y);


% 创建结构体
% i,j,k,value

r=0;
for i = 1:14
  for j = 1:14
    if j>i
            r = r+1;
        end
    end
end

a=cell(1,r);
hinfo=struct('i',a,'j',a,'k',a,'v',a);

% 就像在维吉尼亚密码中做的那样,
% 利用嵌套循环,数据和索引保存到结构体中
% 只不过,这次无论是循环还是结构体,都是从1开始的

k = 1; %用于记录循环次数
for i = 1:14
  for j = 1:14
    if j>i
      currentD = distances(G,[i,j]);
      value = max(min(currentD));
            hinfo(k).i = i;
            hinfo(k).j = j;
            hinfo(k).k = k;
            hinfo(k).v = value;
            k=k+1;
    end
  end
end

% deal with the data
% through GUI `Sort AScending`
[~,index] = sortrows([hinfo.v].'); hinfo = hinfo(index); clear index
hi = hinfo(1).i;
hj = hinfo(1).j;
hv = hinfo(1).v;

fprintf('在 %d 和 %d 处有最小距离 %d', hi,hj,hv );

代码中有一个变量用于 循环计数。相比之下,Python 提供了更加优雅的解决方法

for i, v in enumerate(['a', 'b']):
    print(i, v)
Comments
Write a Comment