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.
Голицына О. Л. Программное обеспечение [Текст] : учебное пособие. - 3-е изд., перераб. и доп. - М. : Форум, 2010. Гриф: Рекомендовано Министерством образования и науки РФ.
Методы и технологии программирования [Текст]: учебное пособие/Т.И. Лапина, Е.А.Петрик. – Курск: ЮЗГУ, 2011. – 211с.
Процедурно-ориентированное программирование на С++ [Текст]: учебное пособие/И.В. Зотов, Э.И. Ватутин, Д.Б. Борзов. – Курск:КурскГТУ, 2008. – 211с. – 55 экземпляров
Технология программирования [Текст]: учебник/Г.С. Иванова. – М.:Кнорус, 2011. – 336с.
Архангельский А.Я.Программирование в С++ Builder 6.0/ А.Я.Архангельский –М.:ЗАО «Издательство БИНОМ», 2005.-1162с.
Лафоре Р. Объектно-ориентированное программирование в С++. - 4-е изд. - СПб. : Питер, 2004. - 924 с. – 2 экземпляра
Язык программирования С++ [Текст] / С. В. Глушаков, А. В. Коваль, С. В. Смирнов. - М. : АСТ, 2004. - 500 с.
С++. Объектно-ориентированное программирование. Практикум/Т.А. Павловская, Ю.А. Щупак. – СПб.:Питер, 2004.- 265с. – 3 экземпляра
Луенбергер Д. Д. Информатика [Текст] : учебно-методическое пособие / пер. с англ. Ю. Л. Цвирко ; под ред. К. К. Колина. - М. : Техносфера, 2008. - 448 с. : ил. - (Мир программирования. VIII. 08). Гриф: Рекомендовано УМО по образованию в области прикладной информатики
Операционная система Microsoft Windows 7.
Microsoft Office 2013.
Borland C++Builder 6.0.
4.http://cbuilder.ru/
http://www.atlants.ru
http://www.cyberforum.ru/cpp-builder/
О. Е. Акимов «Дискретная математика. Логика, группы, графы», Москва, 2003, 376 с., ил., изд. дом «Лаборатория базовых знаний».
Ф. А. Новиков «Дискретная математика для программистов» С.-Петербург, 2002 г. 304 с., ил., изд. дом «Питер».
В. М. Бондарев «Основы программирования» 1998 г., 368 с. изд. дом «Феникс»
