¼øȸ ¼¼ÀÏÁî¸Ç ¹®Á¦


ÇÔ¼ö¸í
tsp  ¼øȸ ¼¼ÀÏÁî¸Ç ¹®Á¦(n°³ÀÇ ½Ã 1ȸ¾¿ ´Ù³àµµ¶ó´Â ½Ã
     ¿¡ µ¹¾Æ¿À±â À§ÇÑ ÃÖ´Ü Æнº¸¦ ¿ä±¸ÇÏ´Â ¹®Á¦)
Çü½Ä
int tsp(int *spath, int *xcity, int *ycity, int ncity);
Àμö
spath  (Ãâ·Â) ÃÖ´Ü ÆĽº°¡ µé¾î°¡ ÀÖ´Â ¹è¿­
xcity  (ÀÔ·Â) n°³ÀÇ ½ÃÀÇ xÁÂÇ¥
ycity  (ÀÔ·Â) n°³ÀÇ ½ÃÀÇ yÁÂÇ¥
ncity  (ÀÔ·Â) ½ÃÀÇ ¼ön
ÇÔ¼öÄ¡
ÃÖ´Ü Æнº¿¡ µû¶ó Åë°úÇÏ´Â ¸ÇÇÏź °Å¸®(¸ÇÇÏź °Å¸®¶õ, (x1, y1) (¿Í)°ú (x2, y2) ÀÇ 2Á¡ÀÇ °Å¸®´Â |x1-x2|+|y1-y2| ·Î ³ªÅ¸³»´Â °Å¸®)

ÁÖÀÇ »çÇ×

¿ë·Ê
¿ë·Ê ÇÁ·Î±×·¥(tsp-test.c )

»ç¿ë¹ýÀÔ´Ï´Ù¸¸, ¿ì¼± µ¥ÀÌÅÍ ÆÄÀÏÀ» ÁغñÇØ µÐ´Ù. ½ÃÀÇ ¼ö¸¦ µ¥ÀÌÅÍ ÆÄÀÏÀÇ 1Çà°¿¡ ¾´´Ù. 2Çà°ºÎÅÍ´Â 1Çà ¸¶´Ù °¢ ½ÃÀÇ x, y ÁÂÇ¥¸¦ ¾´´Ù. ¿¹¸¦ µé¾î, ÀÌÇÏ¿Í °°ÀÌ,
4
2 4
6 8
1 4
3 6
±×¸®°í µ¥ÀÌÅÍ ÆÄÀÏÀ» ¾´´Ù. ´ÙÀ½¿¡, ¿ë·Ê ÇÁ·Î±×·¥Àº
tsp-test µ¥ÀÌÅÍ ÆÄÀÏ
±×¸®°í ½ÇÇàÇϸé, ÃÖ´Ü °Å¸®¸¦ ³»´Â Æнº°¡ Ç¥½ÃµÈ´Ù. ÃÖ´Ü Æнº°¡ ¾ó¸¶µçÁö ¾î´À °æ¿ì´Â, ±× 1¿¹ÀÇ Ç¥½Ã°¡ µÈ´Ù.

ÇÁ·Î±×·¥(tsp.c )
#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;
    }
}
¼³¸í
º»ÇÁ·Î±×·¥Àº Èû¸Ã±è ¹æ¹ýÀ» ÃëÇÏ°í ÀÖ¾î, ¸ðµç ÆнºÀÇ Æí¼º (À»)¸¦ 1°³ 1°³(»ì)¸¸µé¾î ³», ±× ÆнºÀÇ °Å¸®¸¦ °è»êÇØ, ±× Áß¿¡¼­ ÃÖ´Ü °Å¸®¸¦ »êÃâ ÇÏ°í ÀÖ´Ù. µû¶ó¼­, ½ÃÀÇ ¼ö°¡ 10À» ³ÑÀ¸¸é(ÀÚ), °è»ê ½Ã°£ÀÌ ´ë´ÜÈ÷Àΰ¡ »ç ¹ö¸°´Ù.

¸î¹é½Ã¸¦ ³ÑÀ¸¸é(ÀÚ), ¼¼°èÀÇ ¸ðµç ÄÄÇ»Å͸¦ µ¿¿øÇØ, ¿ìÁÖ Åº»ýÀÇ ¼ø »çÀ̺ÎÅÍÀÇ ¸î¹é¾ï³âÀ» °è»ê½ÃÄѵµ ³¡³ªÁö ¾Ê´Â °è»ê ½Ã°£ÀÌ´Ù. ÄÜÇ» Ÿ´Â ³Ê¹«³ª ¹«·ÂÇÑ °ÍÀÏ °ÍÀÌ´Ù. ±× âÁ¶ÁÖÀÇ Àΰ£¿¡ ´ëÇؼ­µµ °°Àº °ÍÀÌ ¸»ÇÒ ¼ö ÀÖÀ»Áöµµ ¸ð¸£´Ù.

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

°ü·Ã ÇÔ¼ö