当前位置: 首页 > news >正文

数学建模-退火算法和遗传算法

退火算法和遗传算法

一.退火算法

退火算法Matlab程序如下:

[W]=xlsread('D:100个目标经度纬度');>> x=[W(:,1)];>> y=[W(:,2)];>> w=[x y];;d1=[70, 40];>> w=[d1;w;d1]w=w*pi/180;%角度化成弧度d=zeros(102);%距离矩阵初始化for i=1:101for j=i+1:102d(i,j)=6370*acos(w(i,1)-w(j,1))*cos(w(i,2))*cos(w(j,2))+sin(w(i,2))*sin(w(j,2));endendd=d+d';path=[];long=inf;%巡航路径及长度初始化rand('state',sum(clock));%初始化随机数发生器for j=1:1000path0=[1 1+randperm(100),102];temp=0;for i=1:101temp=temp+d(path0(i),path0(i+1));endif temp<longpath=path0;long=temp;endende=0.1^30;L=2000;at=0.999;T=1;for k=1:L %退火过程c=2+floor(100*rand(1,2));% floor(100*rand(1,2))表示生成向下取整的0~991行2列矩阵c=sort(c);c1=c(1);c2=c(2);% c=sort(c)表示对矩阵c进行升序排列df=d(path(c1-1),path(c2))+ d(path(c1),path(c2+1))-d(path(c1-1),path(c1))- d(path(c2),path(c2+1));%计算代价函数值的增量if df<0;%接受准则path=[path(1:c1-1),path(c2:-1:c1),path(c2+1:102)];long=long+df;else if exp(-df/T)>=randpath=[path(1:c1-1),path(c2:-1:c1),path(c2+1:102)];long=long+df;endT=T*at;if T<eBreak;endend>>path;>>long;>>xx=w(path,1);>>yy=w(path,2);>> plot(xx,yy,'-o')

[W]=load('D:100个目标经度纬度.txt');

二、遗传算法

[E]=xlsread('D:100个目标经度纬度'); %加载敌方 100 个目标的数据, 数据按照表格中的位置保存在纯文本文件 sj.txt
x=[E(:,1)];
y=[E(:,2)];

e=[x y]; d1=[70,40];
e=[d1; e;d1]; e= e*pi/180;
d=zeros(102); %距离矩阵 d
for i=1:101
    for j=i+1:102
       temp=cos(e(i,1)-e(j,1))*cos(e(i,2))*cos(e(j,2))+sin(e(i,2))*sin(e(j,2));
       d(i,j)=6370*acos(temp);
     end
end
d=d+d';L=102;w=50;dai=100;
%通过改良圈算法选取优良父代 A
for k=1:w
    c=randperm(100);
    c1=[1,c+1,102];
    flag=1;
  while flag>0
     flag=0;
    for m=1:L-3
      for n=m+2:L-1
         if d(c1(m),c1(n))+d(c1(m+1),c1(n+1))<d(c1(m),c1(m+1))+d(c1(n),c1(n+1))
           flag=1;
           c1(m+1:n)=c1(n:-1:m+1);
         end
      end
    end
  end
   J(k,c1)=1:102;
end
J=J/102;
J(:,1)=0;J(:,102)=1;
rand('state',sum(clock));
%遗传算法实现过程
A=J;
for k=1:dai %产生 01 间随机数列进行编码
    B=A;
    c=randperm(w);
%交配产生子代 B
    for i=1:2:w
        F=2+floor(100*rand(1));
        temp=B(c(i),F:102);
        B(c(i),F:102)=B(c(i+1),F:102);
        B(c(i+1),F:102)=temp;
    end
%变异产生子代 C
by=find(rand(1,w)<0.1);
if length(by)==0
    by=floor(w*rand(1))+1;
end
C=A(by,:);
L3=length(by);
for j=1:L3
   bw=2+floor(100*rand(1,3));
   bw=sort(bw);
   C(j,:)=C(j,[1:bw(1)-1,bw(2)+1:bw(3),bw(1):bw(2),bw(3)+1:102]);
end
   G=[A;B;C];
   TL=size(G,1);
   %在父代和子代中选择优良品种作为新的父代
   [dd,IX]=sort(G,2);temp(1:TL)=0;
   for j=1:TL
       for i=1:101
           temp(j)=temp(j)+d(IX(j,i),IX(j,i+1));
       end
   end
     [DZ,IZ]=sort(temp);
     A=G(IZ(1:w),:);
end
path=IX(IZ(1),:);
long=DZ(1);
xx=e(path,1);yy=e(path,2);

path

long

plot(xx,yy,'-o')

三.改进的遗传算法

