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

📄 sa.m

📁 模拟退火解决0-1背包问题
💻 M
字号:
%模拟退火解决0-1背包问题
clear;
a=[92,4,43,83,84,68,92,82,6,44,32,18,56,83,25,96,70,48,14,58];    %体积
c=[44,46,90,72,91,40,75,35,8,54,78,40,77,15,61,17,75,29,75,63];   %价值
n=length(a);
b=878;                                                   %  背包容量
x=zeros(1,n);                                            %  初始解
t0=20;                                                   %  初始温度
tf=0.5;                                                  %  最终温度 
t=t0;
alpha=0.5;                                               %  衰减系数 
Lk=100*n;                                                %  马氏链长 
f=0;
m=0;
for i=1:n
    f=f+a(i)*x(i);                                       %  总体积
    m=m+c(i)*x(i);                                       %  总价值
end
fmax=f;
mmax=m;
xper=x;
ii=0;

while t>tf;
    for p=1:Lk;
        i=round(rand*(n-1))+1;
        if x(i)==0;
            if f+a(i)<=b;
                x(i)=1;m=m+c(i);f=f+a(i);
            else f+a(i)>b;
                j=round(rand*(n-1))+1;
                while x(j)==0;
                    j=round(rand*(n-1))+1;
                end
                da=a(i)-a(j);
                dc=c(i)-c(j);
                if f+da<=b                             %  接受准则 
                    if dc>0
                    x(i)=1;x(j)=0;f=f+da;m=m+dc;
                    else exp(dc/t)>rand; 
                    x(i)=1;x(j)=0;f=f+da;m=m+dc;
                   end
                end
            end
        else x(i)==1;
            j=round(rand*(n-1))+1;
            while x(j)==1;
                j=round(rand*(n-1))+1;
            end
            da=a(j)-a(i);
            dc=c(j)-c(i);
            if f+da<=b                                 %  接受准则 
                if dc>0
                    x(i)=0;x(j)=1;f=f+da;m=m+dc;
                else exp(dc/t)>rand;
                    x(i)=0;x(j)=1;f=f+da;m=m+dc;
                end
            end
        end
     
      if mmax<m
          mmax=m;fmax=f;xper=x;
      end
      
    end
       
     ii=ii+1;
    t=t*alpha;                %   降温
     mq(ii)=mmax;             % 记录局部最优
     fq(ii)=fmax;
end
mmax=0;
  for i=1:ii ;                                        
   if mmax<mq(i);            %  记录全局最大价值 
       mmax=mq(i);                                    
   end
   if fmax<fq(i)  ;          %  记录背包用量                             
       fmax=mq(i);
  end
end
mmax                         %  输出全局最优解      
fmax                         %  输出此时背包容量
xper                         %  输出物品选择情况
end

            
                
      
           
                    
                
                
               
                
        
        
    

⌨️ 快捷键说明

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