本文旨在分享PISA 架构芯片资源排布问题,算法的MATLAB实现过程中一些个人观点~
首先,利用attachment3作出无权有向图并找出图中的起点和终点
function [G,P,Q] = algorithmI(A,N)
W = sparse(N,N);
for i=1:N
for j=3:13
if A(i,j)==700
break;
else
W(i,A(i,j)+1)=1;
continue
end
end
end
E = [];
for p=1:N
for q=1:N
if W(p,q)==1
E=[E;p,q];
end
end
end
s = E(:,1);
t = E(:,2);
G = digraph(s,t);
%Find the start and end points
P=[];
for i=1:N
D = indegree(G,i);
if D==0
P=[P,i];
end
end
Q=[];
for i=1:N
D = outdegree(G,i);
if D==0
Q=[Q,i];
end
end
end
##生成无权有向图
然后从终点出发,往回找前继节点,并记录链条信息
function [IFMT,preIDs,alpha,SIZE]=generate_pID(IFMT,alpha,which_floor,G,preIDs,SIZE)
floor_alpha = 1000;
last_floor = preIDs((which_floor-1),1:floor_alpha);
step = 1;
step1= 0;
for i=1:1000
if last_floor(1,i)==366
sub_preIDs = 0;
beta = 1;
SIZE(which_floor,i) = beta;
IFMT(which_floor,i) = step;
preIDs(which_floor,step) = sub_preIDs;
step = step + 1;
else
if last_floor(1,i)<=607 && last_floor(1,i)>0
sub_preIDs = (predecessors(G,last_floor(1,i))');
beta = size(sub_preIDs,2);
step1 = step+beta-1;
SIZE(which_floor,i) = beta;
IFMT(which_floor,i) = step1;
preIDs(which_floor,step:step1) = sub_preIDs;
step = step1 + 1;
end
end
alpha(which_floor,1)=find(preIDs(which_floor,:),1,'last');
end
删除重复节点
1)先删除第n批前继节点中重复出现的节点,并保留第一个出现的
function [preIDs,number] = d_sre(which_floor,preIDs,number)
A = preIDs(which_floor,:);
A=A';
[B I]=sort(A(:));
J=1:numel(A);
J(I)=J;
B([1;diff(B)]==0)=0;
B=reshape(B(J),size(A));
preIDs(which_floor,:)=B';
number(which_floor,1) = sum(sum(preIDs(which_floor,:)~=0));
end
2)利用第n批前继节点,删除前n-1批前继节点中重复出现的节点,并保留第n批前继节点第一个出现的
function [preIDs,number]=d_re_1(which_floor,preIDs,number)
anne = find(preIDs(which_floor,:),1,'last');
% %delete similar floor
[preIDs,number] = d_sre(which_floor,preIDs,number);
% %delete last all floorII
QQ = preIDs(1:which_floor-1,1:10000);
b = preIDs(which_floor,1:anne);
QQ(ismember(QQ,b))=0;
preIDs(1:which_floor-1,1:10000) = QQ;
for i=1:which_floor-1
number(i,1) = sum(sum(preIDs(i,:)~=0));
end
##用ismember函数提取第n行和前n-1行中重复出现的元素,并进行删除
主代码
function [A]=key_algorithm_1(A,B,G,Q1)
total_floor = 300;
alpha = zeros(total_floor,1);
alpha(1,1) = size(Q1,2);
preIDs = sparse(total_floor+1,50000);
IFMT = sparse(total_floor+1,50000);
SIZE = sparse(total_floor+1,50000);
number = zeros(total_floor,1);
%generate N0.1 floor
preIDs(1,1:alpha(1,1)) = Q1;
number(1,1) = 5;
%generate N0.2 floor
[IFMT,preIDs,alpha,SIZE]=generate_pID(IFMT,alpha,2,G,preIDs,SIZE);
[preIDs,number]=d_re_1(2,preIDs,number);
%generate cellar and solve problem1
cellar = 607;
for i=3:total_floor
[IFMT,preIDs,alpha,SIZE]=generate_pID(IFMT,alpha,i,G,preIDs,SIZE);
[preIDs,number]=d_re_1(i,preIDs,number);
end
这样子,我们就可以把刚才非常复杂的无权有向图中所有的环剪断,变成拥有最长路径的树状分支图~然后我们就可以根据数据依赖关系和资源依赖关系进行排层数啦~