clc,clear
[E]=xlsread('D:100个目标经度纬度');

>> x=[E(:,1)];

>> y=[E(:,2)];

>> e=[x y];;d1=[70, 40];

>> e=[d1;e;d1]

e=e*pi/180;%角度化成弧度

d=zeros(102); %距离矩阵 d
for i=1:101
   for j=i+1:102
    temp=cos(e(i,1)-e(j,1))*cos(e(i,2))*cos(e(j,2))+sin(e(i,2))*sin(e(j,2));
    d(i,j)=6370*acos(temp);
   end
end
d=d+d';L=102;w=50;dai=100;
%通过改良圈算法选取优良父代 A
for k=1:w
   c=randperm(100);
   c1=[1,c+1,102];
   flag=1;
  while flag>0
       flag=0;
    for m=1:L-3
     for n=m+2:L-1
      if d(c1(m),c1(n))+d(c1(m+1),c1(n+1))<d(c1(m),c1(m+1))+d(c1(n),c1(n+1))
        flag=1;
        c1(m+1:n)=c1(n:-1:m+1);
      end
     end
   end
  end
   J(k,c1)=1:102;
end
J=J/102;
J(:,1)=0;J(:,102)=1;
rand('state',sum(clock));
%遗传算法实现过程
A=J;
for k=1:dai %产生 0~1 间随机数列进行编码
   B=A;
   %交配产生子代 B
   for i=1:2:w
      ch0=rand;ch(1)=4*ch0*(1-ch0);
      for j=2:50
         ch(j)=4*ch(j-1)*(1-ch(j-1));
      end
      ch=2+floor(100*ch);
      temp=B(i,ch);
      B(i,ch)=B(i+1,ch);
      B(i+1,ch)=temp;
   end
%变异产生子代 C
by=find(rand(1,w)<0.1);
if length(by)==0
    by=floor(w*rand(1))+1;
end
C=A(by,:);
L3=length(by);
for j=1:L3
   bw=2+floor(100*rand(1,3));
   bw=sort(bw);
   C(j,:)=C(j,[1:bw(1)-1,bw(2)+1:bw(3),bw(1):bw(2),bw(3)+1:102]);
end
G=[A;B;C];
TL=size(G,1);
%在父代和子代中选择优良品种作为新的父代
[dd,IX]=sort(G,2);temp(1:TL)=0;
for j=1:TL
   for i=1:101
      temp(j)=temp(j)+d(IX(j,i),IX(j,i+1));
   end
end
  [DZ,IZ]=sort(temp);
  A=G(IZ(1:w),:);
end
path=IX(IZ(1),:)
long=DZ(1)

xx=e(path,1);yy=e(path,2);

path

long

plot(xx,yy,'-o')

http://www.lryc.cn/news/292659.html

相关文章:

  • Qt开源版 vs 商业版 详细比较!!!!
  • 华为云CodeArts Snap荣获信通院优秀大模型案例及两项荣誉证书
  • 小程序的应用、页面、组件生命周期(超全版)
  • TCP四次握手
  • EBC金融英国CEO:高波动性周期下,如何寻找市场的稳定性?
  • C++ Web 编程
  • docker笔记整理
  • 什么是git,怎样下载安装?
  • Camille-学习笔记-测试流程和测试设计
  • 【Python笔记-设计模式】建造者模式
  • 【LVGL源码移植】
  • 双非本科准备秋招(14.2)—— 进程与线程
  • 数据结构和算法笔记5:堆和优先队列
  • 第8章 SpringBoot任务管理
  • Qt5 基于OpenGL实现六轴机械臂三维仿真
  • 路由进阶
  • 分类预测 | Matlab实现SCN-Adaboost随机配置网络模型SCN的Adaboost数据分类预测/故障识别
  • 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之TextPicker组件
  • linux中vim的操作
  • 《统计学习方法:李航》笔记 从原理到实现(基于python)-- 第5章 决策树
  • 【C++11(一)】列表初始化and右值引用
  • 为什么SSL会握手失败?SSL握手失败原因及解决方案
  • STM32——智能小车
  • 开源:基于Vue3.3 + TS + Vant4 + Vite5 + Pinia + ViewPort适配..搭建的H5移动端开发模板
  • 缩略图保持加密(thumbnail-preserving encryption, TPE)的理论基础
  • nodejs+vue+mysql校园失物招领网站38tp1
  • GEDepth:Ground Embedding for Monocular Depth Estimation
  • 校园圈子论坛系统--APP小程序H5,前后端源码交付,支持二开!uniAPP+PHP书写!
  • VMware vCenter告警:vSphere UI运行状况警报
  • C# 引用同一个dll不同版本的程序集