A brief introduction of ant colony algorithm

Ant colony algorithm is a bionic algorithm derived from imitating the natural ant path finding mode: in the process of movement, ant can leave pheromone material on the path it passes for information transmission, and the ant can sense this material in the process of movement, and guide its own movement direction. The collective behavior of ant colony composed of a large number of ants shows a positive feedback phenomenon: the more ants walk along a certain path, the more likely the latecomers will choose the path. Ant colony algorithm has the characteristics of distribution calculation, positive information feedback and heuristic search, which is a heuristic global optimization algorithm in evolutionary algorithms.

Two, TSP problem (travel agent problem)

T S P problem can use A weighted complete graph G = (N, A), where N is N = N | | point (city), is A collection of edges connecting these points completely. Each edge (I,j) belonging to A has A weight that represents the distance between city I and city J. The TSP problem is to find the shortest Hamilton circuit in the graph.

 

1. Construction diagram: The construction diagram is consistent with the problem description diagram. The set C of components corresponds to the set of points (C=N), and the set of connecting corresponding edges (L=A). 2. Constraints: All cities must be visited and each city can only be visited once at most. 3. Pheromone and heuristic information: The pheromone in the TSP problem represents the expectation of visiting city J directly after visiting city I. The heuristic information value is inversely proportional to the distance between city I and city J. 4. Solution construction: Each ant starts from a randomly selected city at first, and after each iteration, the ant adds a city that has not been visited to the solution. When all cities have been visited by ants, the construction of the solution terminates.

Iii. Implementation process and pseudo-code

         

 
Copy the code
  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)
    Copy the code

    Complete code or write to add QQ1575304183