Автор: Пользователь скрыл имя, 30 Марта 2011 в 19:18, курсовая работа
Сейчас решение данной задачи необходимо во многих областях связанных с замкнутыми и при этом жестко связанными по времени системами, такими как: конвейерное производство, многооперационные обрабатывающие комплексы, судовые и железнодорожные погрузочные системы, перевозки грузов по замкнутому маршруту, расчет авиационных линий.
Введение_________________________________________________________2
Глава 1. Задача о коммивояжере_____________________________________3
Общая постановка задачи______________________________________3
Математическая модель задачи_______________________________3
Глава 2. Метод ветвей и границ____________________________________5
2.1. Основные понятия и определения_____________________________5
2.2. Постановка задачи_________________________________________5
2.3. Решение задачи методом ветвей и границ_______________________5
Глава 3. Программная реализация метода ветвей и границ_____________12
3.1. Язык программирования___________________________________12
3.2. Описание алгоритма_______________________________________12
3.3. Описание основных структур данных_________________________15
3.4. Описание интерфейса с пользователем________________________16
Заключение___________________________________________________17
Литература___________________________________________________18
Текст программы______________________________________________
koord[27][0]=x0+292;//
koord[27][1]=y0+491;
koord[28][0]=x0+91;//
koord[28][1]=y0+506;
count_selected=0;
myFont.CreateFont(17,0,0,
m_len="Выберите несколько городов.";
m_label.SetFont (&myFont);
UpdateData(false);
for (int i=0; i < 29; i++)
flag_select[i]=false;
flag_draw=false;
begin_point = -1;
flag_Bpoint=false;
CStdioFile f1;
f1.Open("table.ini",
for ( i=0; i < 29; i++)
{
tableAllCity[i][i]=0;
CString s1;
f1.ReadString(s1);
int j=i+1;
int k=0;
while (j<29 && k < s1.GetLength())
{CString s2;
while (s1[k] == ' ') k++;
while (s1[k] != ' ')
{ s2 += s1[k]; k++;}
tableAllCity[j][i]=
j++;
}
}
return TRUE; // return TRUE unless you set the focus to a control
}
void
CKurs_LipinDlg::OnSysCommand(
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
//
this is automatically done for you by the framework.
void CKurs_LipinDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC
dc(this); // device context for painting
SendMessage(WM_
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int
y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CClientDC pDC(this);
CDC temp;
CBitmap bmp;
bmp.LoadBitmap(IDB_
temp.CreateCompatibleDC (&pDC);
temp.SelectObject(bmp);
for (int j=0;j<29;j++)
{
if (flag_select[j])
{
int x=koord[j][0]-x0;
int
y=koord[j][1]-y0;
temp.SelectStockObject (BLACK_BRUSH);
temp.Ellipse(x-3,y-3,x+3,
}
}
if (begin_point>=0)
{
int x=koord[begin_point][0]-x0;
int y=koord[begin_point][1]-y0;
CBrush br (RGB(255,0,0));
temp.SelectObject (&br);
temp.Ellipse(x-4,y-4,x+4,
}
if (flag_draw)
{
for (int i = 0; i < n; i++)
{
int
x1 = koord[sel_city[min_path[i]-1]]
int
x2 = koord[sel_city[min_path[i+1]-
int
y1 = koord[sel_city[min_path[i]-1]]
int
y2 = koord[sel_city[min_path[i+1]-
temp.MoveTo(x1-x0,y1-y0);
temp.LineTo(x2-x0,y2-y0);
}
CString
s1;
m_list1.ResetContent();
for (i=0;i < n; i++)
{
s1=name_city[sel_city[
s1+="
- "+name_city[sel_city[min_path[
CString s2;
s2.Format("%d",table[min_
s1+=" ->"+s2;
m_list1.AddString(s1);
}
m_len.Format("Длина пути:\n%d км",min_path[n+1]);
for (i=0;i < n; i++)
{
if (i % 2 != 0) m_list1.SetSel(i);
}
}
else
{
m_len="Выберите
несколько городов.";
}
UpdateData(false);
pDC.BitBlt(x0,y0,638,638,
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR
CKurs_LipinDlg::
{
return (HCURSOR) m_hIcon;
}
void
CKurs_LipinDlg::OnLButtonDown(
{
for (int i=0;i<29;i++)
{
int
x=point.x-koord[i][0],y=point.
if((x*x+y*y)<=7*7)
{
if (flag_Bpoint)
{
if (count_selected >= 13 && flag_select[i]==false)
{
MessageBox
("Нельзя выбрать более 13 городов
!!!\nВыберите выделенный
flag_Bpoint=false;
Invalidate(false);
}
else
{
begin_point=i;
flag_Bpoint=false;
if
(flag_select[i]==false) count_selected++;
flag_select[i]=true;
flag_draw=false;
Invalidate(false);
}
}
else
{
if (count_selected >= 13 && flag_select[i]==false)
{
MessageBox ("Нельзя выбрать более 13 городов !!!");
}
else
{
if (flag_select[i]==false) count_selected++;
else
{
count_selected--;
if (i == begin_point)
{
begin_point=-1;
}
}
flag_select[i]=!flag_
flag_draw=false;
Invalidate(false);
}
}
}
}
CDialog::OnLButtonDown(
}
void CKurs_LipinDlg::OnButton1()
{
m_list1.ResetContent();
for (int i=0; i < 29; i++)
flag_select[i]=false;
flag_select[6]=true;
flag_select[8]=true;
flag_select[12]=true;
flag_select[13]=true;
flag_select[15]=true;
flag_select[18]=true;
flag_select[19]=true;
flag_select[20]=true;
flag_select[21]=true;
flag_select[26]=true;
flag_select[27]=true;
flag_select[28]=true;
flag_select[24]=true;
count_selected=13;
flag_draw=false;
flag_Bpoint = false;
begin_point
= -1;
Invalidate(false);
}
void CKurs_LipinDlg::OnButton2()
{
m_list1.ResetContent();
for (int i=0; i < 29; i++)
flag_select[i]=false;
flag_Bpoint = false;
begin_point = -1;
count_selected = 0;
flag_draw = false;
Invalidate
(false);
}
void CKurs_LipinDlg::OnOK()
{
m_list1.ResetContent();
n
= count_selected;
if (n <=1)
{
MessageBox ("Пожалуйста, выберите не менее 2 городов.");
return;
}
sel_city= new int[n];
int count = 0;
for (int i=0; i < 29; i++)
if
(flag_select[i]) sel_city[count++] = i;
for (i=0; i < n; i++)// ставим исходный город на первое место в массиве
if (sel_city[i] == begin_point)
{
int tmp = sel_city[0];
sel_city[0] = sel_city[i];
sel_city[i] = tmp;
}
table = new int *[n];
for (i=0; i<n; i++)
table[i]
= new int [n];
for (i=0; i<n; i++)
for (int j = 0; j < n; j++)
{
if (i>=j)
{
table[i][j]=table[j][i]=
}
}
bool *flag = new bool[n]; // заполнение признаков посещения городов
flag[0] = true;
for
(i=1; i < n; i++) flag[i]=false;
unsigned int *cur_path = new unsigned int[n+2];
min_path
= new unsigned int[n+2];
//
заполнение матриц
min_path[0] = min_path[n]=1; min_path[n+1]=0;
for (i=1; i < n; i++)
{
min_path[i]=i+1; min_path[n+1]+=table[i-1][i];
cur_path[i]=0;
}
min_path[n+1] += table [min_path[n-1]-1] [min_path[n]-1 ];
cur_path[n+1] =0;
cur_path[0]
= cur_path[n] = 1;
m_len="Пожалуйста,
подождите:\nидут вычисления...
UpdateData(false);
recursiv
(flag,cur_path, 1); // вызов рекурсивной
функции*/
Информация о работе Программная реализация метода ветвей и границ