Автор: Пользователь скрыл имя, 06 Марта 2013 в 17:14, курсовая работа
Классические комбинаторные задачи – это задачи выбора и расположения элементов конечного множества, имеющие в качестве исходной некоторую формулировку развлекательного содержания типа головоломок.
Математическое программирование — область математики, разрабатывающая теорию и численные методы решения многомерных экстремальных задач с ограничениями, т. е. задач на экстремум функции многих переменных с ограничениями на область изменения этих переменных.
Введение
1.Теоретическое обоснование решения задачи коммивояжёра;
2.Пример решения задачи коммивояжёра одним из методов;
3.Решение задачи коммивояжёра средствами MS Excel;
4.Алгоритм решения задачи;
5.Листинг программы для решения задачи.
Литература
Дана матрица состоящая из цифр.
Рис.6 шаг первый решения задачи(Пример)
Шаг первый.
Находим ближайший город к первому.
Рис.7 шаг первый решения задачи(Пример)
Шаг второй.
Удаляем город №5 (столбец), так как в нём мы уже были и переходим на
строчку №5 и находим минимум.
Рис.8 шаг второй решения задачи(Пример)
Шаг третий.
Переходим на четвертую строчку, так как на предыдущем шаге в пятой
строке, минимум находится в четвертом столбце и вычеркиваем
четвертый столбец, чтобы не было цикла.
Рис.9 шаг четвертый задачи(Пример)
Ответ: Последовательность посещения: 1-5-2-4-6-1
Длина пути: 30
Скриншот:
Uses CRT;
Label Out;
Const
N=8;
Var
C: array [1..N,1..N] of word; {Матрица расстояний}
Tour, P: array [1..N] of word; {Оптимальный и текущие
туры}
l, s: word;
i, j, k, min, ind: byte;
All: boolean; {Признак окончания перебора}
Graph: text;
Begin
ClrScr;
{Ввод данных}
Assign(Graph,'D:\matr.in');
Reset(Graph);
TextColor(14);
WriteLn('=====================
WriteLn('Матрица смежности:');
WriteLn('=====================
For i:=1 To N Do For j:=1 To N Do Read(Graph, C[i,j]);
For i:=1 To N Do
Begin
For j:=1 To N Do Write(C[i,j],' ');
WriteLn;
End;
{Инициализация}
All:=False; {Перебраны не все варианты}
l:=MaxInt; {Оптимальный тур неизвестен}
For i:=1 To N Do P[i]:=i; {Строим первый тур}
Repeat
{Вычисляем его длину}
s:=0;
For i:=1 To N-1 Do s:=s+C[P[i],P[i+1]];
s:=s+C[P[n],P[1]];
{Полагаем первый тур текущим}
If l>s Then
Begin
Tour:=P;
l:=s;
End;
{Генерируем все (N-1)! перестановок}
For i:=N DownTo 3 do
Begin
If P[i]<P[i-1] Then continue;
min:=N+1;
k:=P[i-1];
{Ищем миним. число из тех, что больше k
и правее}
For j:=i To N Do If (P[j]>k) and (P[j]<min) Then
Begin
min:=P[j];
ind:=j;
End;
{Рокировка min и k}
P[i-1]:=min;
P[ind]:=k;
{Элементы на местах от i до N упорядочиваем
по возрастанию}
For j:=i To N-1 Do
Begin
min:=N+1;
For k:=j To N Do If min > P[k] Then
Begin
min:=P[k];
ind:=k;
End;
k:=P[j];
P[j]:=min;
P[ind]:=k;
End;
GoTo out;
End;
{Проверяем перебраны ли все перестановки}
All:=true;
Out:
Until All;
{Если перебраны все перестановки, то выдаем
оптимальный тур}
WriteLn('=====================
Write('Минимальный тур: ');
For i:=1 To N Do Write(Tour[i],'-');
Write('1');
WriteLn(' имеет длину ',l);
WriteLn('=====================
Close(Graph);
ReadKey;
END.
Алгоритм: