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¿ÏÀü ¹®Á¦ÀÇ Çϳª·Î, ´ÙÇ×½Ä ½Ã°£ÀÇ ÇØ¹ý (Àº)´Â Á¸ÀçÇÏÁö ¾Ê´Â´Ù°í ¸»ÇØÁö°í ÀÖ´Ù. Á¤¸»·Î Á¸ÀçÇÒ±î À̹ÙÁöÇÏÁö ¾ÊµçÁöÀΰ¡, Áõ¸íÇÒ ¼ö ÀÖÀ¸¸é, ´ç½ÅÀº Æ©¸µ»ó(ÄÄÇ»ÅÍ °úÇÐ ºÐ¾ß¿¡¼ÀÇ ³ëº§»ó) µî ´Â µÎÀÌ´Ù.