Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Документация.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
129.12 Кб
Скачать

5 Рабочий проект

5.1 Отладка и тестирование программного продукта

В ходе отладки и тестирования программы осуществлялись многочисленные записки цикла программы. Выполнялась проверка работы программы и ее соответствие заданным параметрам.

Ниже представлены снимки экрана программы на различных этапах ее работы.

Рисунок 2 - Исходное состояние окна программы

Рисунок 3 – вид окна при заполнении таблицы

Рисунок 4 – вид окна при окончании работы

5.2 Руководство пользователю

Разрабатываемая программа предназначена для проектировки работы системы массового обслуживания при определенных заданных параметрах.

Входными данными программы являются даннные о работе кассира и времени прихода заявок.

К выходным данным относятся статистические данные о работе цикла.

Управление программой реализуется через меню на главной форме.

Выводы

Задача коммивояжера является частичным случаем гамильтоновой задачи о путешественнике. Суть задачи коммивояжера состоит в нахождении суммарной минимальной характеристики (расстояния, стоимости проезда и т.д.), при этом коммивояжер должен пройти все n городов по одному разу, вернувшись в тот город, с которого начал.

Существуют несколько методов решения задачи коммивояжера: метод полного перебора, с помощью метода ветвей и границ (алгоритм Литтла), алгоритма Крускала, «деревянного» алгоритма и т.д. Однако только метод ветвей и границ дает нам в итоге самое оптимальное решение.

Основная идея метода Литтла состоит в том, что вначале строят нижнюю границу длин маршрутов для всего множества гамильтоновых контуров . Затем все множество контуров разбивают на два подмножества таким образом, чтобы первое подмножество состояло из гамильтоновых контуров, содержащих некоторую дугу (i,j), а другое подмножество не содержало этой дуги.

Для практической реализации идеи метода ветвей и границ применительно к задаче коммивояжера нужно найти метод определения нижних границ подмножества и разбиения множества гамильтоновых контуров на подмножества (ветвление). Такое определение нижних границ базируется на том утверждении, что если ко всем элементам i-й строки или j-го столбца матрицы C прибавить или отнять число , то задача останется эквивалентной прежней, то есть оптимальность маршрута коммивояжера не изменится, а длина любого гамильтонова контура изменится на данную величину .

Используя ЭВМ, методом ветвей и границ можно решить задачи коммивояжера для .

ПРИЛОЖЕНИЕ: Листинг программы

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "Unit1.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

int FULL_GRID[6][6];

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

StringGrid1->Cells[0][1]="A";

StringGrid1->Cells[0][2]="B";

StringGrid1->Cells[0][3]="C";

StringGrid1->Cells[0][4]="D";

StringGrid1->Cells[0][5]="E";

StringGrid1->Cells[1][0]="A";

StringGrid1->Cells[2][0]="B";

StringGrid1->Cells[3][0]="C";

StringGrid1->Cells[4][0]="D";

StringGrid1->Cells[5][0]="E";

}

//---------------------------------------------------------------------------

void chistka(int a,int b,int c)

{

for(int i=1;i<c+1;i++)

{

FULL_GRID[a][i]=100;

FULL_GRID[i][b]=100;

}

}

//---------------------------------------------------------------------------

int faktorial(int c)

{

int k=100,l=100,MASS[6][6],m=0,TELO[6][6];

for(int i=1;i<c+1;i++)

{

for(int j=1;j<c+1;j++)

{

TELO[i][j]=FULL_GRID[i][j];

}

}

//вертикаль

for(int i=1;i<c+1;i++)

{

for(int j=1;j<c+1;j++)

{

if(i!=j)

{

if(k>=TELO[j][i])

{

k=TELO[j][i];

}

}

}

//вычитаем из ячеек к

for(int j=1;j<c+1;j++)

{

if(i!=j && TELO[j][i]!=100)

{

TELO[j][i]=TELO[j][i]-k;

}

}

//вычитаем из ячеек к

TELO[c+1][i]=k;

k=100;

}

//вертикаль

//горизонталь

for(int i=1;i<c+1;i++)

{

for(int j=1;j<c+1;j++)

{

if(i!=j)

{

if(k>=TELO[i][j])

{

k=TELO[i][j];

}

}

}

//вычитаем из ячеек к

for(int j=1;j<c+1;j++)

{

if(i!=j && TELO[j][i]!=100)

{

TELO[i][j]=TELO[i][j]-k;

}

}

//вычитаем из ячеек к

TELO[i][c+1]=k;

k=100;

}

//горизонталь

//находим «оценку»

for(int i=1;i<c+1;i++)

{

for(int j=1;j<c+1;j++)

{

if(FULL_GRID[i][j]==0)

{

k=100;

l=100;

if(i!=j)

{

for(int n=1;n<c+1;n++)

{

if(k>=TELO[n][j] && n!=j && n!=i)

{

k=TELO[n][j];

}

if(l>=TELO[j][n] && n!=i && n!=i)

{

l=TELO[j][n];

}

}

}

MASS[i-1][j-1]=k+l;

}

}

}

//находим «оценку»

//макс оценка

k=0;

l=0;

for(int i=1;i<c+1;i++)

{

for(int j=1;j<c+1;j++)

{

if(i!=j && TELO[i][j]==0 && k<MASS[i-1][j-1])

{

k=MASS[i-1][j-1];

l=j;

m=i;

}

}

}

//макс оценка

chistka(m,l,c);

return l;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

for(int i=1;i<6;i++)

{

for(int j=1;j<6;j++)

{

if(i!=j && i>j)

{

FULL_GRID[j][i]=random(100);

StringGrid1->Cells[i][j]=IntToStr(FULL_GRID[j][i]);

StringGrid1->Cells[j][i]=IntToStr(FULL_GRID[j][i]);

FULL_GRID[i][j]=FULL_GRID[j][i];

}

else {

StringGrid1->Cells[i][j]="100";

FULL_GRID[i][j]=100;

}

}

}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)

