Advertisement
Guest User

Untitled

a guest
May 4th, 2015
280
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.89 KB | None | 0 0
  1. // SADlg.cpp : implementation file
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "SA.h"
  6. #include "SADlg.h"
  7. #include <math.h>
  8.  
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14.  
  15. /////////////////////////////////////////////////////////////////////////////
  16. // CAboutDlg dialog used for App About
  17.  
  18. class CAboutDlg : public CDialog
  19. {
  20. public:
  21. CAboutDlg();
  22.  
  23. // Dialog Data
  24. //{{AFX_DATA(CAboutDlg)
  25. enum { IDD = IDD_ABOUTBOX };
  26. //}}AFX_DATA
  27.  
  28. // ClassWizard generated virtual function overrides
  29. //{{AFX_VIRTUAL(CAboutDlg)
  30. protected:
  31. virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
  32. //}}AFX_VIRTUAL
  33.  
  34. // Implementation
  35. protected:
  36. //{{AFX_MSG(CAboutDlg)
  37. //}}AFX_MSG
  38. DECLARE_MESSAGE_MAP()
  39. };
  40.  
  41. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  42. {
  43. //{{AFX_DATA_INIT(CAboutDlg)
  44. //}}AFX_DATA_INIT
  45. }
  46.  
  47. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  48. {
  49. CDialog::DoDataExchange(pDX);
  50. //{{AFX_DATA_MAP(CAboutDlg)
  51. //}}AFX_DATA_MAP
  52. }
  53.  
  54. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  55. //{{AFX_MSG_MAP(CAboutDlg)
  56. // No message handlers
  57. //}}AFX_MSG_MAP
  58. END_MESSAGE_MAP()
  59.  
  60. /////////////////////////////////////////////////////////////////////////////
  61. // CSADlg dialog
  62.  
  63. CSADlg::CSADlg(CWnd* pParent /*=NULL*/)
  64. : CDialog(CSADlg::IDD, pParent)
  65. {
  66. //{{AFX_DATA_INIT(CSADlg)
  67. // NOTE: the ClassWizard will add member initialization here
  68. //}}AFX_DATA_INIT
  69. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  70. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  71. }
  72.  
  73. void CSADlg::DoDataExchange(CDataExchange* pDX)
  74. {
  75. CDialog::DoDataExchange(pDX);
  76. //{{AFX_DATA_MAP(CSADlg)
  77. DDX_Control(pDX, IDC_CITY_FRAME, m_CityFrame);
  78. //}}AFX_DATA_MAP
  79. }
  80.  
  81. BEGIN_MESSAGE_MAP(CSADlg, CDialog)
  82. //{{AFX_MSG_MAP(CSADlg)
  83. ON_WM_SYSCOMMAND()
  84. ON_WM_PAINT()
  85. ON_WM_QUERYDRAGICON()
  86. ON_BN_CLICKED(IDC_START, OnStart)
  87. //}}AFX_MSG_MAP
  88. END_MESSAGE_MAP()
  89.  
  90. /////////////////////////////////////////////////////////////////////////////
  91. // CSADlg message handlers
  92.  
  93. BOOL CSADlg::OnInitDialog()
  94. {
  95. CDialog::OnInitDialog();
  96.  
  97. // Add "About..." menu item to system menu.
  98.  
  99. // IDM_ABOUTBOX must be in the system command range.
  100. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  101. ASSERT(IDM_ABOUTBOX < 0xF000);
  102.  
  103. CMenu* pSysMenu = GetSystemMenu(FALSE);
  104. if (pSysMenu != NULL)
  105. {
  106. CString strAboutMenu;
  107. strAboutMenu.LoadString(IDS_ABOUTBOX);
  108. if (!strAboutMenu.IsEmpty())
  109. {
  110. pSysMenu->AppendMenu(MF_SEPARATOR);
  111. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  112. }
  113. }
  114.  
  115. // Set the icon for this dialog. The framework does this automatically
  116. // when the application's main window is not a dialog
  117. SetIcon(m_hIcon, TRUE); // Set big icon
  118. SetIcon(m_hIcon, FALSE); // Set small icon
  119.  
  120.  
  121. srand((unsigned)time(NULL));
  122.  
  123. CRect r;
  124. m_CityFrame.GetClientRect(&r);
  125.  
  126. m_memDC.CreateCompatibleDC(GetDC());
  127. m_bmp.CreateCompatibleBitmap(GetDC(), r.Width(), r.Height());
  128. m_font.CreatePointFont(110, L"Arial");
  129. m_pen.CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
  130. m_brush.CreateSolidBrush(RGB(255, 255, 255));
  131.  
  132. m_memDC.SelectObject(&m_bmp);
  133. m_memDC.SelectObject(&m_font);
  134. m_memDC.SelectObject(&m_pen);
  135. m_memDC.SelectObject(&m_brush);
  136.  
  137. m_CityFrame.GetClientRect(&r);
  138. m_memDC.Rectangle(&r);
  139.  
  140. m_memDC.SetBkMode(TRANSPARENT);
  141.  
  142. COLORREF oldTxtCol = (m_memDC.SetTextColor(RGB (0, 100, 10)));
  143.  
  144. alpha = 1.0;
  145. beta = 0.5;
  146. rho = 0.5;
  147.  
  148. return TRUE; // return TRUE unless you set the focus to a control
  149. }
  150.  
  151. void CSADlg::OnSysCommand(UINT nID, LPARAM lParam)
  152. {
  153. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  154. {
  155. CAboutDlg dlgAbout;
  156. dlgAbout.DoModal();
  157. }
  158. else
  159. {
  160. CDialog::OnSysCommand(nID, lParam);
  161. }
  162. }
  163.  
  164. // If you add a minimize button to your dialog, you will need the code below
  165. // to draw the icon. For MFC applications using the document/view model,
  166. // this is automatically done for you by the framework.
  167.  
  168. void CSADlg::OnPaint()
  169. {
  170. if (IsIconic())
  171. {
  172. CPaintDC dc(this); // device context for painting
  173.  
  174. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  175.  
  176. // Center icon in client rectangle
  177. int cxIcon = GetSystemMetrics(SM_CXICON);
  178. int cyIcon = GetSystemMetrics(SM_CYICON);
  179. CRect rect;
  180. GetClientRect(&rect);
  181. int x = (rect.Width() - cxIcon + 1) / 2;
  182. int y = (rect.Height() - cyIcon + 1) / 2;
  183.  
  184. // Draw the icon
  185. dc.DrawIcon(x, y, m_hIcon);
  186. }
  187. else
  188. {
  189. CPaintDC dc(this); // device context for painting
  190.  
  191. CRect r;
  192. m_CityFrame.GetWindowRect(&r);
  193. ScreenToClient(r);
  194.  
  195. dc.BitBlt(r.left, r.top, r.right - r.left, r.bottom - r.top, &m_memDC, 0, 0, SRCCOPY);
  196.  
  197. CDialog::OnPaint();
  198. }
  199. }
  200.  
  201. // The system calls this to obtain the cursor to display while the user drags
  202. // the minimized window.
  203. HCURSOR CSADlg::OnQueryDragIcon()
  204. {
  205. return (HCURSOR) m_hIcon;
  206. }
  207.  
  208. /************************************}
  209. {ODCZYT MAPY Z PLIKU }
  210. {************************************/
  211. BOOL CSADlg::InitializeMap()
  212. {
  213.  
  214. int i, j, k;
  215.  
  216. int stop;
  217.  
  218. CFile f;
  219. if (!f.Open(L"tsp-c.dat", CFile::modeRead | CFile::shareDenyWrite))
  220. {
  221. MessageBox(L"Proszę umieścić plik tsp-c.dat w katalogu, w którym znajduje się program.");
  222. return FALSE;
  223. }
  224.  
  225. float fBuf;
  226.  
  227. for (i = 0; i < NCITIES; i++)
  228. {
  229. f.Read(&fBuf, sizeof(float));
  230. loc[i][0] = (double)fBuf;
  231. f.Read(&fBuf, sizeof(float));
  232. loc[i][1] = (double)fBuf;
  233. };
  234.  
  235. f.Close();
  236. for (j = 0; j < NCITIES; j++)
  237. {
  238. do
  239. {
  240. stop = 1;
  241. route[j] = rand() % NCITIES;
  242. k=0;
  243.  
  244. while (k<j)
  245. {
  246. if (route[k] == route[j]) stop = 0;
  247. k++;
  248. };
  249. }
  250. while (!stop);
  251. };
  252.  
  253. distance = 0;
  254.  
  255. for (i = 0; i < NCITIES; i++)
  256. for (j = 0; j < NCITIES; j++)
  257. intens[i][j] = 0.01;
  258.  
  259. for (i = 0; i < NCITIES; i++)
  260. for (j = 1; j < NCITIES; j++)
  261. ants[i][j] = -1;
  262.  
  263. for (i = 0; i < NCITIES; i++)
  264. ants[i][0] = 0;
  265.  
  266. for (i = 0; i < NCITIES; i++)
  267. for (int j = 0; j < NCITIES; j++)
  268. {
  269. delta[i][j] = 0.0;
  270.  
  271. double d = Dst(i,j);
  272.  
  273. if (d == 0.0)
  274. d = -1;
  275.  
  276. visibility[i][j] = 1/d;
  277. }
  278.  
  279. return TRUE;
  280. }
  281.  
  282. double CSADlg::Dst(int i, int j)
  283. {
  284. double xi = loc[i][0];
  285. double yi = loc[i][1];
  286. double xj = loc[j][0];
  287. double yj = loc[j][1];
  288.  
  289. double res = sqrt((xi-xj)*(xi-xj) + (yi-yj)*(yi-yj));
  290.  
  291. return res;
  292. }
  293.  
  294. bool CSADlg::IsCityInAnt(int city, int ant)
  295. {
  296. bool bRes = false;
  297.  
  298. for (int i = 0; i < NCITIES; i++)
  299. {
  300. if (ants[ant][i] == city)
  301. {
  302. bRes = true;
  303. break;
  304. }
  305. }
  306.  
  307. return bRes;
  308. }
  309.  
  310.  
  311. /**************************************************************************}
  312. {RYSOWANIE AKTUALNEJ TRASY, WYSWIETLANIE JEJ DŁUGOŚCI }
  313. {**************************************************************************/
  314. void CSADlg::Draw()
  315. {
  316.  
  317. int i, x, y, x1, y1;
  318. char s[10];
  319. CString sEn = "Długość trasy: ";
  320.  
  321. CRect r;
  322. m_CityFrame.GetClientRect(&r);
  323. m_memDC.Rectangle(&r);
  324.  
  325. if (distance == 0.0)
  326. {
  327. sEn = "Wyznacz długość aktualnej trasy!";
  328. }
  329. else
  330. {
  331. _gcvt_s(s, sizeof(s), distance, 5);
  332. sEn += CString(s);
  333. }
  334.  
  335. m_memDC.TextOut(10, r.Height()-20, sEn);
  336.  
  337. for (i = 0; i < NCITIES; i++)
  338. {
  339. x = 10 + (int)((r.Width()-20)*loc[i][0]);
  340. y = 10 + (int)((r.Height()-20)*loc[i][1]);
  341. m_memDC.Ellipse(x-5, y-5, x+5, y+5);
  342. }
  343.  
  344. for (i = 0; i < NCITIES-1; i++)
  345. {
  346. x = 10 + (int)((r.Width()-20)*loc[route[i]][0]);
  347. y = 10 + (int)((r.Height()-20)*loc[route[i]][1]);
  348. x1 = 10 + (int)((r.Width()-20)*loc[route[i+1]][0]);
  349. y1 = 10 + (int)((r.Height()-20)*loc[route[i+1]][1]);
  350. m_memDC.MoveTo(x, y);
  351. m_memDC.LineTo(x1, y1);
  352. };
  353.  
  354. x = 10 + (int)((r.Width()-20)*loc[route[NCITIES-1]][0]);
  355. y = 10 + (int)((r.Height()-20)*loc[route[NCITIES-1]][1]);
  356. x1 = 10 + (int)((r.Width()-20)*loc[route[0]][0]);
  357. y1 = 10 + (int)((r.Height()-20)*loc[route[0]][1]);
  358. m_memDC.MoveTo(x, y);
  359. m_memDC.LineTo(x1, y1);
  360.  
  361. CDC* pDC = GetDC();
  362. m_CityFrame.GetWindowRect(&r);
  363. ScreenToClient(r);
  364.  
  365. pDC->BitBlt(r.left, r.top, r.right - r.left, r.bottom - r.top, &m_memDC, 0, 0, SRCCOPY);
  366.  
  367. ReleaseDC(pDC);
  368.  
  369. }
  370.  
  371. void CSADlg::OnStart()
  372. {
  373.  
  374. if (!InitializeMap())
  375. return;
  376.  
  377. Draw();
  378.  
  379. /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!}
  380. {TU WSTAWIC ALGORYTM MRÓWKOWY }
  381. {!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!}
  382.  
  383. Z pliku została wczytana mapa miast. Jest ich NCITIES.
  384.  
  385. Liczba mrówek to NANTS. Każda mrówka jest reprezentowana przez jeden wiersz w tablicy ants[NANTS][NCITIES].
  386. Każdy wiersz ma zawierać indeksy miast, odwiedzanych kolejno przez mrówkę.
  387. Każda mrówka startuje z miasta 0, dlatego pierwszy element wiersza to 0,
  388. a pozostałe elementy wiersza są początkowo ustawione na -1.
  389.  
  390. Tablica intens[NCITIES][NCITIES] służy do przechowywania intensywności "feromonu";
  391. intens[i][j] oznacza siłę "zapachu" połączenia między miastami i oraz j.
  392. Początkowo wszystkie połączenia mają przypisaną tę samą wagę.
  393.  
  394. W tablicy visibility[NCITIES][NCITIES] przechowywane są wartości opisujące, jak dobrze "widać" miasto j z miasta i.
  395. Element visibility(i,j) zawiera wartość 1/d(i,j), gdzie d(i,j) jest odległością między miastami i oraz j.
  396.  
  397. Tablica delta[NCITIES][NCITIES], wypełniona na początku zerami, będzie służyć do odnotowywania przejść mrówek
  398. pomiędzy poszczególnymi miastami.
  399.  
  400. Wartości alpha, beta i rho używane w algorytmie są już ustawione.
  401.  
  402. Procedura 'Draw' wyświetla trasę zawartą w 'route' i wartość zmiennej
  403. 'distance' (o ile jest wyznaczona).
  404.  
  405. Funkcja Dst(i,j) oblicza odległość między miastami i oraz j.
  406.  
  407. Funkcja IsCityInAnt(city, ant) zwraca 'true', gdy miasto 'city' znajduje się już w trasie mrówki 'ant'.
  408.  
  409. Zmienne są zdefiniowane w pliku SADlg.h.
  410.  
  411.  
  412. ---Algorytm mrówkowy---
  413.  
  414.  
  415.  
  416. -------------------------------------------------------------------------------------
  417. WAŻNE! Atrakcyjność przejścia z miasta i-tego do miasta j-tego wyznaczamy następująco:
  418. (intens[i][j]^alpha * visibility[i][j]^beta)
  419. -------------------------------------------------------------------------------------
  420.  
  421. Podane kroki powtórz 100 razy.
  422. 1. Poniższą czynność wykonaj (NCITIES-1) razy.
  423. Dla każdej mrówki wyznacz kolejne miasto w trasie:
  424. - oblicz sumę S atrakcyjności przejść do wszystkich możliwych miast
  425. - przejdź do kolejnego miasta z prawdopodobieństwem równym
  426. 0, jeśli mrówka już była w tym mieście,
  427. (atrakcyjność_przejścia / S) w przeciwnym razie.
  428. 2. Dla każdej k-tej mrówki wyznacz długość trasy dist(k).
  429. 3. Przepisz najkrótszą trasę do 'route', jej długość do 'distance'
  430. i wywołaj 'Draw'.
  431. 4. Wypełnij tablicę 'delta':
  432. dla każdej k-tej mrówki, jeśli w jej trasie jest przejście z
  433. miasta 'i' do miasta 'j', to
  434. delta[i][j] += a/dist(k);
  435. gdzie a = 10 dla najlepszej mrówki, a = 1 dla pozostałych,
  436. 5. Uaktualnij tablicę 'intens' (po wszystkich i,j):
  437. intens[i][j] = rho*intens[i][j] + delta[i][j];
  438. 6. Wyzeruj tablicę 'delta'.
  439. 7. Wyczyść trasę każdej mrówki (wszystkie elementy z wyjątkiem
  440. pierwszego ustaw na -1).
  441.  
  442. {!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
  443. double S;
  444. double dummy_rand;
  445. for (int loop = 0; loop < 100; loop++) {
  446. //1
  447. for (int i = 0; i < NCITIES - 1; i++) {
  448. for (int j = 0; j < NANTS; j++) {
  449. S = 0;
  450. for (int h = 0; h < NCITIES; h++) {
  451. S += pow(intens[h][i], alpha) * pow(visibility[h][i] , beta);
  452. }
  453.  
  454. //przejscie
  455. dummy_rand = (double)rand() / RAND_MAX;
  456. for (int h = 0; h < NCITIES; h++) {
  457. if (IsCityInAnt(h, j) == false) {
  458. if (dummy_rand < (intens[i][h] / S)){
  459. ants[j][i + 1] = h;
  460. break;
  461. }
  462. }
  463. }
  464.  
  465. }
  466.  
  467. }
  468.  
  469. //2
  470. double min_dist = MAXINT;
  471. int min_ant = 0;
  472. double ant_dist[NANTS];
  473.  
  474. for (int k = 0; k < NANTS; k++) {
  475. ant_dist[k] = 0;
  476. for (int i = 0; i < NCITIES-1; i++) {
  477. ant_dist[k] += Dst(ants[k][i], ants[k][i + 1]);
  478. }
  479. if (ant_dist[k] < min_dist) {
  480. min_ant = k;
  481. min_dist = ant_dist[k];
  482. }
  483.  
  484. }
  485.  
  486. //3
  487. distance = min_dist;
  488. for (int i = 0; i < NCITIES; i++) {
  489. route[i] = ants[min_ant][i];
  490. }
  491. Draw();
  492.  
  493.  
  494. //4
  495. for (int j = 0; j < NANTS; j++) {
  496. for (int k = 1; k < NCITIES-1; k++) {
  497. if (j == min_ant) {
  498. delta[ants[j][k]][ants[j][k + 1]] += 10.0/ant_dist[j];
  499. }
  500. else {
  501. delta[ants[j][k]][ants[j][k + 1]] += 1.0/ant_dist[j];
  502. }
  503. }
  504. }
  505.  
  506. //5
  507. for (int i = 0; i < NCITIES; i++) {
  508. for (int j = 0; j < NCITIES; j++) {
  509. intens[i][j] = rho*intens[i][j] + delta[i][j];
  510. }
  511. }
  512.  
  513. //6
  514. for (int i = 0; i < NCITIES; i++) {
  515. for (int j = 0; j < NCITIES; j++) {
  516. delta[i][j] = 0;
  517. }
  518. }
  519. //7
  520. for (int i = 0; i < NANTS; i++) {
  521. ants[i][0] = 0;
  522. for (int j = 0; j < NCITIES; j++) {
  523. ants[i][j] = -1;
  524. }
  525. }
  526. }
  527.  
  528.  
  529.  
  530.  
  531.  
  532. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement