tsp ¼øȸ ¼¼ÀÏÁî¸Ç ¹®Á¦(n°³ÀÇ ½Ã 1ȸ¾¿ ´Ù³àµµ¶ó´Â ½Ã ¿¡ µ¹¾Æ¿À±â À§ÇÑ ÃÖ´Ü Æнº¸¦ ¿ä±¸ÇÏ´Â ¹®Á¦)
int tsp(int *spath, int *xcity, int *ycity, int ncity);
spath (Ãâ·Â) ÃÖ´Ü ÆĽº°¡ µé¾î°¡ ÀÖ´Â ¹è¿ xcity (ÀÔ·Â) n°³ÀÇ ½ÃÀÇ xÁÂÇ¥ ycity (ÀÔ·Â) n°³ÀÇ ½ÃÀÇ yÁÂÇ¥ ncity (ÀÔ·Â) ½ÃÀÇ ¼ön
»ç¿ë¹ýÀÔ´Ï´Ù¸¸, ¿ì¼± µ¥ÀÌÅÍ ÆÄÀÏÀ» ÁغñÇØ µÐ´Ù. ½ÃÀÇ ¼ö¸¦ µ¥ÀÌÅÍ
ÆÄÀÏÀÇ 1Çà°¿¡ ¾´´Ù. 2Çà°ºÎÅÍ´Â 1Çà ¸¶´Ù °¢ ½ÃÀÇ x, y ÁÂÇ¥¸¦ ¾´´Ù.
¿¹¸¦ µé¾î, ÀÌÇÏ¿Í °°ÀÌ,
4
2 4
6 8
1 4
3 6
±×¸®°í µ¥ÀÌÅÍ ÆÄÀÏÀ» ¾´´Ù. ´ÙÀ½¿¡, ¿ë·Ê ÇÁ·Î±×·¥Àº
tsp-test µ¥ÀÌÅÍ ÆÄÀÏ
±×¸®°í ½ÇÇàÇϸé, ÃÖ´Ü °Å¸®¸¦ ³»´Â Æнº°¡ Ç¥½ÃµÈ´Ù. ÃÖ´Ü Æнº°¡ ¾ó¸¶µçÁö
¾î´À °æ¿ì´Â, ±× 1¿¹ÀÇ Ç¥½Ã°¡ µÈ´Ù.
#define MAX_CITY 100 int tsp(int *spath, int *xcity, int *ycity, int ncity) { int slen = -1; int tpath[MAX_CITY]; static int guess(); static void evaluate(); while (1) { if (guess(tpath, slen, xcity, ycity, ncity) == 1) break; evaluate(&slen, spath, tpath, xcity, ycity, ncity); } return slen; } static int guess(int *tpath, int slen, int *xcity, int *ycity, int ncity) { int i, j, k; int tmp[MAX_CITY]; if (slen < 0) { for (i = 0; i < ncity; i++) tpath[i] = i; return 0; } for (i = ncity - 2; i >= 1; i--) { for (j = 0; j < ncity; j++) tmp[j] = j; for (j = 0; j <= i; j++) tmp[tpath[j]] = MAX_CITY; for (j = 0; j < ncity; j++) if (tmp[j] ! = MAX_CITY) if (tmp[j] > tpath[i]) { tpath[i] = tmp[j]; goto NEXT; } } return 1; NEXT: for (j = i+1; j < ncity; j++) { for (k = 0; k < ncity; k++) tmp[k] = k; for (k = 0; k < j; k++) tmp[tpath[k]] = MAX_CITY; for (k = 0; k < ncity; k++) if (tmp[k] ! = MAX_CITY) { tpath[j] = tmp[k]; break; } } return 0; } static void evaluate(int *slen, int *spath, int *tpath, int *xcity, int *ycity, int ncity) { int i; int dx, dy; int tlen; dx = xcity[tpath[0]] - xcity[tpath[ncity-1]]; dy = ycity[tpath[0]] - ycity[tpath[ncity-1]]; if (dx < 0) dx = -dx; if (dy < 0) dy = -dy; tlen = dx + dy; for (i = 1; i < ncity; i++) { dx = xcity[tpath[i]] - xcity[tpath[i-1]]; dy = ycity[tpath[i]] - ycity[tpath[i-1]]; if (dx < 0) dx = -dx; if (dy < 0) dy = -dy; tlen += dx + dy; } if (*slen < 0 || tlen < *slen) { for (i = 0; i < ncity; i++) spath[i] = tpath[i]; *slen = tlen; } }
¸î¹é½Ã¸¦ ³ÑÀ¸¸é(ÀÚ), ¼¼°èÀÇ ¸ðµç ÄÄÇ»Å͸¦ µ¿¿øÇØ, ¿ìÁÖ Åº»ýÀÇ ¼ø »çÀ̺ÎÅÍÀÇ ¸î¹é¾ï³âÀ» °è»ê½ÃÄѵµ ³¡³ªÁö ¾Ê´Â °è»ê ½Ã°£ÀÌ´Ù. ÄÜÇ» Ÿ´Â ³Ê¹«³ª ¹«·ÂÇÑ °ÍÀÏ °ÍÀÌ´Ù. ±× âÁ¶ÁÖÀÇ Àΰ£¿¡ ´ëÇؼµµ °°Àº °ÍÀÌ ¸»ÇÒ ¼ö ÀÖÀ»Áöµµ ¸ð¸£´Ù.
¼øȸ ¼¼ÀÏÁî¸Ç ¹®Á¦´Â À̸¥¹Ù NP¿ÏÀü ¹®Á¦ÀÇ Çϳª·Î, ´ÙÇ×½Ä ½Ã°£ÀÇ Çعý (Àº)´Â Á¸ÀçÇÏÁö ¾Ê´Â´Ù°í ¸»ÇØÁö°í ÀÖ´Ù. Á¤¸»·Î Á¸ÀçÇÒ±î À̹ÙÁöÇÏÁö ¾ÊµçÁöÀΰ¡, Áõ¸íÇÒ ¼ö ÀÖÀ¸¸é, ´ç½ÅÀº Æ©¸µ»ó(ÄÄÇ»ÅÍ °úÇÐ ºÐ¾ß¿¡¼ÀÇ ³ëº§»ó) µî ´Â µÎÀÌ´Ù.