⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msp.m

📁 多处理器调度 均场退火matlab程序,100%能运行
💻 M
字号:
%多处理器调度仿真程序%%%%%%%%%%%%%%%%%%%%%%
%           图10.4 17任务                %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function msp()
clc;
N=17; %任务数
P=3;  %处理器个数
M=6; %时间段数
%连接矩阵赋值%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
C0=zeros(N,N);
C0(1,4)=1;C0(1,5)=1;C0(1,6)=1;
C0(2,7)=1;C0(3,11)=1;
C0(4,8)=1;
C0(5,8)=1;
C0(6,9)=1;
C0(7,10)=1;
C0(8,12)=1;C0(8,13)=1;
C0(9,14)=1;
C0(10,15)=1;
C0(11,16)=1;C0(11,17)=1;
%参数赋值%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%A=7.5,F=3,C=3,D=1,E=1%%
A=7.5;
B=0;
C=3;
D=1;
E=1; 
F=3; %拉格朗日参数
T0=9;  %初始温度
beta=0.9; %温度迭代参数
delta_1=10^(-5);
num=3000;
diedai=50000;
t=1;%能量函数自变量
V=0.9*rand(N,M);%初始化
%主降温程序%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for x=1:num
    %迭代%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    for y=1:diedai
        tempV=V;
        V_1=NewV(A,B,C,D,E,F,P,N,M,T0,C0,V);
                 energy1(t)=energy(A,B,C,D,E,F,P,N,M,C0,V_1);
                 ene=energy1(t) %能量函数
        V=V_1;
        if sum(sum(abs(tempV-V_1),1))<delta_1
            break
        end
                 t=t+1;
    end
    T0=beta*T0; %降温
    [ch,c3,VF]=check(P,C0,V);
    if ch==0
        if c3==0
            disp('ok')
            zlV=VF
            for a=1:M
                tt=1;
                for i=1:N
                    if zlV(i,a)==1
                        mspf(a,tt)=i;
                        tt=tt+1;
                    end
                end  %调度结果输出
            end
        end
        diaodu=mspf
        break
    end
end
save mspf
if x>num
    disp('miss')
%     [ch,c3,VF]=check(P,C0,V)
end
 plot(energy1) %能量变化绘制


%更新函数%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function New_V=NewV(A,B,C,D,E,F,P,N,M,T0,C0,V)
% i=unidrnd(N,1,1);
a=unidrnd(M,1,1); %随机选择更新神经元
for i=1:N
%     for a=1:M
        D1=2*sum(V(i,:))-2*V(i,a);
        temp=sum(V(:,a));
%        D2=2*(temp-P)*temp+(temp-P)^2;
        if a==1
            D3=sum(C0(:,i));
        else
            tc=C0(:,i)';
            tv=V(:,1:a-1);
            ta=(1-sum(tv,2)).^2;
            D3=tc*ta;
        end
        D4=2*(sum(V(i,:))-1);
        D5=1-2*V(i,a);
        D6=2*sum(sum(V(:,a))-P);
        d_V=A*D1+C*D3+D*D4+E*D5+F*D6;
        V(i,a)=0.5*(1+tanh(-d_V/(2*T0)));%神经元更新
%     end
end
for i=1:N
    for a=1:M
        if V(i,a)<0.01
            V(i,a)=0;
        else
            if V(i,a)>0.99
                V(i,a)=1;
            end
        end
    end
end     
New_V=V;

%能量函数%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function ET=energy(A,B,C,D,E,F,P,N,M,C0,V)
E1=sumsqr(sum(V,2))-sumsqr(V);
%E2=(sum(V,1)-P).^2*sum(V,1)';
E3=0;
for i=2:N
    E3=E3+sum(C0(1:i-1,i))*V(i,1);
end
for a=2:M
    for i=2:N
        E3=E3+V(i,a)*( C0(1:i-1,i)'*(1-sum(V(1:i-1,1:a-1),2)).^2 );
    end
end
E4=sum((1-sum(V,2)).^2);
E5=sum(sum(V,1))-sumsqr(V);
E6=sumsqr(sum(V,1)-P);
ET=A*E1+C*E3+D*E4+E*E5+F*E6;

%约束检验函数%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [check,c3,VF]=check(P,C0,V)
[N,M]=size(V);
for i=1:N
    for a=1:M
        if V(i,a)<0.7
            V(i,a)=0;
        else 
            if V(i,a)>0.3
                V(i,a)=1;
            end
        end
    end
end
VF=V;
check1=sumsqr(sum(V,2)-1);%每个任务在一个时间段执行
c2=max(sum(V,1));
if c2>P
    check2=1;
else
    check2=0;
end  %每个时间段任务数不超过P
E3=0;
for i=2:N
    E3=E3+sum(C0(:,i))*V(i,1);
end
for a=2:M
    for i=2:N
        E3=E3+V(i,a)*( C0(:,i)'*(1-sum(V(:,1:a-1),2)).^2 );
    end
end
check3=N-sum(sum(V,1)); %总完成任务数
check=check1+check2+check3;
c3=E3;%调度顺序检验

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -