How to change my matlab code. Is has no error in its present form?

Illustration
Amna Habib - 2023-07-20T13:47:08+00:00
Question: How to change my matlab code. Is has no error in its present form?

Hi, I want to make a change in the following code. It has been run successfully.   Before starting a loop, this line is written   ''currentTour = randperm(n); % Random initial solution''   I need that the algorithm will run on all possible tours and give all possible outputs, except of taking a random tour.   Please note that when we run the current code, every time we obtain equal value (76) of best distance, but different best tours as output.   (Actually the distance matrix represents a network, where the nodes indicates cities. I want to find best possible tour started from each city one by one.) % Example distance matrix (replace it with your own) distanceMatrix = [ 0 10 11 20; 10 0 90 25; 11 90 0 30; 20 25 30 0 ]; % Set algorithm parameters maxIterations = 1000; tabuSize = 10; % Run Tabu Search [bestTour, bestDistance] = tabuSearchTSP(distanceMatrix, maxIterations, tabuSize); % Display the best tour and its distance disp('Best Tour:'); Best Tour: disp(bestTour); 3 1 2 4 disp('Best Distance:'); Best Distance: disp(bestDistance); 76 function [bestTour, bestDistance] = tabuSearchTSP(distanceMatrix, maxIterations, tabuSize) % Initialize variables n = size(distanceMatrix, 1); % Number of cities tabuList = zeros(n, tabuSize); % Tabu list to store recently visited solutions currentTour = randperm(n); % Random initial solution bestTour = currentTour; bestDistance = calculateTourDistance(currentTour, distanceMatrix); iteration = 1; while iteration <= maxIterations candidateList = generateCandidateList(currentTour, tabuList); [bestCandidate, bestCandidateDistance] = evaluateCandidates(candidateList, distanceMatrix); if bestCandidateDistance < bestDistance bestTour = bestCandidate; bestDistance = bestCandidateDistance; end currentTour = bestCandidate; tabuList = updateTabuList(tabuList, currentTour); iteration = iteration + 1; end end function distance = calculateTourDistance(tour, distanceMatrix) n = length(tour); distance = 0; for i = 1:n-1 distance = distance + distanceMatrix(tour(i), tour(i+1)); end distance = distance + distanceMatrix(tour(n), tour(1)); % Return to the starting city end function candidateList = generateCandidateList(currentTour, tabuList) candidateList = []; n = length(currentTour); for i = 1:n-1 for j = i+1:n candidate = currentTour; candidate(i) = currentTour(j); candidate(j) = currentTour(i); if ~isTabu(candidate, tabuList) candidateList = [candidateList; candidate]; end end end end function isTabu = isTabu(candidate, tabuList) [n, tabuSize] = size(tabuList); isTabu = false; for i = 1:tabuSize if isequal(candidate, tabuList(:, i)) isTabu = true; break; end end end function [bestCandidate, bestCandidateDistance] = evaluateCandidates(candidateList, distanceMatrix) numCandidates = size(candidateList, 1); bestCandidateDistance = Inf; for i = 1:numCandidates candidate = candidateList(i, :); candidateDistance = calculateTourDistance(candidate, distanceMatrix); if candidateDistance < bestCandidateDistance bestCandidate = candidate; bestCandidateDistance = candidateDistance; end end end function tabuList = updateTabuList(tabuList, candidate) [~, tabuSize] = size(tabuList); tabuList = [candidate' tabuList(:, 1:tabuSize-1)]; end  

Expert Answer

Profile picture of Kshitij Singh Kshitij Singh answered . 2025-11-20

You can replace the line 'currentTour = randperm(n)' with a loop that iterates over each city as the starting point.

 

% Example distance matrix (replace it with your own)
distanceMatrix = [
    0  10  11  20;
    10   0  90  25;
    11  90   0  30;
    20  25  30   0
    ];
% Set algorithm parameters
maxIterations = 1000;
tabuSize = 10;

n = size(distanceMatrix, 1); % Number of cities

% Initialize variables for the best tour and distance
bestTour = [];
bestDistance = Inf;

% Iterate over each city as the starting point
for startingCity = 1:n
    currentTour = startingCity:n;
    currentTour = [currentTour, 1:startingCity-1];
    
    % Run Tabu Search
    [tour, distance] = tabuSearchTSP(distanceMatrix, maxIterations, tabuSize, currentTour);
    
    % Update the best tour and distance if necessary
    if distance < bestDistance
        bestTour = tour;
        bestDistance = distance;
    end
end

% Display the best tour and its distance
disp('Best Tour:');
disp(bestTour);
disp('Best Distance:');
disp(bestDistance);

function [bestTour, bestDistance] = tabuSearchTSP(distanceMatrix, maxIterations, tabuSize, currentTour)
% Initialize variables
n = size(distanceMatrix, 1); % Number of cities
tabuList = zeros(n, tabuSize); % Tabu list to store recently visited solutions
bestTour = currentTour;
bestDistance = calculateTourDistance(currentTour, distanceMatrix);
iteration = 1;

while iteration <= maxIterations
    candidateList = generateCandidateList(currentTour, tabuList);
    [bestCandidate, bestCandidateDistance] = evaluateCandidates(candidateList, distanceMatrix);
    if bestCandidateDistance < bestDistance
        bestTour = bestCandidate;
        bestDistance = bestCandidateDistance;
    end
    currentTour = bestCandidate;
    tabuList = updateTabuList(tabuList, currentTour);
    iteration = iteration + 1;
end
end

% The remaining functions remain the same

 


Not satisfied with the answer ?? ASK NOW

Get a Free Consultation or a Sample Assignment Review!