• 大小: 50KB
    文件类型: .rar
    金币: 2
    下载: 1 次
    发布日期: 2021-04-21
  • 语言: Matlab
  • 标签: MATLAB  CVRP  蚁群算法  

资源简介

一个用蚁群算法做OCVRP的代码。不是很复杂,但通用性还可以,里面有实验用的数据。

资源截图

代码片段和文件信息

function []=CVRP()
clear all
close all
clc
%初始化蚁群
load data.txt
global n;        %点数目
global m;        %蚂蚁数目
global Weight_max;   %最大载重
global Length_max;   %最大距离
global Weight_all;   %各点的载重
global Point_all;    %所有点,包括起始点
global phe_all;      %每两个点之间的信息素   
global Weight_sum;   %货车当前载重
global alpha
global beta
global rho
global Q
Nc_max=2000;
alpha=1;
beta=8;
rho=0.9;
Q=100;
n=data(11)+1;%目标点个数
m=n;%蚂蚁的数量等于点的数量
Weight_max=data(12);%最大载重
Length_max=data(13);%最大路程
Weight_all=data(2:n+13);%所有点的载重
Point_all=data(2:n+11:2);%起始点加上目标点
[Pop_initeta_all]=PopinitCom(Point_all);%输出Pop_init为各个点之间的距离
phe_all=ones(nn);%初始化信息素矩阵都为1
Ant_no=0;         %蚂蚁正在的点的编号
Ant_visited_num=0;%蚂蚁已经访问过的点的数目
Ant_path=zeros(1n);%蚂蚁走过的路径
Ant_remained=zeros(1n);%蚂蚁还未走的路径
Best_length=inf;       %初始值设最短长度为很大
%Time_start=datenum(clock);
Flag=0;%判断搜索是否有更优的解0为没有,1为有
for i=1:Nc_max
    fprintf(‘开始第%d次搜索,剩余%d次‘iNc_max-i);
    Flag=0;%初始设没有
    for j=1:m
%****************************************************
        Ant_length=0;%蚂蚁走过的长度清0
        Ant_path=Ant_path*0;%蚂蚁走过的路径清0
        Ant_remained=Ant_remained+1;%所有点设为可去
        Ant_path(1)=1;%第一个点设为1,也就设为起始点
        Ant_no=1;%蚂蚁现在所在的点为1
        Ant_visited_num=1;%蚂蚁已经去过的点的数目为1
        Ant_remained(1)=0;%第一个点设为去过
%        rand(‘state‘ sum(100*clock));
%*******************************************************  
    while (Ant_visited_num        To_visit=-1;%将下一个即将要去的点设为-1
%******************************************************
%概率的确定是最基本的信息素乘以启发值
        Pro_sum=0;
        phe_all_sum=0;
        eta_all_sum=0;
      for jj=1:n
        if(Ant_remained(jj)==1)
            phe_all_sum=phe_all_sum+phe_all(Ant_nojj);
             eta_all_sum=eta_all_sum+eta_all(Ant_nojj);
        end
      end
        for ii=1:n
            if(Ant_remained(ii)==1)%点未访问过
                Probability(ii)=(phe_all(Ant_noii))^alpha*(eta_all(Ant_noii))^beta;
                Pro_sum=Pro_sum+Probability(ii);
            else
                Probability(ii)=0;%如果点去过该点的概率设为0
            end
        end
%******************************************************        
%这里使用轮盘赌的方法
        Temp=0;
        if Pro_sum>0
            Temp=rand*Pro_sum;
            for jj=1:n
                if Ant_remained(jj)==1
                    Temp=Temp-Probability(jj);
                    if Temp<0
                        To_visit=jj;
                        break;
                    end
                end
            end
        end
        
        if To_visit==-1
            for k=1:n
                if Ant_remained(k)==1 %该点没访问过
                    To_visit=k;
                    break;
                end
            end
        end
    Ant_visited_num=Ant_visited_num+1;%已经访问过的点的数目+1
    Ant_path(Ant_visited_num)=To_visit;%保存蚂蚁走的路径
    Ant_remained(To_visit)=0;%该点访问过
    Ant_no=To_visit;       
    end

 %****************************************************** 

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       6586  2012-12-19 13:02  CVRP\CVRP.asv

     文件       7155  2013-01-04 22:40  CVRP\CVRP.m

     文件        507  2012-12-15 08:49  CVRP\data.txt

     文件        492  2012-12-18 14:49  CVRP\PopinitCom.m

     文件        300  2012-12-19 22:31  CVRP\数据实验\16(1).txt

     文件      27805  2012-12-19 22:30  CVRP\数据实验\16(1).jpg

     文件      13854  2012-12-21 20:14  CVRP\新建 Microsoft Office Excel 工作表.xlsx

     文件      12364  2012-12-21 19:36  CVRP\新建 Microsoft Office Word 文档 (2).docx

     文件       6865  2012-12-19 16:26  CVRP\最基本版本,收敛过早\CVRP.m

     文件        492  2012-12-18 14:49  CVRP\最基本版本,收敛过早\PopinitCom.m

     目录          0  2012-12-19 22:31  CVRP\数据实验

     目录          0  2012-12-19 16:43  CVRP\最基本版本,收敛过早

     目录          0  2012-12-21 20:29  CVRP

----------- ---------  ---------- -----  ----

                76420                    13


评论

共有 条评论