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

📄 saa.m

📁 遗传算法的matlab程序库 别人的辛勤劳动
💻 M
字号:
function [y,p,Initial_Group_position]=SAA(Parameter_Sum,Initial_Group,Sample_Sum)%SAA---Simulated Annealing Algorithm模拟退火法
%Sample_Sum是参数总数(群体中个体总数,等于G_Sample_Sum),Initial_Group样本x的模拟邻域(初始化的群体数组),里面的行向量(例:[2,5,6])为参数的位置
%随机从总参数中选取Parameter_Sum(等于G_Sample_Sum_Dimension)个参数
disp(nargoutchk(0,3,nargout))
[J_Yuan,Para_Position,Initial_Group_p,Parameter_Sum_All]=wh_test(Parameter_Sum,Initial_Group,Sample_Sum);
% Max=J_Yuan;Max_1=Max;
% Temperature=30;Decline=0.8;Step=Sample_Sum*2;Temp_step=1;
% Temperature_Initial=Temperature; Temperature_End=1;Max_1_Max=0;
Max=J_Yuan;Max_1=Max;Max_2=Max;
Temperature=30;Temperature_Initial=Temperature; Temperature_End=1;Decline=0.8;
Temp_step=1;Sample_step=1;step=1;
Max_1_Max=0;Max_2_Max=0;

Temp_step_Point=round((Temperature_Initial-Temperature_End)/10);%将温度起点和终点分为10段,每段的两个端点都是采样点
if (Temp_step_Point<2)
    Temp_step_Point=2;
end

if (Sample_Sum<=100)
    Sample_step_Point=Sample_Sum;%在样本中每两个采样点间的间隔最小为Sample_Sum
    Sample_Sum_Step_End=100;
elseif and((Sample_Sum>100),(Sample_Sum<=10000))
    Sample_step_Point=round(Sample_Sum/10);
    Sample_Sum_Step_End=Sample_Sum;
else
    Sample_step_Point=1000;
    Sample_Sum_Step_End=10000;
end

while ~(Temperature<Temperature_End)
    Temp_step=Temp_step+1;
    if (Temp_step==round((Temperature_Initial-Temperature_End)/10))%将温度起点和终点分为10段,每段的两个端点都是采样点
        if (Max_1==Max)
            Max_1_Max=1;
            break;%如果两个采样点的值相同,那末认为已经找到最优解,退出循环
        else
            Temp_step=1;%如果不相同,继续降温Temperature=Temperature*Decline;
        end
    end
    
%     for step=1:Step
Max_2_Max=0;
while ~(step>Sample_Sum_Step_End)
        Sample_step=Sample_step+1;
    if (Sample_step==Sample_step_Point)
        if (Max_2==Max)
            Max_2_Max=1;%说明在没到(step>Sample_Sum_Step_End)时就已经退出循环了
            break;%如果两个采样点的值相同,那末认为已经达到该温度下的平衡,退出while (step>Sample_Sum_Step_End)循环
        else
            Sample_step=1;%如果不相同,继续采样
        end
    end

        [J_Xin,P,Initial_Group_p]= wh_test(Parameter_Sum,Initial_Group,Sample_Sum);
        D=J_Xin-J_Yuan;D=D*10^5;
        if J_Xin>=J_Yuan
            Max=J_Xin;
            J_Yuan=J_Xin;
            Para_Position=P;
            Initial_Group_position=Initial_Group_p;
            
            if (Sample_step==1)
                Max_2=Max;
            end%(Sample_step==1)

            if (Temp_step==1)
                Max_1=Max;
            end%if (step==1)
        else
            Edge=rand(1);
            if exp(D/Temperature)>Edge
                Max=J_Yuan;
%                 Initial_Group_position=Initial_Group_p;
            if (Sample_step==1)
                Max_2=Max;
            end%(Sample_step==1)

                if (Temp_step==1)
                    Max_1=Max;
                end%if (step==1)
            end%---if exp(D/Temperature)>Edge
        end%-----if J_Xin>=J_Yuan    
        step=step+1;
end%while (step>Sample_Sum)
%     end%---Step

    Temperature=Temperature*Decline;    
end%---while ~(Temperature<1)
y=Max;
p=Para_Position;

⌨️ 快捷键说明

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