{ int n=0;

for(int i=0;i<5;i++)

{

n=n*10+faktorial(5);

}

Memo1->Lines->Add("метод ветвей и границ:"+IntToStr(n)+";");

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)

{

AnsiString text;

int sum=0,rez=1000;

for(int i=1;i<6;i++)

{

for(int j=1;j<6;j++)

{

if(i!=j) {

for(int k=1;k<6;k++)

{ if(i!=k && j!=k){

for(int n=1;n<6;n++)

{ if(i!=n && j!=n && k!=n){

for(int l=1;l<6;l++)

{

if(i!=l && j!=l && k!=l && n!=l){

sum=StrToInt(StringGrid1->Cells[i][j])+StrToInt(StringGrid1->Cells[j][k])+StrToInt(StringGrid1->Cells[k][n])+StrToInt(StringGrid1->Cells[n][l]);

if(sum<rez){

text=IntToStr(i)+";"+IntToStr(j)+";"+IntToStr(k)+";"+IntToStr(n)+";"+IntToStr(l)+";sum="+IntToStr(sum);

rez=sum;

}

}}

}}

}}

} }

}

Memo1->Lines->Add("Метод перебора вариантов:"+text+";");

}

//---------------------------------------------------------------------------

БИБЛИОГРАФИЧЕСКИЙ СПИСОК

1. Кристофидес Н. Теория графов. Алгоритмический подход. – М.: Издательство «Мир», 1978. – 432 с.

2. Фаронов В.В. Delphi. Программирование на языке высокого уровня: Учебник для вузов – СПб.: Питер, 2007. – 640 с.: ил.

3. Белова Т.М., Старков Ф.А. Программирование в Delphi: Учебное пособие – Курск. гос.-техн. ун-т. Курск, 2002. – 134 с.

4. Интернет-Университет Информационных Технологий – http://www.INTUIT.ru: Лекции курса Программирование на языке Pascal.

  1. Голицына О. Л. Программное обеспечение [Текст] : учебное пособие. - 3-е изд., перераб. и доп. - М. : Форум, 2010. Гриф: Рекомендовано Министерством образования и науки РФ.

  2. Методы и технологии программирования [Текст]: учебное пособие/Т.И. Лапина, Е.А.Петрик. – Курск: ЮЗГУ, 2011. – 211с.

  3. Процедурно-ориентированное программирование на С++ [Текст]: учебное пособие/И.В. Зотов, Э.И. Ватутин, Д.Б. Борзов. – Курск:КурскГТУ, 2008. – 211с. – 55 экземпляров

  4. Технология программирования [Текст]: учебник/Г.С. Иванова. – М.:Кнорус, 2011. – 336с.

  5. Архангельский А.Я.Программирование в С++ Builder 6.0/ А.Я.Архангельский –М.:ЗАО «Издательство БИНОМ», 2005.-1162с.

  6. Лафоре Р. Объектно-ориентированное программирование в С++. - 4-е изд. - СПб. : Питер, 2004. - 924 с. – 2 экземпляра

  7. Язык программирования С++ [Текст] / С. В. Глушаков, А. В. Коваль, С. В. Смирнов. - М. : АСТ, 2004. - 500 с.

  8. С++. Объектно-ориентированное программирование. Практикум/Т.А. Павловская, Ю.А. Щупак. – СПб.:Питер, 2004.- 265с. – 3 экземпляра

  9. Луенбергер Д. Д. Информатика [Текст] : учебно-методическое пособие / пер. с англ. Ю. Л. Цвирко ; под ред. К. К. Колина. - М. : Техносфера, 2008. - 448 с. : ил. - (Мир программирования. VIII. 08). Гриф: Рекомендовано УМО по образованию в области прикладной информатики

  10. Операционная система Microsoft Windows 7.

  11. Microsoft Office 2013.

  12. Borland C++Builder 6.0.

  13. 4.http://cbuilder.ru/

  14. http://www.atlants.ru

  15. http://www.cyberforum.ru/cpp-builder/

  16. О. Е. Акимов «Дискретная математика. Логика, группы, графы», Москва, 2003, 376 с., ил., изд. дом «Лаборатория базовых знаний».

  17. Ф. А. Новиков «Дискретная математика для программистов» С.-Петербург, 2002 г. 304 с., ил., изд. дом «Питер».

  18. В. М. Бондарев «Основы программирования» 1998 г., 368 с. изд. дом «Феникс»

1