PISA 架构芯片资源排布问题算法实现I

本文旨在分享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

这样子,我们就可以把刚才非常复杂的无权有向图中所有的环剪断,变成拥有最长路径的树状分支图~然后我们就可以根据数据依赖关系和资源依赖关系进行排层数啦~

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数学建模备赛和学习资料 数学建模大赛赛题、解决方案资料,供备赛者学习参考!数学建模大赛赛题、解决方案资料,供备赛者学习参考!数学建模大赛赛题、解决方案资料,供备赛者学习参考!数学建模大赛赛题、解决方案资料,供备赛者学习参考!数学建模大赛赛题、解决方案资料,供备赛者学习参考!数学建模大赛赛题、解决方案资料,供备赛者学习参考!数学建模大赛赛题、解决方案资料,供备赛者学习参考!数学建模大赛赛题、解决方案资料,供备赛者学习参考!数学建模大赛赛题、解决方案资料,供备赛者学习参考!数学建模大赛赛题、解决方案资料,供备赛者学习参考!数学建模大赛赛题、解决方案资料,供备赛者学习参考!数学建模大赛赛题、解决方案资料,供备赛者学习参考!数学建模大赛赛题、解决方案资料,供备赛者学习参考!数学建模大赛赛题、解决方案资料,供备赛者学习参考!数学建模大赛赛题、解决方案资料,供备赛者学习参考!数学建模大赛赛题、解决方案资料,供备赛者学习参考!数学建模大赛赛题、解决方案资料,供备赛者学习参考!数学建模大赛赛题、解决方案资料,供备赛者学习参考!数学建模大赛赛题、解决方案资料,供备赛者学习参考!数学建模大赛赛题、解决方案资料,供备赛者学习参考!数学建模大赛赛题、解决方案资料,供备赛者学习参考!数学建模大赛赛题、解决方案资料,供备赛者学习参考!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值