Автор работы: Пользователь скрыл имя, 24 Мая 2013 в 14:31, курсовая работа
Дана задача коммивояжера в классической формулировке: для некоторой группы городов с заданными расстояниями между ними требуется найти кратчайший маршрут посещения каждого города один раз с возвращением в исходный пункт. Кратчайший маршрут находится полным переборомбез учета повторяющихся путей (например, 1-2-3-1 и 2-3-1-2). При этом на плоскости полученный маршрут является границей многоугольника.
1.Постановка задачи…………………………………………………..... 3
2. Математические основы решения задачи коммивояжера
2.1. Формулировка и некоторые свойства решений задачи коммивояжера…………………………………………………………….……
2.2. Постановка задачи коммивояжера как задачи на графе...…………………………………………..……………………………….
4
6
3. Постановка и описание алгоритма решения задачи
3.1. Алгоритм решения задачи…………………..……………….….
3.2. Оценка трудоемкости…………………………………………….
3.3. Результаты выполнения программы……………………………. 7
8
9
Приложение………………………………………………………………. 13
Литература………………………………………………………………… 17
[d_f,pi_1]=exchangе(pi0,d);% вызов метода ветвей и границ
r_r=rand;
if d_f<0
pi0=pi_1;
elseif exp(-d_f/t)>r_r
pi0=pi_1;
else
pi0=pi0;
end
end
f_temp=0;
for k=1:(n-1)
f_temp=f_temp+d(pi0(k),pi0(k+
end
f_temp=f_temp+d(pi0(n),pi0(1))
if min_f>f_temp % выбор наикратчайшего пути
min_f=f_temp;
p_min=pi0;
end
t=a*t;
end
f=min_f;
T=p_min;
function [d_f,pi_r]=exchange(pi0,d)% метод ветвей и границ
[m,n]=size(d);
u=rand; % задаем произвольное число
u=u*(n-2);
u=round(u);% округляем число в сторону ближайшего целого
if u<2
u=2;
end
if u>n-2
u=n-2;
end
v=rand;
v=v*(n-u+1);
v=round(v);
if v<1
v=1;
end
v=u+v;
if v>n
v=n;
end
pi_1(u)=pi0(v);
pi_1(v)=pi0(u);
if u>1
for k=1:(u-1)
pi_1(k)=pi0(k);
end
end
if v>(u+1)
for k=1:(v-u-1)
pi_1(u+k)=pi0(v-k);
end
end
if v<n
for k=(v+1):n
pi_1(k)=pi0(k);
end
end
d_f=0;
if v<n % отсечение неоптимальных решений
d_f=d(pi0(u-1),pi0(v))+d(pi0(
for k=(u+1):n
d_f=d_f+d(pi0(k),pi0(k-1));
end
d_f=d_f-d(pi0(u-1),pi0(u))-d(
for k=(u+1):n
d_f=d_f-d(pi0(k-1),pi0(k));
end
else
d_f=d(pi0(u-1),pi0(v))+d(pi0(
for k=(u+1):n
d_f=d_f+d(pi0(k),pi0(k-1));
end
for k=(u+1):n
d_f=d_f-d(pi0(k-1),pi0(k));
end
end
pi_r=pi_1;
ЛИТЕРАТУРА
Информация о работе Метод ветвей и границ для задачи коммивояжера