Matlab基于蚁群算法求解多旅行商MTSP问题

一、蚁群算法简介

    蚁群算法是对自然界蚂蚁的寻径方式进行模似而得出的一种仿生算法:蚂蚁在运动过程中,能够在它所经过的路径上留下信息素(pheromone)的物质进行信息传递,而且蚂蚁在运动过程中能够感知这种物质,并以此指导自己的运动方向。由大量蚂蚁组成的蚁群集体行为便表现出一种信息正反馈现象:某一路径上走过的蚂蚁越多,则后来者选择该路径的概率就越大。蚁群算法具有分布计算、信息正反馈和启发式搜索的特征,本质上是进化算法中的一种启发式全局优化算法。

二、TSP问题(旅行商问题)

   T S P 问 题 可 以 用 一 个 带 权 完 全 图G=(N,A)来表示,其中N是带有n=|N|点(城市)的集合,A是完全连接这些点的边的集合。每一条边(i,j)属于A都带有一个权值,它代表城市i与城市j之间的距离。TSP问题就是要找到图中的最短哈密尔顿回路。

1、构建图:构建图与问题描述图是一致的,成份的集合C对应着点的集合(即:C=N),连接对应着边的集合(即L=A),且每一条边都带有一个权值,代表点i和j之间的距离。
2、约束条件:所有城市都要被访问且每个城市最多只能被访问一次。
3、信息素和启发式信息:TSP 问题中的信息素表示在访问城市i后直接访问城市j的期望度。启发式信息值一般与城市i和城市j的距离成反比。
4、解的构建:每只蚂蚁最初都从随机选择出来的城市出发,每经过一次迭代蚂蚁就向解中添加一个还没有访问过的城市。当所有城市都被蚂蚁访问过之后,解的构建就终止。
 

 三、实现流程及伪代码

         

 
  1. function varargout = AntColonyVRPGUI(varargin)
    % ANTCOLONYVRPGUI M-file for AntColonyVRPGUI.fig
    %      ANTCOLONYVRPGUI, by itself, creates a new ANTCOLONYVRPGUI or raises the existing
    %      singleton*.
    %
    %      H = ANTCOLONYVRPGUI returns the handle to a new ANTCOLONYVRPGUI or the handle to
    %      the existing singleton*.
    %
    %      ANTCOLONYVRPGUI('CALLBACK',hObject,eventData,handles,...) calls the local
    %      function named CALLBACK in ANTCOLONYVRPGUI.M with the given input arguments.
    %
    %      ANTCOLONYVRPGUI('Property','Value',...) creates a new ANTCOLONYVRPGUI or raises the
    %      existing singleton*.  Starting from the left, property value pairs are
    %      applied to the GUI before AntColonyVRPGUI_OpeningFcn gets called.  An
    %      unrecognized property name or invalid value makes property application
    %      stop.  All inputs are passed to AntColonyVRPGUI_OpeningFcn via varargin.
    %
    %      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
    %      instance to run (singleton)".
    %
    % See also: GUIDE, GUIDATA, GUIHANDLES
     
    % Edit the above text to modify the response to help AntColonyVRPGUI
     
    % Last Modified by GUIDE v2.5 11-Jun-2015 00:13:48
     
    % Begin initialization code - DO NOT EDIT
    gui_Singleton = 1;
    gui_State = struct('gui_Name',       mfilename, ...
                       'gui_Singleton',  gui_Singleton, ...
                       'gui_OpeningFcn', @AntColonyVRPGUI_OpeningFcn, ...
                       'gui_OutputFcn',  @AntColonyVRPGUI_OutputFcn, ...
                       'gui_LayoutFcn',  [] , ...
                       'gui_Callback',   []);
    if nargin && ischar(varargin{1})
        gui_State.gui_Callback = str2func(varargin{1});
    end
     
    if nargout
        [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
    else
        gui_mainfcn(gui_State, varargin{:});
    end
    % End initialization code - DO NOT EDIT
     
     
    % --- Executes just before AntColonyVRPGUI is made visible.
    function AntColonyVRPGUI_OpeningFcn(hObject, eventdata, handles, varargin)
    % This function has no output args, see OutputFcn.
    % hObject    handle to figure
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    % varargin   command line arguments to AntColonyVRPGUI (see VARARGIN)
    % Choose default command line output for AntColonyVRPGUI
    handles.output = hObject;
     
    %% change !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    handles.ismdvrp = true; %!!!
    %%
    if handles.ismdvrp == true
        [handles.initClusters, handles.coordinates] = INIT;
        handles.clusters = handles.initClusters;
        
        set(handles.uipanelBases,'Visible','on');
        create_init_plot_MDVRP(handles.coordinates, handles.clusters);
    else
        %initialization
        [vehicles,demands,dist_stations,dist_bases] = INIT_VRP;
        handles.vehicles = vehicles;
        handles.demands = demands;
        handles.distances_stations = dist_stations;
        handles.distances_bases = dist_bases;
        
        set(handles.uipanelBases,'Visible','off');
    end
    % Update handles structure
    guidata(hObject, handles);
     
    % UIWAIT makes AntColonyVRPGUI wait for user response (see UIRESUME)
    % uiwait(handles.figure1);
     
     
    % --- Outputs from this function are returned to the command line.
    function varargout = AntColonyVRPGUI_OutputFcn(hObject, eventdata, handles) 
    % varargout  cell array for returning output args (see VARARGOUT);
    % hObject    handle to figure
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
    % Get default command line output from handles structure
    varargout{1} = handles.output;
     
     
    % --- Executes on selection change in algorithmPopupmenu.
    function algorithmPopupmenu_Callback(hObject, eventdata, handles)
    % hObject    handle to algorithmPopupmenu (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
    % Hints: contents = cellstr(get(hObject,'String')) returns algorithmPopupmenu contents as cell array
    %        contents{get(hObject,'Value')} returns selected item from algorithmPopupmenu
     
    %set invisible error messages
    set(handles.errorMandatoryEditFields,'Visible','off');
    %erase text in edit fields
    set(handles.evaporationPheromoneEdit,'String','');
    set(handles.attractStationEdit,'String','');
    set(handles.increasePheromoneEdit,'String','');
    set(handles.amountPheromoneEdit,'String','');
    set(handles.eliteAntsEdit,'String','');
    %set disabled all edit fields
    set(handles.evaporationPheromoneEdit,'Enable','off');
    set(handles.attractStationEdit,'Enable','off');
    set(handles.increasePheromoneEdit,'Enable','off');
    set(handles.amountPheromoneEdit,'Enable','off');
    set(handles.eliteAntsEdit,'Enable','off');
    %set disabled run button
    set(handles.runButton,'Enable','off');
    %set to 0 all results
    set(handles.lengthWayText,'String','-');
    set(handles.subroutesNText,'String','-');
    set(handles.timeSpentText,'String','-');
    if handles.ismdvrp == true
        %set invisible bases' listbox
        set(handles.listboxBases,'Visible','off');
        set(handles.totalLengthText,'Visible','off');
        set(handles.totalLengthText,'String','-');
        set(handles.totalLengthLabel,'Visible','off');
       
        %clear plot
        cla;
        create_init_plot_MDVRP(handles.coordinates, handles.clusters);
    end
    %clear plot
    %cla;
    %clear legend
    legend('off');
    val = get(hObject,'Value');
    if val ~= 1 %not placeholder's text (not be executed)
        if val ~= 2 %not Clark-Wright algorithm
            %enable edit fields 
            if val == 5 %AntAlg with elite ants
                set(handles.eliteAntsEdit,'Enable','on');
            end
            set(handles.evaporationPheromoneEdit,'Enable','on');
            set(handles.attractStationEdit,'Enable','on');
            set(handles.increasePheromoneEdit,'Enable','on');
            set(handles.amountPheromoneEdit,'Enable','on');
        end
        %enable run button
        set(handles.runButton,'Enable','on');    
    end
     
     
    % --- Executes during object creation, after setting all properties.
    function algorithmPopupmenu_CreateFcn(hObject, eventdata, handles)
    % hObject    handle to algorithmPopupmenu (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    empty - handles not created until after all CreateFcns called
     
    % Hint: popupmenu controls usually have a white background on Windows.
    %       See ISPC and COMPUTER.
    if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
        set(hObject,'BackgroundColor','white');
    end
     
     
    function evaporationPheromoneEdit_Callback(hObject, eventdata, handles)
    % hObject    handle to evaporationPheromoneEdit (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
    % Hints: get(hObject,'String') returns contents of evaporationPheromoneEdit as text
    %        str2double(get(hObject,'String')) returns contents of evaporationPheromoneEdit as a double
     
     
    % --- Executes during object creation, after setting all properties.
    function evaporationPheromoneEdit_CreateFcn(hObject, eventdata, handles)
    % hObject    handle to evaporationPheromoneEdit (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    empty - handles not created until after all CreateFcns called
     
    % Hint: edit controls usually have a white background on Windows.
    %       See ISPC and COMPUTER.
    if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
        set(hObject,'BackgroundColor','white');
    end
     
     
     
    function attractStationEdit_Callback(hObject, eventdata, handles)
    % hObject    handle to attractStationEdit (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
    % Hints: get(hObject,'String') returns contents of attractStationEdit as text
    %        str2double(get(hObject,'String')) returns contents of attractStationEdit as a double
     
     
    % --- Executes during object creation, after setting all properties.
    function attractStationEdit_CreateFcn(hObject, eventdata, handles)
    % hObject    handle to attractStationEdit (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    empty - handles not created until after all CreateFcns called
     
    % Hint: edit controls usually have a white background on Windows.
    %       See ISPC and COMPUTER.
    if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
        set(hObject,'BackgroundColor','white');
    end
     
     
    function increasePheromoneEdit_Callback(hObject, eventdata, handles)
    % hObject    handle to increasePheromoneEdit (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
    % Hints: get(hObject,'String') returns contents of increasePheromoneEdit as text
    %        str2double(get(hObject,'String')) returns contents of increasePheromoneEdit as a double
     
     
    % --- Executes during object creation, after setting all properties.
    function increasePheromoneEdit_CreateFcn(hObject, eventdata, handles)
    % hObject    handle to increasePheromoneEdit (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    empty - handles not created until after all CreateFcns called
     
    % Hint: edit controls usually have a white background on Windows.
    %       See ISPC and COMPUTER.
    if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
        set(hObject,'BackgroundColor','white');
    end
     
     
    function amountPheromoneEdit_Callback(hObject, eventdata, handles)
    % hObject    handle to amountPheromoneEdit (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
    % Hints: get(hObject,'String') returns contents of amountPheromoneEdit as text
    %        str2double(get(hObject,'String')) returns contents of amountPheromoneEdit as a double
     
     
    % --- Executes during object creation, after setting all properties.
    function amountPheromoneEdit_CreateFcn(hObject, eventdata, handles)
    % hObject    handle to amountPheromoneEdit (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    empty - handles not created until after all CreateFcns called
     
    % Hint: edit controls usually have a white background on Windows.
    %       See ISPC and COMPUTER.
    if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
        set(hObject,'BackgroundColor','white');
    end
     
     
     
    function eliteAntsEdit_Callback(hObject, eventdata, handles)
    % hObject    handle to eliteAntsEdit (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
    % Hints: get(hObject,'String') returns contents of eliteAntsEdit as text
    %        str2double(get(hObject,'String')) returns contents of eliteAntsEdit as a double
     
     
    % --- Executes during object creation, after setting all properties.
    function eliteAntsEdit_CreateFcn(hObject, eventdata, handles)
    % hObject    handle to eliteAntsEdit (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    empty - handles not created until after all CreateFcns called
     
    % Hint: edit controls usually have a white background on Windows.
    %       See ISPC and COMPUTER.
    if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
        set(hObject,'BackgroundColor','white');
    end
     
     
    % --- Executes on button press in runButton.
    function runButton_Callback(hObject, eventdata, handles)
    % hObject    handle to runButton (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
    %clear legend
    legend('off');
    %clear plot
    %cla; 
    %set invisible error messages
    set(handles.errorMandatoryEditFields,'Visible','off');
     
    indexAlg = get(handles.algorithmPopupmenu,'Value');
    if indexAlg ~= 1 %not placeholder's text (not be executed)
        if indexAlg ~= 2 %not Clark-Wright algorithm
            if indexAlg == 5 %AntAlg with elite ants
                if isempty(get(handles.eliteAntsEdit,'String'))
                    set(handles.errorMandatoryEditFields,'Visible','on');
                    return;
                end
            end
            if  ( isempty(get(handles.evaporationPheromoneEdit,'String')) || ...
                  isempty(get(handles.attractStationEdit,'String')) || ...
                  isempty(get(handles.increasePheromoneEdit,'String')) || ...
                  isempty(get(handles.amountPheromoneEdit,'String')) )
                
                set(handles.errorMandatoryEditFields,'Visible','on');
                return;
            end
        end
        %set disabled run button
        set(handles.runButton,'Enable','off');
        
        if handles.ismdvrp == true
            clusters = runAlgorithmMDVRP(indexAlg, handles);
            handles.clusters = clusters;
            
            listbox=findall(gcf,'tag','listboxBases');
            guidata(listbox,handles);
            %select first value in bases' listbox 
            set(handles.listboxBases,'Value',1);
            listboxBases_Callback(listbox, eventdata, handles);
        else
            runAlgorithmVRP(indexAlg, handles);    
        end
     
        %set enabled run button
        set(handles.runButton,'Enable','on');
        %set enabled zoom tools
        set(handles.toolZoomIn,'Enable','on');
        set(handles.toolZoomOut,'Enable','on');
        %set enabled pan tool
        set(handles.toolPan,'Enable','on');
        zoom reset;
    end
     
    function [clusters] = runAlgorithmMDVRP(index, handles)
        if index ~= 1
            if index ~= 2
                e = str2double(get(handles.evaporationPheromoneEdit,'String'));
                alpha = str2double(get(handles.attractStationEdit,'String'));
                beta = str2double(get(handles.increasePheromoneEdit,'String'));
                tau0 = str2double(get(handles.amountPheromoneEdit,'String'));
                E = str2double(get(handles.eliteAntsEdit,'String'));
            end
            
            try
                tStart = tic; %start spent time
                clusters = handles.initClusters;
                handles.clusters = clusters;
                basesName = cell(1,length(clusters)+1);
                basesName{1} = 'Full view';
                for c = 1:length(clusters)
                    switch index
                        case 2 %Clark-Wright
                            [ Route, RouteLength, vehicles ] = Clark_Wright_VRP( ...
                                clusters(c).demands, clusters(c).diststations, ...
                                clusters(c).distbases, clusters(c).vehicles_capacity );
                        case 3 %Ant-minpath
                            [Route, RouteLength, vehicles] = ANT_colony_algorithm_VRP_minpath( ...
                                clusters(c).diststations, clusters(c).distbases, ...
                                clusters(c).demands, [e alpha beta tau0], clusters(c).vehicles_capacity );
                        case 4 %Ant-partition
                            [Route, RouteLength, vehicles] = ANT_colony_algorithm_VRP( ...
                                clusters(c).diststations, clusters(c).distbases, ...
                                clusters(c).demands, [e alpha beta tau0], clusters(c).vehicles_capacity );
                        case 5 %Ant-elite ants
                            [Route, RouteLength, vehicles] = ANT_colony_algorithm_VRP_with_elite_ants( ...
                                clusters(c).diststations, clusters(c).distbases, ...
                                clusters(c).demands, [e alpha beta tau0 E], clusters(c).vehicles_capacity );
                    end
                    handles.clusters(c).mdvrp = changeStations(clusters, vehicles, RouteLength, Route, c);
                    basesName{c + 1} = sprintf('Base #%d',c); %saving bases that need to be added to listbox
                end
                tElapsed = toc(tStart); %end spent time
            catch ME
                msgbox(strcat('Error occured: ',ME.message),'Error','error');
            end
            clusters = handles.clusters;
            
            %clear plot
            cla;
            create_plot_route_with_vehicles_MDVRP(handles.coordinates, handles.clusters);
            
            set(handles.timeSpentText,'String',sprintf('%fs',tElapsed));
        
            set(handles.listboxBases, 'String', basesName);
            set(handles.listboxBases, 'Visible','on');
            set(handles.totalLengthText,'String',num2str(getTotalLength(handles.clusters)));
            set(handles.totalLengthText,'Visible','on');
            set(handles.totalLengthLabel,'Visible','on');
        end
        
    function [mdvrp] = changeStations(clusters, vehicles, LR, R, clusterN)
           mdvrp = struct('length_route',[],'vehicles',[],'simpleVehicles',[],'num_of_subroutes',[]);
           len = length(vehicles);
           mdvrp.simpleVehicles = vehicles;
           for v = 1:len
               vehicles(v).route(vehicles(v).route == 1) = 0;
               len_route = length(vehicles(v).route);
               for vr = 1:len_route
                   if vehicles(v).route(vr) ~= 0 %羼腓 礤 徉玎
                       vehicles(v).route(vr) = clusters(clusterN).stations(vehicles(v).route(vr)-1);
                   end
               end
           end
           mdvrp.num_of_subroutes = number_of_subroutes(R);
           mdvrp.length_route = LR;
           mdvrp.vehicles = vehicles;
     
    function [tlength] = getTotalLength(clusters)
        tlength = 0;
        clen = length(clusters);
        for c = 1:clen
            tlength = tlength + clusters(c).mdvrp.length_route;
        end
     
           
           
    function runAlgorithmVRP(index, handles)
        if index ~= 1
            if index ~= 2
                e = str2double(get(handles.evaporationPheromoneEdit,'String'));
                alpha = str2double(get(handles.attractStationEdit,'String'));
                beta = str2double(get(handles.increasePheromoneEdit,'String'));
                tau0 = str2double(get(handles.amountPheromoneEdit,'String'));
                E = str2double(get(handles.eliteAntsEdit,'String'));
            end
            
            try
                tStart = tic; %start spent time
                switch index
                    case 2 %Clark-Wright
                        [Route,RouteLength,vehicles] = Clark_Wright_VRP( handles.demands, ...
                            handles.distances_stations, handles.distances_bases, handles.vehicles );
                    case 3 %Ant-minpath
                        [Route,RouteLength,vehicles] = ANT_colony_algorithm_VRP_minpath( handles.distances_stations,...
                            handles.distances_bases, handles.demands, [e alpha beta tau0], handles.vehicles);
                    case 4 %Ant-partition
                        [Route,RouteLength,vehicles] = ANT_colony_algorithm_VRP( handles.distances_stations, ...
                            handles.distances_bases, handles.demands, [e alpha beta tau0], handles.vehicles);
                    case 5 %Ant-elite ants
                        [Route,RouteLength,vehicles] = ANT_colony_algorithm_VRP_with_elite_ants( ...
                            handles.distances_stations, handles.distances_bases, handles.demands, ...
                            [e alpha beta tau0 E], handles.vehicles);
                end
                tElapsed = toc(tStart); %end spent time
                create_plot_route_with_vehicles( add_bases_to_distances(handles.distances_stations, ...
                    handles.distances_bases), vehicles, [0 handles.demands] );
            catch ME
                msgbox(strcat('Error occured: ',ME.message),'Error','error');
            end
            
            set(handles.lengthWayText,'String',num2str(RouteLength));
            set(handles.subroutesNText,'String',num2str(number_of_subroutes(Route)));
            set(handles.timeSpentText,'String',sprintf('%fs',tElapsed));
        end
     
     
    % --------------------------------------------------------------------
    function dataTooltip_ClickedCallback(hObject, eventdata, handles)
    % hObject    handle to dataTooltip (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
     
    % --------------------------------------------------------------------
    function algorithmTooltip_ClickedCallback(hObject, eventdata, handles)
    % hObject    handle to algorithmTooltip (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
     
    % --- Executes on selection change in listboxBases.
    function listboxBases_Callback(hObject, eventdata, handles)
    % hObject    handle to listboxBases (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
    % Hints: contents = cellstr(get(hObject,'String')) returns listboxBases contents as cell array
    %        contents{get(hObject,'Value')} returns selected item from listboxBases
     
    %clear legend
    legend('off');
    %clear plot
    cla;
     
    index = get(handles.listboxBases,'value') - 1;
    if index == 0 %if user want to see the full graph of routes
        create_plot_route_with_vehicles_MDVRP(handles.coordinates, handles.clusters);
        set(handles.lengthWayText,'String','-');
        set(handles.subroutesNText,'String','-'); 
    else
        create_plot_of_base_MDVRP(handles.coordinates, handles.clusters, index);
        set(handles.lengthWayText,'String',num2str(handles.clusters(index).mdvrp.length_route));
        set(handles.subroutesNText,'String',num2str(handles.clusters(index).mdvrp.num_of_subroutes)); 
    end
     
    % --- Executes during object creation, after setting all properties.
    function listboxBases_CreateFcn(hObject, eventdata, handles)
    % hObject    handle to listboxBases (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    empty - handles not created until after all CreateFcns called
     
    % Hint: listbox controls usually have a white background on Windows.
    %       See ISPC and COMPUTER.
    if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
        set(hObject,'BackgroundColor','white');
    end
     
     
    % --------------------------------------------------------------------
    function aboutMenu_Callback(hObject, eventdata, handles)
    % hObject    handle to aboutMenu (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
    About %call gui About.m
     
    % --------------------------------------------------------------------
    function fileMenu_Callback(hObject, eventdata, handles)
    % hObject    handle to fileMenu (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
     
    % --------------------------------------------------------------------
    function anotherVRPSubmenu_Callback(hObject, eventdata, handles)
    % hObject    handle to anotherVRPSubmenu (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
     
    % --------------------------------------------------------------------
    function newDataSubmenu_Callback(hObject, eventdata, handles)
    % hObject    handle to newDataSubmenu (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)

     

  • 4
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
旅行商问题(Multi Traveling Salesman Problem,MTSP)是旅行商问题(Traveling Salesman Problem, TSP)的扩展。在MTSP中,有多个旅行,每个旅行需要访问一组给定的城市,并且每个城市只能被访问一次。现在需要利用灰狼算法(Grey Wolf Optimizer, GWO)来解决MTSP问题。 首先,需要基于matlab编写一个灰狼算法的求解函数。该函数包括灰狼的初始化、目标函数的计算、灰狼的适应度更新、灰狼位置的更新等步骤。 然后,需要进行MTSP问题的建模。将每个旅行的路径表示为一个解向量,其中每个元素表示访问的城市顺序。通过将每个旅行的路径连接起来,构成一个整体的解。 接下来,利用灰狼算法来求解MTSP问题。初始化一群灰狼,并随机生成它们的初始位置。根据目标函数的值来计算灰狼的适应度,选择适应度最高的灰狼作为全局最优解。 然后,通过更新灰狼的位置,利用优化策略逐步优化解。其中包括利用alpha、beta和delta等参数来调整灰狼的位置。经过多次迭代,得到最优解。 最后,将最优解解码为每个旅行的路径,即为MTSP问题的解。将结果输出并进行评估。 综上所述,基于matlab的灰狼算法可以用来求解旅行商问题。通过灰狼算法的迭代优化策略,可以得到近似最优解。这种方法具有较高的搜索能力和全局优化能力,在实际应用中具有一定的实用性和效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Matlab科研辅导帮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值