¹®Á¦ÇØ°á : ÇØÀÇ Å½»ö

(Problem Solving : The Search for Solutions)

 

C ÀΰøÁö´É ÇÁ·Î±×·¡¹Ö : Herbert Schildt ÁöÀ½, ½Å°æ¼÷.·ù¼º·Ä ¿Å±è, ¼¼¿õ, 1991 (¿ø¼­ : Artificial Intelligence using C, McGraw-Hill, 1987), page 29~91

 

1. Ç¥Çö°ú ¿ë¾î (REPRESENTATION AND TERMINOLOGY)

2. °úµµÇÑ Áõ°¡ (COMBINATION EXPLOSIONS)

3. Ž»ö ±â¹ý (SEARCH TECHNIQUES)

4. Ž»ö Æò°¡ (EVALUATION A SEARCH)

5. ±íÀÌ¿ì¼± Ž»ö±â¹ý (THE DEPTH-FIRST SEARCH TECHNIQUE)

     (1) ±íÀÌ¿ì¼± Ž»ö Æò°¡Çϱâ (Evaluating the Depth-First Search)

6. ³Êºñ¿ì¼± Ž»ö±â¹ý (THE BREATH-FIRST SEARCH TECHNIQUE)

     (1) ³Êºñ¿ì¼± Ž»öÆò°¡ (Evaluating the Breadth-First Search)

7. ÈÞ¸®½ºÆ½ ºÎ°¡ (ADDING HEURISTICS)

8. ¾ð´ö¿À¸£±â ±â¹ý (THE HILL CLIMBING SEARCH TECHNIQUE)

    (1) ¾ð´ö¿À¸£±â Ž»ö Æò°¡ (Evaluating the Hill-Climbing Search)

9. ÃÖ¼Òºñ¿ë Ž»ö±â¹ý (THE LEAST-COST SEARCH TECHNIQUE)

    (1) ÃÖ¼Òºñ¿ë Ž»ö Æò°¡ (Evaluating the Least-Cost Search)

10. Ž»ö±â¹ý ¼±Åà (CHOOSING A SEARCH TECHNIQUE)

11. º¹¼ö ÇØ Ã£±â (FINDING MULTIPLE SOLUTIONS)

      (1) °æ·Î Á¦°Å ¹æ¹ý (The Path-Removal Method)

      (2) ³ëµå Á¦°Å ¹æ¹ý (The Node-Removal Method)

12. ÃÖÀûÇØ Ã£±â (FINDING THE OPTIMAL SOLUTION)

13. ÀÒ¾î ¹ö¸° ¿­¼è·Î µ¹¾Æ°¡¼­ (BACK TO THE MISSING KEYS)

 

¹®Á¦ÇØ°áÀº ´ëºÎºÐÀÇ AI ÀÀ¿ë¿¡ ±âº»ÀÌ µÈ´Ù. »ç½Ç»ó, ¹®Á¦¸¦ ÇØ°áÇÏ´Â ´É·ÂÀº Á¾Á¾ »ç¶÷°ú ±â°è¿¡ ´ëÇÑ Áö´ÉÀÇ ÃøÁ¤ ±âÁØÀ¸·Î »ç¿ëµÈ´Ù. ÁÖ·Î µÎ°¡Áö À¯ÇüÀÇ ¹®Á¦°¡ ÀÖ´Ù. ù ¹ø° À¯ÇüÀº ¼º°øÀÌ º¸ÀåµÈ °áÁ¤Àû ÇÁ·Î½ÃÀú (deterministic procedure) ¸¦ »ç¿ëÇÔÀ¸·Î½á ÇØ°áµÉ ¼ö ÀÖ´Ù. ÀÌ °úÁ¤Àº °è»ê (computation) À̶ó°í ºÒ¸°´Ù. °è»ê¿¡ ÀÇÇØ ÇØ°áÇÏ´Â °ÍÀº º¸Åë, ¼öÇп¡¼­ ó·³, ÇÁ·Î½ÃÀú°¡ ¹®Á¦¸¦ À§ÇÏ¿© Á¸ÀçÇÏ´Â ±×·± À¯ÇüÀÇ ¹®Á¦µé¿¡¸¸ Àû¿ëµÈ´Ù. Á¾Á¾ ÀÌ ¹®Á¦µéÀ» ÇØ°áÇϱâ À§ÇÏ¿© »ç¿ëµÇ´Â ¹æ¹ýµéÀ» ÄÄÇ»ÅÍ°¡ ¼öÇàÇÒ ¼ö ÀÖ´Â ¾Ë°í¸®ÁòÀ¸·Î ½±°Ô ¹Ù²Ü ¼ö ÀÖ´Ù. ±×·¯³ª, °è»êÀûÀÎ ÇØ°á¿¡ µµ¿òÀÌ µÇ´Â ½Ç¼¼°è ¹®Á¦´Â °ÅÀÇ ¾ø±â ¶§¹®¿¡ ±×·± ¹®Á¦µéÀº Çظ¦ Ž»öÇÔÀ¸·Î½á (searching for a solution) ÇØ°áÇÏ´Â ¹®Á¦µé·Î ±¸¼ºµÈ µÎ ¹ø° ºÎ·ù¿¡ ³õ¿©¾ß ÇÑ´Ù. ÀÌ°ÍÀÌ AI °¡ °ü°èÇÏ´Â ¹®Á¦ÇØ°á ¹æ¹ýÀÌ´Ù.

AI ±â¹ýÀ» ½Ç¼¼°è ¹®Á¦¿¡ Àû¿ëÇÏ·Á°í ÇÒ ¶§ ±Øº¹Çϱ⠾î·Á¿î Àå¾Ö¹° ÁßÀÇ Çϳª´Â ´ëºÎºÐÀÇ »óȲÀÌ ¾ÆÁÖ Å©´Ù´Â °Í°ú º¹ÀâÇÏ´Ù´Â °ÍÀÌ´Ù. AI ¿¬±¸ Ãʱ⿡, ÁÁÀº Ž»ö¹æ¹ýÀ» °³¹ßÇÏ·Á´Â ÇÊ¿ä¿Í ¿ä±¸¿¡ ÀÇÇØ ÁÖ¿ä ¸ñÇ¥°¡ µÇ¾ú´Ù. ´ç½Ã¿¡ »ç¿ëµÈ ÄÄÇ»ÅÍÀÇ Á¦¾à ¶§¹®¿¡ ÇÁ·Î±×·¡¸Ó°¡ ÀÌ·¯ÇÑ ¹®Á¦µéÀ» ÇØ°áÇϱâ À§ÇÏ¿© ÁÁÀº Ž»ö ±â¹ýÀ» °í¾ÈÇÏ´Â °ÍÀÌ ÇÊ¿äÇß´Ù. ´õ¿íÀÌ, Ž»öÀÌ Áö´ÉÀÇ ÁÖ¿ä ¼ººÐÀÎ ¹®Á¦ÇØ°á¿¡ Áß½ÉÀÌ µÈ´Ù°í ¹Ï¾ú°í, ÇöÀçµµ ±×·¸°Ô ¹Ï±â ¶§¹®¿¡ ÇÁ·Î±×·¡¸Ó´Â ÁÁÀº Ž»ö ±â¹ýÀ» ¹Ù¶õ´Ù.

1. Ç¥Çö°ú ¿ë¾î (REPRESENTATION AND TERMINOLOGY)

ÀÚµ¿Â÷ ¿­¼è (key) ¸¦ ÀÒ¾î ¹ö·È´Ù°í »ý°¢Çغ¸ÀÚ. ±× ¿­¼èµéÀÌ ´ÙÀ½°ú °°ÀÌ Áý ¾îµò°¡¿¡ ÀÖ´Ù´Â °ÍÀº ¾È´Ù :

X ´Â Çö°ü¿¡ ¼­ ÀÖ´Ù´Â °ÍÀ» ³ªÅ¸³½´Ù. Ž»öÀ» ½ÃÀÛÇÒ ¶§ ¿ì¼± °Å½ÇÀ» Á¡°ËÇÑ´Ù. ±×¸®°í³ª¼­ º¹µµ¸¦ µû¶ó ù ¹ø° ħ½Ç·Î °¡°í, º¹µµ·Î µÇµ¹¾Æ¿Í¼­ µÎ ¹ø° ħ½Ç·Î °¡°í, ´Ù½Ã º¹µµ·Î µÇµ¹¾Æ¿Í¼­ ¾È¹æÀ¸·Î °£´Ù. ¾ÆÁ÷ ¿­¼è¸¦ ãÁö ¸øÇ߱⠶§¹®¿¡, °Å½Ç·Î µÇµ¹¾Æ¿Í¼­ ºÎ¾ýÀ¸·Î °¡°í °Å±â¿¡¼­ ¿­¼è¸¦ ã´Â´Ù. ±×¸² 1 ¿¡ µû¶ó°£ °æ·Î¿¡ ´ëÇÑ ±×·¡ÇÁ¸¦ Á¦½ÃÇÑ´Ù.

±×¸² 1  ÀÒ¾î ¹ö¸° ¿­¼è¸¦ ã´Â Æнº ±×·¡ÇÁ

ÀÌ·¯ÇÑ Á¾·ùÀÇ  ¹®Á¦¸¦ ±×·¡ÇÁ·Î Ç¥ÇöÇÒ ¼ö ÀÖ´Ù´Â »ç½ÇÀº ´Ù¸¥ Ž»ö ±â¹ýµéÀÌ ¾î¶»°Ô µ¿ÀÛÇÏ´Â Áö¸¦ º¸¿©ÁÖ´Â °£´ÜÇÑ ¹æ¹ýÀ» Á¦½ÃÇϱ⠶§¹®¿¡ Áß¿äÇÏ´Ù (¶ÇÇÑ, ¹®Á¦¸¦ ±×·¡ÇÁ·Î Ç¥ÇöÇÒ ¼ö ÀÖ´Ù´Â °ÍÀº AI ¿¬±¸°¡µé¿¡°Ô ±×·¡ÇÁ ÀÌ·ÐÀ¸·ÎºÎÅÍ ¿©·¯ °¡Áö Á¤¸®¸¦ Àû¿ëÇÒ¼ö ÀÖ°Ô ÇÑ´Ù. ±×·¯³ª, ÀÌ°ÍÀº ÀÌ Ã¥ÀÇ ¹üÀ§¸¦ ³Ñ´Â´Ù). ÀÌ·¯ÇÑ »ç½ÇÀ» ¿°µÎ¿¡ µÎ°í, ´ÙÀ½ Á¤ÀǸ¦ °øºÎÇØ º¸ÀÚ.

ÀÒ¾î ¹ö¸° ¿­¼è ¿¹Á¦¿¡¼­, ÁýÀÇ °¢ ¹æÀÌ ÇϳªÀÇ ³ëµå¶ó°í »ý°¢Çغ¸ÀÚ ; Áý Àüü´Â Ž»ö°ø°£ÀÌ´Ù ; ¸ñÇ¥´Â ºÎ¾ýÀÌ´Ù ; ±×¸®°í ÇØÀÇ °æ·Î´Â ±×¸² 1 ¿¡ ÀÖ´Â ±×·¡ÇÁÀÌ´Ù. ÀÌ ¿¹Á¦´Â ÈÞ¸®½ºÆ½À» »ç¿ëÇÏÁö ¾Ê¾ÒÁö¸¸, ÀÌ ÀåÀÇ µÞºÎºÐ¿¡¼­ ¾à°£ º¸°Ô µÉ °ÍÀÌ´Ù.

2. °úµµÇÑ Áõ°¡ (COMBINATION EXPLOSIONS)

ÀÌ ½ÃÁ¡¿¡¼­, Çظ¦ ã´Â °ÍÀÌ, óÀ½¿¡ ½ÃÀÛÇؼ­ °á·Ð±îÁö ¹æ¹ýÀ» Àû¿ëÇÏ´Â °Í¸¸Å­ °£´ÜÇÏ´Ù°í »ý°¢ÇÒ ¼ö ÀÖ´Ù. ÀÒ¾î ¹ö¸° ¿­¼èÀÇ ¾ÆÁÖ °£´ÜÇÑ °æ¿ì¿¡ ÀÌ Å½»ö ¹æ¹ýÀº ÁÁÀº ¹æ¹ýÀÌ´Ù. ±×·± ¹®Á¦¸¦ ÇØ°áÇϱâ À§ÇÏ¿© ÄÄÇ»Å͸¦ »ç¿ëÇϱ⸦ ¿øÇÏ´Â ´ëºÎºÐÀÇ ¹®Á¦¿¡¼­, »óȲÀº ´Þ¶óÁø´Ù. ÀϹÝÀûÀ¸·Î, Ž»ö°ø°£¿¡¼­ ³ëµåÀÇ ¼ö°¡ ¸Å¿ì ¸¹°í, Ž»ö°ø°£ÀÌ Ä¿Áü¿¡ µû¶ó ¸ñÇ¥±îÁöÀÇ ¼­·Î ´Ù¸¥ °æ·ÎÀÇ ¼öµµ Áõ°¡ÇÏ´Â ±×·± ¹®Á¦µéÀ» ÇØ°áÇϱâ À§ÇÏ¿© ÄÄÇ»Å͸¦ »ç¿ëÇÒ °ÍÀÌ´Ù. ¹®Á¦´Â Ž»ö°ø°£¿¡ ´õÇØÁö´Â °¢ ³ëµå¿¡ Çϳª ÀÌ»óÀÇ °æ·Î¸¦ ´õÇØÁشٴ °ÍÀÌ´Ù ; Áï, ¸ñÇ¥±îÁö °æ·ÎÀÇ ¼ö´Â °¢ »õ·Î¿î ³ëµå¿¡ ´ëÇÏ¿© ´õ »¡¸® Áõ°¡ÇÒ °ÍÀÌ´Ù.

ÀÌ·¯ÇÑ Áõ°¡¸¦ ÀÌÇØÇϱâ À§Çؼ­, ¼¼ °³ÀÇ ´ë»ó¹° (object) - A, B, C - ¸¦ Å×À̺í À§¿¡ ¹è¿­ÇÏ´Â ¹æ¹ýÀÇ ¼ö¸¦ »ý°¢Çغ¸ÀÚ. ¿©¼¸°¡Áö °¡´ÉÇÑ ¹è¿­Àº ´ÙÀ½°ú °°´Ù :

ºñ·Ï ÀÌ°ÍÀÌ A, B, C ¸¦ ¹è¿­ÇÒ ¼ö ÀÖ´Â ¸ðµç ¹æ¹ýÀ̶ó´Â °ÍÀ» Áõ¸íÇÒ ¼ö ÀÖ´ÙÇÏ´õ¶óµµ, »ç¹°ÀÌ °áÇյǰųª ¹è¿­µÇ°Å³ª ¶Ç´Â ¼ø¿­·Î µÉ ¼ö ÀÖ´Â ¹æ¹ýÀÇ ¿¬±¸ÀÎ, ¼ø¿­ (combinatorics) À̶ó°í ÇÏ´Â ¼öÇÐÀ¸·ÎºÎÅÍ Á¤¸®¸¦ »ç¿ëÇÏ¿© °°Àº ¼ö¸¦ À̲ø¾î ³¾ ¼ö ÀÖ´Ù. ±× Á¤¸®´Â N °³ÀÇ ´ë»ó¹°ÀÌ ¼ø¿­µÉ¼ö ÀÖ´Â ¹æ¹ýÀÇ ¼ö´Â N! (N factorial) °ú °°´Ù´Â °ÍÀÌ´Ù. ÇÑ ¼ýÀÚÀÇ factorial Àº 1ºÎÅÍ Àڽź¸´Ù À۰ųª °°Àº ¸ðµç Á¤¼öµéÀÇ °öÀÌ´Ù. ±×·¯¹Ç·Î 3! Àº 3 * 2 * 1 ¶Ç´Â 6 ÀÌ´Ù. ÀÌ Á¤º¸°¡ ÁÖ¾îÁ® ÀÖÀ» ¶§, ¹è¿­ÇÒ 4 °³ÀÇ ´ë»ó¹°À» °¡Á³´Ù¸é 4! ¶Ç´Â 24 °³ÀÇ ¼ø¿­ÀÌ ÀÖ´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. 5 °³ÀÇ ´ë»ó¹°¿¡ ´ëÇؼ­, ±× ¼ýÀÚ´Â 120 ÀÌ´Ù. 6 °³ÀÇ ´ë»ó¹°¿¡ ´ëÇؼ­´Â 720 ÀÌ´Ù. ¸»ÇÏÀÚ¸é 1000 °³ÀÇ ´ë»ó¹°¿¡ ´ëÇؼ­ °¡´ÉÇÑ ¼ø¿­ÀÇ ¼ö´Â ¸Å¿ì Å©´Ù!  ±×¸² 2 ´Â AI ¿¬±¸°¡µéÀÌ ÈçÈ÷ Á¶ÇÕÀû Áõ°¡ (combinatoric explosion) À̶ó°í ºÎ¸£´Â °ÍÀ» º¸¿©ÁØ´Ù. ¾à°£ÀÇ °¡´É¼ºº¸´Ù Á» ´õ ¸¹À¸¸é, ¸ðµç Á¶ÇÕµéÀº ºü¸¥ ¼Óµµ·Î, °ËÅäÇϱⰡ ºÒ°¡´ÉÇÏ°Ô µÇ°í ½ÇÁ¦·Î ³ª¿­Çϱâ Á¶Â÷ ºÒ°¡´ÉÇØ Áø´Ù.

±×¸² 2  factorial ·Î Æø¹ßÀûÀ¸·Î Áõ°¡ÇÏ´Â ±×·¡ÇÁ

Á¶ÇÕÀû Áõ°¡ °³³äÀ» ¹®Á¦ÇØ°á¿¡ °ü·Ã ÁöÀ» ¶§, Ž»ö°ø°£¿¡ ´õÇØÁö´Â ºÎ°¡ÀûÀÎ ³ëµå °¢°¢Àº 1 º¸´Ù ÈξÀ ´õ Å« ¼ö ¸¸Å­, °¡´ÉÇÑ ÇØÀÇ ¼ö¸¦ Áõ°¡½ÃŲ´Ù. ±×·¯¹Ç·Î, ¾î¶² ÁöÁ¡¿¡¼­, ³Ê¹« ¸¹Àº °¡´É¼ºÀÌ Àֱ⠶§¹®¿¡ °è¼ÓÇÒ ¼ö ¾ø°Ô µÉ °ÍÀÌ´Ù. °¡´É¼ºÀÇ ¼ö´Â ¾ÆÁÖ »¡¸® Ä¿Áö±â ¶§¹®¿¡ °¡Àå °£´ÜÇÑ ¹®Á¦Á¶Â÷µµ ¼Ò¸ðÀû Ž»ö (exhaustive search) ÇÏ°Ô ÇÑ´Ù (¼Ò¸ðÀû Ž»öÀº ¸ðµç ³ëµå¸¦ °Ë»çÇÑ´Ù). ¼Ò¸ðÀû, ¶Ç´Â °­Á¦Àû (brute force) ±â¹ýÀº À̷лó Ç×»ó ÀÛµ¿ÇÏÁö¸¸, ³Ê¹« ¸¹Àº ½Ã°£, ³Ê¹« ¸¹Àº °è»ê ÀÚ¿ø, ¶Ç´Â µÑ ´Ù¸¦ ¼Ò¸ðÇϱ⠶§¹®¿¡ ºñ½Ç¿ëÀûÀÌ´Ù. ÀÌ ÀÌÀ¯ ¶§¹®¿¡ ´Ù¸¥ Ž»ö ±â¹ýµéÀÌ °³¹ßµÇ¾ú´Ù.

3. Ž»ö ±â¹ý (SEARCH TECHNIQUES)

°¡´ÉÇÑ Çظ¦ ã±â À§ÇÑ ¿©·¯ °¡Áö ±â¹ýµéÀÌ ÀÖ´Ù. ´ÙÀ½¿¡ ÀÖ´Â °ÍµéÀÌ °¡Àå Áß¿äÇÏ°í °¡Àå ÈçÇÏ´Ù ;

ÀÌ Àå¿¡¼­´Â °¢ ±â¹ýÀ» Â÷·Ê·Î »ìÆ캻´Ù.

4. Ž»ö Æò°¡ (EVALUATION A SEARCH)

Ž»ö ±â¹ýÀÇ ¼º´ÉÀ» Æò°¡ÇÏ´Â °ÍÀº ¸Å¿ì º¹ÀâÇÒ ¼ö ÀÖ´Ù. »ç½Ç»ó, ÀÌ Æò°¡´Â AI ¿¬±¸ÀÇ Å« ºÎºÐÀ» Â÷ÁöÇÑ´Ù. ±×·¯³ª ¿©±â¼­ÀÇ Åä·ÐÀ» À§ÇÏ¿©, Áß¿äÇÑ µÎ °¡Áö ±âº» ÃøÁ¤¹ýÀÌ ÀÖ´Ù.

Áß¿äÇÑ °ÍÀº ÃÖ¼ÒÀÇ ³ë·ÂÀ¸·Î ¹®Á¦¿¡ ´ëÇÑ ÇØ - ¾î¶² ÇØ¶óµµ - ¸¦ ã´Â, ¿©·¯ °¡Áö À¯ÇüÀÇ ¹®Á¦µéÀÌ ÀÖ´Ù. ÀÌ·± À¯ÇüÀÇ ¹®Á¦µé¿¡ ´ëÇÏ¿© ù ¹ø° ÃøÁ¤¹ýÀÌ Áß¿äÇÏ´Ù. ±×·¯³ª, ´Ù¸¥ »óȲ¿¡¼­, Áß¿äÇÑ °ÍÀº ±× ÇØ°¡ ÃÖÀûÀÇ ÇØ¿¡ ¾ó¸¶³ª °¡±î¿î°¡ ÇÏ´Â °ÍÀÌ´Ù.

ÇØÀÇ °æ·Î ±æÀÌ¿Í ¹æ¹®µÈ ³ëµåÀÇ ½ÇÁ¦ °¹¼ö°¡ Ž»ö ¼Óµµ¸¦ °áÁ¤ÇÑ´Ù. ¸·´Ù¸¥ °÷À¸·ÎºÎÅÍÀÇ ¹éÆ®·¡Å· (backtracking) Àº ±âº»ÀûÀ¸·Î ³ë·ÂÀÌ ³¶ºñµÊÀ» ±â¾ïÇØ¾ß ÇÑ´Ù. µû¶ó¼­ ¿ä±¸µÇ´Â °ÍÀº °¡´ÉÇÑ ÇÑ °ÅÀÇ ¹éÆ®·¢ÇÏÁö ¾Ê´Â Ž»öÀÌ´Ù.

ÃÖÀûÀÇ Çظ¦ ¹ß°ßÇÏ´Â °Í°ú ÁÁÀº Çظ¦ ¹ß°ßÇÏ´Â °Í »çÀÌÀÇ Â÷À̸¦ ÀÌÇØÇÏ´Â °ÍÀº Áß¿äÇÏ´Ù. ÃÖÀûÀÇ (optimal) Çظ¦ ¹ß°ßÇÏ´Â °ÍÀÌ ÁÁÀº (good) ÇØ°¡ ¹ß°ßµÇ¾ú´ÂÁö ¾Æ´ÑÁö¸¦ °áÁ¤ÇÏ´Â À¯ÀÏÇÑ ¹æ¹ýÀϼö Àֱ⠶§¹®¿¡ Á¾Á¾ ¼Ò¸ðÀû Ž»öÀ» ¼ö¹ÝÇÑ´Ù´Â »ç½Ç¿¡ Â÷ÀÌ°¡ ÀÖ´Ù. ±×·± ÁÁÀº Çظ¦ ¹ß°ßÇÏ´Â °ÍÀº ´õ ³ªÀº ÇØ°¡ Á¸ÀçÇÏµç ¾ÈÇÏµç »ó°ü¾øÀÌ ÀÏ´ÜÀÇ Á¦¾àÁ¶°Ç ¾È¿¡ ÀÖ´Â °ÍÀ» ¹ß°ßÇÏ´Â °ÍÀ» ÀǹÌÇÑ´Ù.

ÀÌ Àå¿¡¼­ ¼³¸íµÈ ¸ðµç Ž»ö ±â¹ýµéÀº ¾î¶² ƯÁ¤ »óȲ¿¡¼­ ´Ù¸¥ °Íµé º¸´Ù ´õ Àß ÀÛµ¿ÇÒ °ÍÀÌ´Ù. ±×·¯¹Ç·Î, ¾î´Â Á¤µµ·Î ÇÑ °¡Áö Ž»ö ¹æ¹ýÀÌ ´Ù¸¥ °Íº¸´Ù Ç×»ó (always) ¿ì¼öÇÒ °ÍÀÎÁö ¾Æ´ÑÁö ¸»ÇÏ´Â °ÍÀº ¾î·Æ´Ù. ±×·± ¸î°¡Áö Ž»ö ±â¹ýµéÀº Æò±ÕÀûÀ¸·Î ´õ ³´´Ù´Â È®·üÀÌ ´õ Ŭ °ÍÀÌ´Ù. ¶ÇÇÑ, ¹®Á¦°¡ Á¤ÀǵǴ ¹æ¹ýÀº ¶§¶§·Î ÁÁÀº Ž»ö ¹æ¹ýÀ» ¼±ÅÃÇÏ´Â µ¥¿¡ µµ¿òÀ» ÁÙ °ÍÀÌ´Ù.

¿©·¯ °¡Áö Ž»ö ±â¹ýÀ» Á¶»çÇϱâ Àü¿¡, ±×°ÍÀ» ÇØ°áÇϱâ À§ÇÏ¿© ¿©·¯ °¡Áö Ž»öÀ» »ç¿ëÇÒ ¹®Á¦°¡ ´ÙÀ½¿¡ ÀÖ´Ù. ¿©Çà»ç Á÷¿øÀÌ°í ´Ù¼Ò ¼º°¡½Å °í°´ÀÌ ´º¿å¿¡¼­ ·Î½º¾ØÁ©¸®½ºÇà XYZ ±â¸¦ ¿¹¾àÇϱ⸦ ¿øÇÑ´Ù°í »ý°¢Çغ¸ÀÚ. ºñ·Ï XYZ ´Â ´º¿å¿¡¼­ ·Î½º¾ØÁ©¸®½º·Î Á÷Á¢ ¿îÇ×ÇÏ´Â ºñÇà±â°¡ ¾ø´Ù°í °í°´¿¡°Ô ¸»ÇÑ´Ù°í Çصµ, °í°´Àº XYZ ±â¸¸ Å» °ÍÀ» ÁÖÀåÇÑ´Ù. XYZ ÀÇ ¿¹Á¤µÈ ºñÇà±â¸¦ º¸¸é ´ÙÀ½À» ¹ß°ßÇÑ´Ù.

shape_united_states.gif

±×¸² 3   XYZ ºñÇà ½ºÄÉÁìÀÇ ¹æÇâÀÖ´Â ±×·¡ÇÁ

¿¬°á ºñÇà±â¸¦ ÀÌ¿ëÇϸé XYZ ·Î ´º¿å¿¡¼­ ·Î½º¾ØÁ©¸®½º±îÁö ±æÀÌ ÀÖÀ½À» »¡¸® ¾Ë ¼ö ÀÖ´Ù. µû¶ó¼­, °í°´¿¡°Ô ºñÇà±â¸¦ ¿¹¾àÇØÁØ´Ù. ±×·¯³ª, ÀÏÀº ÈξÀ ³ªÀº ¹æ¹ýÀ¸·Î °°Àº ÀÏÀ» ÇÏ´Â C ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ´Â °ÍÀÌ´Ù.

(1) ±×·¡ÇÁ Ç¥Çö (A Graphic Representation)

XYZ ÀÇ ¿¹Á¤ ¸íºÎ¿¡ ÀÖ´Â ºñÇà±â Á¤º¸´Â ±×¸² 3 ¿¡ ÀÖ´Â ¹æÇ⼺ ±×·¡ÇÁ·Î º¯ÇüµÉ ¼ö ÀÖ´Ù. ¹æÇ⼺ ±×·¡ÇÁ´Â ´Ü¼øÈ÷ °¢ ³ëµå¸¦ ¿¬°áÇÏ´Â ¼±µéÀÇ ¿òÁ÷ÀÓÀÇ ¹æÇâÀ» ³ªÅ¸³»´Â È­»ìÇ¥¸¦ °®´Â ±×·¡ÇÁÀÌ´Ù. ¹æÇ⼺ ±×·¡ÇÁ¿¡¼­, °¢ È­»ìǥȭ ¹Ý´ë ¹æÇâÀ¸·Î ¿©ÇàÇÏ´Â °ÍÀº ºÒ°¡´ÉÇÏ´Ù.

±×¸² 4  XYZ ºñÇà ½ºÄÉÁì Æ®¸®

±×·¯³ª ±×¸² 4 ¿¡ ÀÖ´Â °Íó·³ ±×·¡ÇÁ¸¦ Æ®¸®·Î ´Ù½Ã ±×¸®¸é ºñÇà±â Á¤º¸´Â ÀÌÇØÇϱⰡ ´õ ½±´Ù. ÀÌ ÀåÀÇ ³ª¸ÓÁö¿¡¼­´Â ÀÌ ¹öÀü (version) À» ÂüÁ¶ÇÑ´Ù. ±×¸² 4 ¿¡¼­ ¸ñÇ¥ ·Î½º¾ØÁ©¸®½º´Â ¿øÀ¸·Î Ç¥½ÃµÇ¾î ÀÖ°í, ¿©·¯ µµ½ÃµéÀº ±× ±¸¼ºÀ» °£´ÜÈ÷ Çϱâ À§ÇÏ¿© Æ®¸®¿¡ Çѹø ÀÌ»ó ³ªÅ¸³Â´Ù. ÀÌÁ¦ ´º¿å¿¡¼­ ·Î½º¾ØÁ©¸®½º±îÁö °æ·Î¸¦ ãÀ» ¿©·¯ °¡Áö Ž»ö ÇÁ·Î±×·¥À» °³¹ßÇÒ Áغñ°¡ µÇ¾îÀÖ´Ù.

5. ±íÀÌ¿ì¼± Ž»ö±â¹ý (THE DEPTH-FIRST SEARCH TECHNIQUE)

±íÀÌ¿ì¼± Ž»ö (depth-first search) Àº ´Ù¸¥ °æ·Î¸¦ ½ÃµµÇϱâ Àü¿¡ °á·Ð (¶Ç´Â ¸ñÇ¥) ±îÁö °¢ °¡´ÉÇÑ °æ·Î¸¦ ã´Â´Ù. ÀÌ Å½»öÀÌ ¾î¶»°Ô µ¿ÀÛÇÏ´ÂÁö Á¤È®È÷ ÀÌÇØÇϱâ À§ÇÏ¿© F °¡ ¸ñÇ¥ÀÎ ´ÙÀ½ Æ®¸®¸¦ »ý°¢Çغ¸ÀÚ :

±íÀÌ¿ì¼± Ž»öÀº ÀÌ ±×·¡ÇÁ¸¦ ABDBEBACF ¼øÀ¸·Î ¹æ¹®ÇÒ °ÍÀÌ´Ù. ¸¸¾à Æ®¸®¿¡ Àͼ÷ÇÏ´Ù¸é, ÀÌ·± À¯ÇüÀÇ Å½»öÀ» Æ®¸®ÀÇ ÁßÀÌ ¼øȸ (inorder tree traversal) ¿Í ±âº»ÀûÀ¸·Î °°´Ù´Â °ÍÀ» ¾Ë °ÍÀÌ´Ù. ÀÌ·± À¯ÇüÀÇ ¼øȸ¿¡¼­, Á¾´Ü³ëµå³ª ¸ñÇ¥¿¡ µµ´ÞÇÒ ¶§ ±îÁö ¿ÞÂÊÀ¸·Î °£´Ù. Á¾´Ü ³ëµå¿¡ µµÂøÇϸé ÇÑ ¼öÁØ µÇµ¹¾Æ °¡°í ¿À¸¥ÂÊÀ¸·Î °¡¼­ ¸ñÇ¥³ª Á¾´Ü³ëµå¸¦ ¸¸³¯ ¶§ ±îÁö ¿ÞÂÊÀ» °£´Ù. ¸ñÇ¥¸¦ ¹ß°ßÇϰųª Ž»ö °ø°£ÀÇ ¸¶Áö¸· ³ëµå¸¦ Á¶»çÇÒ ¶§±îÁö ¹Ýº¹ÇÑ´Ù. ±íÀÌ¿ì¼± Ž»öÀº ÃÖ¾ÇÀÇ °æ¿ì¿¡, G °¡ ¸ñÇ¥ÀÏ °æ¿ì¿¡ ÇØ´çµÉ, ¼Ò¸ðÀû Ž»öÀ¸·Î Åðº¸Çϱ⠶§¹®¿¡, ¹Ýµå½Ã ¸ñÇ¥¸¦ ã´Â´Ù.

´º¿å¿¡¼­ ·Î½º¾ØÁ©¸®½º±îÁöÀÇ °æ·Î¸¦ °áÁ¤ÇÏ´Â C ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ·Á¸é XYZ ºñÇà±â¿¡ ´ëÇÑ Á¤º¸¸¦ Æ÷ÇÔÇÏ´Â µ¥ÀÌÅͺ£À̽º¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù. µ¥ÀÌÅͺ£À̽ºÀÇ ¿£Æ®¸®´Â Ãâ¹ßµµ½Ã¿Í µµÂøµµ½Ã, ±× »çÀÌÀÇ °Å¸®, ±×¸®°í ¹éÆ®·¡Å·¿¡ µµ¿òÀ» ÁÙ Ç÷¡±×¸¦ Æ÷ÇÔÇÒ °ÍÀÌ°í À̸¦ °£´ÜÈ÷ »ìÆ캻´Ù. Á¤º¸¸¦ À¯ÁöÇÒ ±¸Á¶°¡ ´ÙÀ½¿¡ ÀÖ´Ù.

    #define MAX 100

    /* structure of the flight database (db) */

    struct FL {

      char from[20];

      char to[20];

      int distance;

      char skip;     /* used in backtracking */

    };

    struct FL flight[MAX];     /* array of db structures */

    int f_pos=0;         /* number of entries in flight db */

    int find_pos=0;     /* index for searching flight db */

¿£Æ®¸®µéÀº flight µ¥ÀÌÅͺ£À̽º¿¡ assert_flight() À» ÀÌ¿ëÇÏ¿© ³õ¿©Áø´Ù. ±×¸®°í setup() Àº Á¤º¸¸¦ ÃʱâÈ­Çϱâ À§ÇÏ¿© »ç¿ëµÈ´Ù. Àü¿ªº¯¼ö f_pos ´Â µ¥ÀÌÅͺ£À̽º¿¡¼­ ¸¶Áö¸· Ç׸ñÀÇ À妽º¸¦ À¯ÁöÇÑ´Ù. ÀÌ ·çƾµéÀÌ ´ÙÀ½¿¡ ÀÖ´Ù.

    setup()

    {

      assert_flight("New York", "Chicago", 1000);

      assert_flight("Chicago", "Denver", 1000);

      assert_flight("New York", "Toronto", 800);

      assert_flight("New York", "Denver", 1900);

      assert_flight("Toronto", "Calgary", 1500);

      assert_flight("Toronto", "Los Angeles", 1800);

      assert_flight("Toronto", "Chicago", 500);

      assert_flight("Denver", "Urbana", 1000);

      assert_flight("Denver", "Houston", 1500);

      assert_flight("Houston", "Los Angeles", 1500);

      assert_flight("Denver", "Los Angeles", 1000);

    }

    /* place facts into flight db */

    assert_flight(from, to. dist)

    char *from, *to;

    int dist;

    {

      if (f_pos<MAX) {

        strcpy(flight[f_pos].from, from);

        strcpy(flight[f_pos].to, to);

        flight[f_pos].distance=dist;

        flight[f_pos].skip=0;

        f_pos++;

      }

      else printf("flight database full. ¡¬n");

    }

AI °³³ä°ú ÀÏÄ¡Çϱâ À§Çؼ­ µ¥ÀÌÅͺ£À̽º¸¦ »ç½Ç (facts) À» Æ÷ÇÔÇÏ´Â °ÍÀ¸·Î »ý°¢ÇØ¾ß ÇÑ´Ù. ÀÌ Àý¿¡¼­ °³¹ßÇÒ ÇÁ·Î±×·¥Àº ÇØ¿¡ µµ´ÞÇϱâ À§ÇÏ¿© ÀÌ »ç½ÇµéÀ» »ç¿ëÇÒ °ÍÀÌ´Ù. µ¥ÀÌÅͺ£À̽º°¡ »ç½ÇÀ» Æ÷ÇÔÇϱ⠶§¹®¿¡, ¸¹Àº AI ¿¬±¸°¡µéÀº µ¥ÀÌÅͺ£À̽ºÀ» Áö½Äº£À̽º (knowledge base) ¶ó ÀÏÄ´´٠; ÀÌ Ã¥Àº µÎ ¿ë¾î¸¦ È¥¿ëÇؼ­ »ç¿ëÇÑ´Ù.

´º¿å°ú ·Î½º¾ØÁ©¸®½º »çÀÌÀÇ °æ·Î¸¦ ã±â À§ÇÏ¿© ½ÇÁ¦ Äڵ带 ÀÛ¼ºÇϱâ Àü¿¡, ¿©·¯°³ÀÇ Áö¿ø ÇÔ¼ö¸¦ ÇÊ¿ä·Î ÇÑ´Ù. ¿ì¼±, µÎ µµ½Ã »çÀÌ¿¡ ºñÇà±â°¡ ÀÖ´ÂÁö °áÁ¤ÇÒ ¼ö ÀÖ´Â ·çƾÀÌ ÇÊ¿äÇÏ´Ù. ÀÌ ÇÔ¼ö¸¦ match() ¶ó ºÎ¸¥´Ù ; ±×·± ºñÇà±â°¡ ¾øÀ¸¸é 0 À» ¸®ÅÏÇÏ°í, ÀÖÀ¸¸é µÎ µµ½Ã »çÀÌÀÇ °Å¸®¸¦ ¸®ÅÏÇÑ´Ù.

    /* if connection between from and to, then return the distance fo flight ; if not, return 0 */

    match(from, to)

    char *from, *to;

    {

      register int t;

      for (t=f_pos-1; t>-1; t--)

        if (!strcmp(flight[t].from, from) && !strcmp(flight[t].to, to))

          return flight[t].distance;

        return 0;    /* not found */

    }

ÇÊ¿äÇÑ ´ÙÀ½ ·çƾÀº find() ÀÌ´Ù. ÇÑ µµ½Ã°¡ ÁÖ¾îÁ³À» ¶§, find() ´Â µ¥ÀÌÅͺ£À̽º¿¡¼­ ¿¬°á ºñÇà±â¸¦ ã´Â´Ù. find() °¡ ¿¬°á ºñÇà±â¸¦ ¹ß°ßÇÏ¸é µµÂø µµ½ÃÀÇ À̸§°ú °Å¸®¸¦ ¸®ÅÏÇÑ´Ù. ¸¸¾à ¹ß°ßÇÏÁö ¸øÇϸé 0 À» ¸®ÅÏÇÑ´Ù. find() ·çƾÀÌ ´ÙÀ½¿¡ ÀÖ´Ù ;

    /* given from, find anywhere */

    find(from, anywhere)

    char *from, *anywhere;

    {

      find_pos=0;

      while (find_pos<f_pos) {

        if (!strcmp(flight[find_pos].from, from) && !flight[find_pos].skip) {

          strcpy(anywhere, flight[find_pos].to);

          flight[find_pos].skip=1;     /* make active */

          return flight[find_pos].distance;

        }

        find_pos++;

      }

      return 0;

    }

find() ¸¦ Á¶»çÇغ¸¸é skip Çʵ带 1 ·Î ÁöÁ¤ÇÑ µµ½ÃµéÀº À¯È¿ÇÑ ¿¬°è°¡ ¾Æ´Ï¶ó´Â °ÍÀ» ¾È´Ù. ¶ÇÇÑ find() °¡ ¿¬°á ºñÇà±â¸¦ ãÀ¸¸é, ¿¬°áÀÇ skip Çʵ带 active ·Î Ç¥½ÃÇÑ´Ù. ÀÌ ´Ü°è´Â ¸·´Ù¸¥ °÷À¸·ÎºÎÅÍ ¹éÆ®·¡Å·À» Á¦¾îÇϱâ À§ÇÏ¿© »ç¿ëµÈ´Ù.

Á¦ 1 Àå¿¡¼­ ¾ð±ÞÇßµíÀÌ, ¹éÆ®·¡Å·Àº ¸¹Àº AI ±â¹ý¿¡¼­ °áÁ¤ÀûÀÎ ¼ººÐÀÌ´Ù. µÇºÎ¸§ ·çƾ°ú ¹éÆ®·¢ ½ºÅÃÀ» »ç¿ëÇÏ¿© ¹éÆ®·¡Å·À» ¸¸µé ¼ö ÀÖ´Ù. °¡»óÀûÀ¸·Î ¸ðµç ¹éÆ®·¡Å· »óȲÀº ¿¬»ê¿¡¼­ ½ºÅðú À¯»çÇÏ´Ù - Áï, ±× »óȲµéÀº ¸ÕÀú µé¾î°£ °ÍÀÌ ³ªÁß¿¡ ³ª¿Â´Ù. ±×·¯¹Ç·Î, Ž»öÀÌ °æ·Î¸¦ ã¾Æ°¥ ¶§, ³ëµå¸¦ ¸¸³ª¸é ±× ³ëµåµéÀ» ½ºÅÿ¡ ³Ö´Â´Ù. °¢ ¸·´Ù¸¥ °÷¿¡¼­, Ž»öÀº ½ºÅÿ¡¼­ ¸¶Áö¸· ³ëµå¸¦ ²¨³»°í ±× Á¡¿¡¼­ºÎÅÍ »õ·Î¿î °æ·Î¸¦ ½ÃµµÇÑ´Ù. ÀÌ °úÁ¤Àº Ž»öÀÌ ¸ñÇ¥¿¡ µµ´ÞÇϰųª ¸ðµç °æ·Î¸¦ ´Ù °ÅÄ¥ ¶§ ±îÁö °è¼ÓµÈ´Ù. ÇÔ¼ö push() ¿Í pop() ÀÌ ´ÙÀ½¿¡ ÀÖ´Ù. ±× ÇÔ¼öµéÀº top-of-stack Æ÷ÀÎÅÍ ½ºÅà ¹è¿­À» ÀúÀåÇϱâ À§ÇÏ¿© °¢°¢ Àü¿ªº¯¼ö tos ¿Í bt_stack À» »ç¿ëÇÑ´Ù.

    /* stack routines */

    push(from, to, dist)

    char *from, *to;

    int dist;

    {

      if (tos<MAX) {

        strcpy(bt_stack[tos].from, from);

        strcpy(bt_stack[tos].to, to);

        bt_stack[tos].dist=dist;

        tos++;

      }

      else printf("stack full. ¡¬n");

    }

    pop(from, to, dist)

    char *from, *to;

    int *dist;

    {

      if (tos>0) {

        tos--;

        strcpy(from, bt_stack[tos].from);

        strcpy(to, bt_stack[tos].to);

        *dist=bt_stack[tos].dist;

      }

      else printf("stack underflow. ¡¬n");

    }

¿ä±¸µÈ Áö¿ø ·çƾµéÀÌ ¸ðµÎ °³¹ßµÇ¾úÀ¸¹Ç·Î, isflight() ¶ó°í ÇÏ´Â ÁÖ¿ä ·çƾÀ» ´ÙÀ½¿¡ Á¦½ÃÇÑ´Ù. ÀÌ ·çƾÀº ´º¿å°ú ·Î½º¾ØÁ©¸®½º »çÀÌÀÇ °æ·Î¸¦ ãÀ» ¼ö ÀÖ°Ô ÇØÁØ´Ù.

    /* determine if there is a route between from and to */

    isflight(from, to)

    char *from, *to;

    {

      int d, dist;

      char anywhere[20];

      /* see if destination is reached */

      if (d=match(from, to)) {

        push(from, to, d);

        return;

      }

      /* try another connection */

      if (dist=find(from, anywhere)) {

        push(from, to, dist);

        isflight(anywhere, to);

      }

      else if (tos>0) {

        /* backtrack */

        pop(from, to, &dist);

        isflight(from, to);

      }

    }

isflight() ·çƾÀÌ ´ÙÀ½°ú °°ÀÌ ÀÛµ¿µÈ´Ù : ¸ÕÀú, match() ´Â from °ú to »çÀÌ¿¡ ºñÇà±â°¡ ÀÖ´ÂÁö¸¦ ¾Ë±â À§Çؼ­ µ¥ÀÌÅͺ£À̽º¸¦ üũÇÑ´Ù. ¸¸¾à ÀÖÀ¸¸é, ±× ·çƾÀº ¸ñÇ¥¿¡ µµ´ÞÇß´Ù ; ±×·¯¸é ·çƾÀº ÀÌ ¿¬°áÀ» ½ºÅÿ¡ ³Ö°í ÇÔ¼ö´Â ¸®ÅϵȴÙ. ºñÇà±â°¡ ¾øÀ¸¸é, find() ´Â from ÀÌ ±× ¹ÛÀÇ ´Ù¸¥ °÷ »çÀÌÀÇ ¿¬°áÀÌ ÀÖ´ÂÁö º¸±â À§ÇÏ¿© üũÇÑ´Ù. ¸¸¾à ÀÖÀ¸¸é, ·çƾÀº ÀÌ ¿¬°áÀ» ½ºÅÿ¡ ³Ö°í isflight() ¸¦ µÇºÎ¸§ ¹æ½ÄÀ¸·Î È£ÃâÇÑ´Ù. ¿¬°á ºñÇà±â°¡ ¾øÀ¸¸é, ¹éÆ®·¡Å·ÀÌ ¹ß»ýÇÑ´Ù. ·çƾÀº ½ºÅÃÀ¸·ÎºÎÅÍ ¾Õ ³ëµå¸¦ Á¦°ÅÇÏ°í isflight() ¸¦ µÇºÎ¸§ ¹æ½ÄÀ¸·Î È£ÃâÇÑ´Ù. ÀÌ °úÁ¤Àº ·çƾÀÌ ¸ñÇ¥¸¦ ¹ß°ßÇÒ ¶§±îÁö °è¼ÓÇÑ´Ù. skip Çʵå´Â ·çƾÀ¸·Î ÇÏ¿©±Ý °°Àº ¿¬°áÀ» ¿©·¯¹ø ¹Ýº¹Çؼ­ ½ÃµµÇÏ´Â °ÍÀ» ¸·±â À§ÇÑ ¹éÆ®·¡Å·¿¡ ÇÊ¿äÇÏ´Ù.

±× ·çƾÀÌ µ§¹ö¿Í ÈÞ½ºÅæÀ» °®°í È£ÃâµÇ¸é, ·çƾÀÇ Ã¹ ºÎºÐÀº ¼º°øÇÏ°í isflight() ´Â ³¡³¯ °ÍÀÌ´Ù. ±×·¯³ª, ¸¸¾à ½ÃÄ«°í¿Í ÈÞ½ºÅÏÀ» °®°í È£ÃâµÇ¸é ÀÌ µÎ µµ½Ã »çÀÌ¿¡ Á÷Çà ºñÇà±â°¡ ¾ø±â ¶§¹®¿¡ ù ºÎºÐÀº ½ÇÆÐÇÒ °ÍÀÌ´Ù ; ±×·¯¹Ç·Î, ·çƾÀº ½ÃÀÛ µµ½Ã¿Í ´Ù¸¥ µµ½Ã »çÀÌÀÇ ¿¬°á ºñÇà±â¸¦ ¹ß°ßÇÏ·Á°í ½ÃµµÇÔÀ¸·Î½á µÎ ¹ø° ºÎºÐÀ» ½ÃµµÇÑ´Ù. ÀÌ °æ¿ì¿¡, ½ÃÄ«°í¿Í µ§¹ö »çÀÌ¿¡ ¿¬°á ºñÇà±â°¡ ÀÖ´Ù ; ±×·¯¹Ç·Î, ±×¸®°í³ª¼­ ·çƾÀº µ§¹ö¿Í ÈÞ½ºÅæÀ» °¡Áö°í isflight() ¸¦ µÇºÎ¸§ ¹æ½ÄÀ¸·Î È£ÃâÇÑ´Ù. ·çƾÀº ´Ù½Ã ù ¹ø° Á¶°ÇÀ» Å×½ºÆ®ÇÏÁö¸¸ À̹ø¿¡´Â ¿¬°áÀ» ¹ß°ßÇÑ´Ù. ¸¶Áö¸·À¸·Î, µÇºÎ¸§ È£ÃâÀº ¿ø·¡´ë·Î µÇµ¹¾Æ¿À°í isflight() ´Â ³¡³­´Ù. isflight() °¡ Áö½Ä º£À̽ºÀÇ ±íÀÌ¿ì¼± Ž»öÀ» ¼öÇàÇÒ °ÍÀ̶ó´Â °ÍÀ» ½º½º·Î Áõ¸íÇغ¸ÀÚ.

isflight() ´Â ½ÇÁ¦·Î Çظ¦ ¸®ÅÏÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó´Â °ÍÀ» ÀÌÇØÇÏ´Â °ÍÀÌ Áß¿äÇÏ´Ù. Çظ¦ »ý¼ºÇÏ´Â °ÍÀÌ´Ù. ¿äÁ¡Àº isflight() ¿¡¼­ ºüÁ®³ª°¥ ¶§ ¹éÆ®·¢ ½ºÅÃÀº ½ÃÄ«°í¿Í ÈÞ½ºÅæ »çÀÌÀÇ °æ·Î¸¦ Æ÷ÇÔÇÑ´Ù´Â (the backtrack stack contains the route Chicago and Houston) °ÍÀÌ´Ù. ½ºÅÃÀÇ »óÅ´ isflight() ÀÇ ¼º°ø ¶Ç´Â ½ÇÆи¦ ³ªÅ¸³½´Ù. ±×·¯¹Ç·Î Àüü ÇÁ·Î±×·¥À» ¿Ï¼ºÇÏ´Â µ¥¿¡ ¿ä±¸µÇ´Â ÃÖÁ¾ ÇÔ¼ö´Â route() ¶ó°í ºÒ¸°´Ù. µû¶ó°¥ °æ·Î¿Í ÃÑ °Å¸®¸¦ ÇÁ¸°Æ®ÇÑ´Ù.

    /* show the route and distance */

    route(to)

    char *to;

    {

      int dist, t;

      dist=0;

      t=0;

      while(t<tos) {

        printf("%s to", bt_stack[t].from);

        dist+=bt_stack[t].dist;

        t++;

      }

      printf("%s ¡¬n", to);

      printf("distance is %d¡¬n", dist);

    }

±íÀÌ¿ì¼± Ž»ö ÇÁ·Î±×·¥ Àüü°¡ ´ÙÀ½¿¡ ÀÖ´Ù.

    /* depth-first search */

    #include "stdio.h"

    #define MAX 100

    /* structure of the flight database (db) */

    struct FL {

      char from[20];

      char to[20];

      int distance;

      char skip;     /* used in backtracking */

    };

    struct FL flight[MAX];     /* array of db structures */

    int f_pos=0;         /* number of entries in flight db */

    int find_pos=0;     /* index for searching flight db */

     

    int tos=0;            /* top of stack */

    struct stack {

      char from[20];

      char to[20];

      int dist;

    };

    struct stack bt_stack[MAX];       /* backtrack stack */

     

    main()

    {

      char from[20], to[20];

      setup();

      printf("from ? ");

      gets(from);

      printf("to ? ");

      gets(to);

      isflight(from, to);

      route(to);

    }

     

    setup()

    {

      assert_flight("New York", "Chicago", 1000);

      assert_flight("Chicago", "Denver", 1000);

      assert_flight("New York", "Toronto", 800);

      assert_flight("New York", "Denver", 1900);

      assert_flight("Toronto", "Calgary", 1500);

      assert_flight("Toronto", "Los Angeles", 1800);

      assert_flight("Toronto", "Chicago", 500);

      assert_flight("Denver", "Urbana", 1000);

      assert_flight("Denver", "Houston", 1500);

      assert_flight("Houston", "Los Angeles", 1500);

      assert_flight("Denver", "Los Angeles", 1000);

    }

    /* place facts into flight db */

    assert_flight(from, to. dist)

    char *from, *to;

    int dist;

    {

      if (f_pos<MAX) {

        strcpy(flight[f_pos].from, from);

        strcpy(flight[f_pos].to, to);

        flight[f_pos].distance=dist;

        flight[f_pos].skip=0;

        f_pos++;

      }

      else printf("flight database full. ¡¬n");

    }

     

    /* show the route and distance */

    route(to)

    char *to;

    {

      int dist, t;

      dist=0;

      t=0;

      while(t<tos) {

        printf("%s to", bt_stack[t].from);

        dist+=bt_stack[t].dist;

        t++;

      }

      printf("%s ¡¬n", to);

      printf("distance is %d¡¬n", dist);

    }

     

    /* if connection between from and to, then return the distance fo flight ; if not, return 0 */

    match(from, to)

    char *from, *to;

    {

      register int t;

      for (t=f_pos-1; t>-1; t--)

        if (!strcmp(flight[t].from, from) && !strcmp(flight[t].to, to))

          return flight[t].distance;

        return 0;    /* not found */

    }

     

    /* given from, find anywhere */

    find(from, anywhere)

    char *from, *anywhere;

    {

      find_pos=0;

      while (find_pos<f_pos) {

        if (!strcmp(flight[find_pos].from, from) && !flight[find_pos].skip) {

          strcpy(anywhere, flight[find_pos].to);

          flight[find_pos].skip=1;     /* make active */

          return flight[find_pos].distance;

        }

        find_pos++;

      }

      return 0;

    }

     

    /* determine if there is a route between from and to */

    isflight(from, to)

    char *from, *to;

    {

      int d, dist;

      char anywhere[20];

      /* see if destination is reached */

      if (d=match(from, to)) {

        push(from, to, d);

        return;

      }

      /* try another connection */

      if (dist=find(from, anywhere)) {

        push(from, to, dist);

        isflight(anywhere, to);

      }

      else if (tos>0) {

        /* backtrack */

        pop(from, to, &dist);

        isflight(from, to);

      }

    }

     

    /* stack routines */

    push(from, to, dist)

    char *from, *to;

    int dist;

    {

      if (tos<MAX) {

        strcpy(bt_stack[tos].from, from);

        strcpy(bt_stack[tos].to, to);

        bt_stack[tos].dist=dist;

        tos++;

      }

      else printf("stack full. ¡¬n");

    }

    pop(from, to, dist)

    char *from, *to;

    int *dist;

    {

      if (tos>0) {

        tos--;

        strcpy(from, bt_stack[tos].from);

        strcpy(to, bt_stack[tos].to);

        *dist=bt_stack[tos].dist;

      }

      else printf("stack underflow. ¡¬n");

    }

main() Àº Ãâ¹ßµµ½Ã¿Í µµÂøµµ½Ã¸¦ ÇÁ·ÒÇÁÆ®·Î ³»º¸³¿À» ÁÖ¸ñÇØ¾ß ÇÑ´Ù. ÀÌ°ÍÀº ¾î¶² µÎ µµ½Ã »çÀÌÀÇ °æ·Îµµ ã±â À§ÇÏ¿© ÇÁ·Î±×·¥À» »ç¿ëÇÏ°Ô ÇÑ´Ù. ±×·¯³ª, ÀÌ ÀåÀÇ ³ª¸ÓÁö¿¡¼­´Â ´º¿åÀÌ Ãâ¹ßÁöÀÌ°í ·Î½º¾ØÁ©¸®½º°¡ µµÂøÁö¶ó°í °¡Á¤ÇÑ´Ù.

ÀÌÁ¦ ÇÁ·Î±×·¥À¸·Î µé¾î°¡¼­ ÄÄÆÄÀÏÇØ¾ß ÇÑ´Ù. ¸¶ÀÌÅ©·Î¼ÒÇÁÆ® C ¹öÀü 4 ¸¦ Æ÷ÇÔÇÏ¿© ¾î¶² ÄÄÆÄÀÏ·¯¿¡ ´ëÇؼ­, ½ºÅÿ¡ ÇÒ´çµÇ´Â ¸Þ¸ð¸®ÀÇ ¾çÀ» Áõ°¡½Ãų ÇÊ¿ä°¡ ÀÖÀ» °ÍÀÌ´Ù. ¿Ö³ÄÇÏ¸é ·çƾµéÀÌ ¾î¶² Çص鿡 ´ëÇÏ¿© µÇºÎ¸§ Ư¼ºÀÌ ¾ÆÁÖ Å©±â ¶§¹®ÀÌ´Ù.

±×¸² 5  Çظ¦ ã±â À§ÇÑ ±íÀÌ¿ì¼± Ž»ö

´º¿å°ú ·Î½º¾ØÁ©¸®½º¸¦ °¡Áö°í ÇÁ·Î±×·¥À» ¼öÇàÇÒ ¶§ ÇØ´Â ´ÙÀ½°ú °°´Ù.

    New York to Chicage to Denver to Los Angeles

    distance is 3000

±×¸² 4 ¸¦ ÂüÁ¶Çϸé, ÀÌ°ÍÀÌ ±íÀÌ¿ì¼± Ž»öÀ» »ç¿ëÇÏ¿© ¹ß°ßÇÑ ÃÖÃÊÀÇ Çضó´Â °ÍÀ» ¾Ë°Ô µÉ °ÍÀÌ´Ù. ÃÖÀûÀÇ ÇØ´Â ¾Æ´ÏÁö¸¸ ³ª»ÚÁö´Â ¾Ê´Ù. ÃÖÀûÀÇ ÇØ´Â °Å¸®°¡ 2600 ¸¶ÀÏÀÎ, ´º¿å¿¡¼­ Åä·ÐÅä, ·Î½º¾ØÁ©¸®½º ±îÁöÀÌ´Ù. ±×¸² 5 ´Â Ž»ö °æ·Î¸¦ º¸¿©ÁØ´Ù.

(1) ±íÀÌ¿ì¼± Ž»ö Æò°¡Çϱâ (Evaluating the Depth-First Search)

¹æ±Ý ÁÖ¾îÁø ¿¹¿¡¼­, ±íÀÌ¿ì¼± Á¢±Ù¹æ½ÄÀº ¹éÆ®·¡Å·ÀÌ ÀüÇô ¾øÀÌ ÃÖÃÊÀÇ ½Ãµµ¿¡¼­ ¾ÆÁÖ ÁÁÀº Çظ¦ ¹ß°ßÇß´Ù - ÀÌ°ÍÀº ¾ÆÁÖ ÁÁ´Ù. ±×·¯³ª, ÃÖÀûÀÇ ÇØ¿¡ µµ´ÞÇϱâ À§ÇÏ¿© °ÅÀÇ ¸ðµç ³ëµåµéÀ» ¹æ¹®Çß¾î¾ß ÇÒ °ÍÀε¥ ÀÌ°ÍÀº ¾ÆÁÖ ÁÁÁö°¡ ¾Ê´Ù.

±×·¯³ª, ´Ü¼øÈ÷ ³¡¿¡ ÇØ°¡ ¾ø´Ù´Â °ÍÀ» ¹ß°ßÇϱâ À§ÇÏ¿© ƯÈ÷ ±ä °¡Áö¸¦ Ž»öÇØ¾ß ÇÏ´Â ±×·± »óȲ¿¡¼­ ±íÀÌ¿ì¼±Àº ¾ÆÁÖ ³ª»Ü¼ö ÀÖ´Ù´Â °ÍÀ» ¾Ë¾Æ¾ß ÇÑ´Ù. ÀÌ °æ¿ì¿¡, ÀÌ Ã¼ÀÎÀÇ Å½»ö¿¡¼­ »Ó¸¸ ¾Æ´Ï¶ó ¸ñÇ¥±îÁöÀÇ ¹éÆ®·¡Å·¿¡¼­µµ ±íÀÌ¿ì¼±Àº »ó´çÇÑ ½Ã°£À» ³¶ºñÇÒ °ÍÀÌ´Ù. ÀÌ¿Í°°Àº »óȲÀº ³Êºñ¿ì¼± Ž»öÀ» ÇÊ¿ä·Î ÇÑ´Ù.

6. ³Êºñ¿ì¼± Ž»ö±â¹ý (THE BREATH-FIRST SEARCH TECHNIQUE)

³Êºñ¿ì¼± Ž»öÀº ±íÀÌ¿ì¼± Ž»öÀÇ ¹Ý´ëÀÌ´Ù. ³Êºñ¿ì¼± Ž»öÀº ´ÙÀ½ÀÇ ´õ ±íÀº ¼öÁØÀ¸·Î ÁøÇàÇϱâ Àü¿¡ °°Àº ¼öÁØ¿¡¼­ °¢ ³ëµå¸¦ üũÇÑ´Ù. ¸ñÇ¥·Î C ¸¦ °®´Â ÀÌ Å½»ö¹æ¹ýÀÌ ´ÙÀ½¿¡ ÀÖ´Ù.

ÀÌ ¿¹´Â Ž»öÀÌ ³ëµå ABC ¸¦ ¹æ¹®ÇÔÀ» º¸ÀδÙ. ±íÀÌ¿ì¼± Ž»öó·³, ³Êºñ¿ì¼± Ž»öÀº °á±¹Àº ¼Ò¸ðÀû Ž»öÀ¸·Î Åðº¸ÇÒ °ÍÀ̱⠶§¹®¿¡ ÇØ°¡ Á¸ÀçÇÏ¸é ¹Ýµå½Ã ¹ß°ßÇÑ´Ù.

¾Õ Àý¿¡ ÁÖ¾îÁø °æ·Î ã±â ÇÁ·Î±×·¥ÀÌ ³Êºñ¿ì¼± Ž»ö¸¸ ¼öÇàÇϵµ·Ï ±×°ÍÀ» º¯°æÇÏ·Á¸é, ¾Æ·¡¿¡ ÀÖ´Â °Íó·³ isflight() ÇÁ·Î½ÃÀú¸¦ º¯ÇüÇØ¾ß ÇÑ´Ù.  

    isflight(from, to)

    char *from, *to;

    {

      int d, temp, dist;

      char anywhere[20];

      while (dist=find(from, anywhere)) {

        /* breadth-first modification */

        if (d=match(anywhere, to)) {

          push(from, to, dist);

          push(anywhere, to, d);

          return;

        }

      }

      /* try an connection */

      if (dist=find(from, anywhere)) {

        push(from, to, dist);

        isflight(anywhere, to);

      }

      else if (tos>0) {

        pop(from, to, &dist);

        isflight(from, to);

      }

    }

º¸´Â ¹Ù¿Í °°ÀÌ Ã¹ ¹ø° Á¶°Ç¸¸ÀÌ º¯°æµÇ¾ú´Ù. ÀÌÁ¦, ÇÁ·Î±×·¥Àº µµÂø µµ½Ã¿Í ¿¬°áµÇ´ÂÁö ¾Ë±â À§ÇÏ¿© Ãâ¹ßµµ½Ã¿¡ ¿¬°áµÇ´Â ¸ðµç µµ½Ã¸¦ üũÇÑ´Ù. ÀÌÁ¦ ÇÁ·Î±×·¥¿¡¼­ isflight() ÀÇ ÀÌ ¹öÀüÀ» ´ëÄ¡ÇØ¾ß ÇÑ´Ù. ÀÌ ÇÁ·Î±×·¥À» ¼öÇàÇÒ ¶§, ÇØ´Â ´ÙÀ½°ú °°´Ù. ÀÌ°ÍÀº ÃÖÀûÀÇ ÇØÀÌ´Ù.

    New York to Chicage to Denver to Los Angeles

    distance is 3000

±×¸² 6 Àº ÇرîÁöÀÇ ³Êºñ¿ì¼± Ž»ö°æ·Î¸¦ º¸¿©ÁØ´Ù.

±×¸² 6  Çظ¦ ã±â À§ÇÑ ³Êºñ¿ì¼± Ž»ö

(1) ³Êºñ¿ì¼± Ž»öÆò°¡ (Evaluating the Breadth-First Search)

¹æ±Ý ÁÖ¾îÁø ¿¹¿¡¼­, ³Êºñ¿ì¼± Ž»öÀº ¹éÆ®·¡Å· ¾øÀÌ Çظ¦ ¹ß°ßÇÔÀ¸·Î½á Àß ¼öÇàÇß´Ù. ÀÌ°ÍÀº ¶ÇÇÑ ÃÖÀûÀÇ ÇØÀÌ´Ù. »ç½Ç»ó, ¹ß°ßµÉ óÀ½ 3 °³ÀÇ ÇØ´Â °¡Àå ÁÁÀº 3 °³ÀÇ °æ·ÎÀÌ´Ù. ±×·¯³ª, ÀÌ °á°ú´Â ÄÄÇ»ÅÍ¿¡ ÀúÀåµÈ °Í°ú °°Àº, Á¤º¸ÀÇ ¹°¸®ÀûÀÎ ±¸Á¶¿¡ ÀÇÁ¸Çϱ⠶§¹®¿¡ ´Ù¸¥ »óȲ¿¡ Àû¿ëÇϱâ À§ÇÏ¿© ±×°ÍÀ» ÀϹÝÈ­½Ãų ¼ö ¾øÀ½À» ±â¾ïÇØ¾ß ÇÑ´Ù. ±×·¯³ª, ÀÌ °á°ú´Â ±íÀÌ¿ì¼±°ú ³Êºñ¿ì¼±ÀÌ ¾ó¸¶³ª ±Ùº»ÀûÀ¸·Î ´Ù¸¥Áö¸¦ ¼³¸íÇØ ÁØ´Ù.

¿©·¯ Ãþ ±íÀÌ À§Ä¡µÈ ¸ñÇ¥¸¦ ãÀ¸·Á ÇÒ ¶§ ³Êºñ¿ì¼± Ž»öÀÇ ´ÜÁ¡À» ¾Ë°Ô µÉ °ÍÀÌ´Ù. ÀÌ °æ¿ì¿¡, ³Êºñ¿ì¼±Àº ±×°ÍÀ» ã±â À§ÇÏ¿© »ó´çÇÑ ³ë·ÂÀ» µéÀδÙ. ÀϹÝÀûÀ¸·Î, ÇÁ·Î±×·¡¸Ó´Â ¸ñÇ¥°¡ °¡Àå Àֱ⠽¬¿î °÷¿¡ °üÇÏ¿© ÃßÃøÀ» ÇÔÀ¸·Î½á ±íÀÌ¿ì¼± Ž»ö°ú ³Êºñ¿ì¼± Ž»ö »çÀÌ¿¡¼­ ¼±ÅÃÇÑ´Ù.

7. ÈÞ¸®½ºÆ½ ºÎ°¡ (ADDING HEURISTICS)

Áö±Ý±îÁö ¾Æ¸¶ ±íÀÌ¿ì¼±°ú ³Êºñ¿ì¼± Ž»ö ·çƾµéÀÌ ºí¶óÀεå (blind) ¶ó°í »ý°¢ÇØ¿Ô´Ù. ±× ·çƾµéÀº "±³À°¹ÞÀº ÃßÃø" À» »ç¿ëÇÏÁö ¾Ê°í ÇÑ ¸ñÇ¥¿¡¼­ ´Ù¸¥ ¸ñÇ¥·Î À̵¿ÇÏ´Â °Í¿¡¸¸ ÀÇÁ¸ÇÏ¿© Çظ¦ ã´Â´Ù. ÀÌ °úÁ¤Àº, ÇÁ·Î±×·¡¸Ó·Î¼­ ´Ù¸¥ ¹æ¹ý¿¡ ´ëÇÏ¿© ÇÑ°¡Áö ¹æ¹ýÀ» »ç¿ëÇϵµ·Ï ¾Ë·ÁÁÖ´Â Á¤º¸¸¦ °®°í ÀÖ´Â, ±×·± Á¦ÇÑµÈ »óȲ¿¡ ´ëÇؼ­´Â ÁÁÁö¸¸, ÀϹÝÈ­µÈ AI ÇÁ·Î±×·¥ÀÌ ÇÊ¿ä·Î ÇÏ´Â °ÍÀº Æò±ÕÀûÀ¸·Î ÀÌ µÎ ±â¹ý Áß ¿ì¼öÇÑ Å½»ö ÇÁ·Î½ÃÀúÀÌ´Ù. ±×·¯ÇÑ Å½»öÀ» ÀÌ·ç´Â À¯ÀÏÇÑ ¹æ¹ýÀº °æÇè ±â´É (heuristic capabilities) À» ºÎ°¡ÇÏ´Â °ÍÀÌ´Ù.

ÈÞ¸®½ºÆ½ (Heuristic) Àº ´Ü¼øÈ÷ Ž»öÀÌ ¿Ã¹Ù¸¥ ¹æÇâÀ¸·Î ÁøÇàÇÒ °¡´É¼ºÀ» ÀûÇÕÇÏ°Ô ÇÏ´Â ±ÔÄ¢ÀÌ´Ù. À̸¦ ÀÌÇØÇϱâ À§Çؼ­, ½£¼Ó¿¡¼­ ±æÀ» ÀÒ¾ú°í ¹°ÀÌ ÇÊ¿äÇÏ´Ù°í »ý°¢Çغ¸ÀÚ. ½£ÀÌ ³Ê¹« ¿ì°ÅÁ®¼­ ³Ê¹« ¸Ö¸® º¼ ¼ö°¡ ¾ø°í ³ª¹«°¡ ³Ê¹« Ä¿¼­ µÑ·¯º¸±â À§ÇÏ¿© ¿Ã¶ó°¥ ¼öµµ ¾ø´Ù. ±×·¯³ª, ³×°¡Áö Áö½ÄÀÌ ÀÖ´Ù ; ¸ÕÀú, °­, ½Ã³» ±×¸®°í ¸øÀÌ °è°î¿¡ ÀֱⰡ °¡Àå ½±´Ù ; µÎ ¹ø°·Î, µ¿¹°µéÀÌ ºó¹øÈ÷ ¹°¸¶½Ã´Â °÷±îÁö ±æÀ» ¸¸µç´Ù ; ¼¼ ¹ø°·Î, ¹° °¡±îÀÌ ÀÖÀ» ¶§, ±×°ÍÀ» "¾Ë¾Æ³»´Â" °ÍÀÌ °¡´ÉÇÏ´Ù ; ±×¸®°í ³× ¹ø°·Î, ¹° È帣´Â ¼Ò¸®¸¦ µéÀ» ¼ö°¡ ÀÖ´Ù. µû¶ó¼­, ¹°ÀÖ´Â °÷À¸·ÎÀÇ ±æÀ» ¹ß°ßÇÒ ¶§, ¹°Àº ¾ð´ö À§¿¡ ÀÖÀ» °¡´É¼ºÀº ¾øÀ¸¹Ç·Î ¾ð´ö ¾Æ·¡·Î ¸ÕÀú ³»·Á°£´Ù. ´ÙÀ½, ¿ª½Ã ¾ð´ö ¾Æ·¡·Î ´Þ¸®´Â »ç½¿ ²¿¸®¸¦ ¿ì¿¬È÷ ¹ß°ßÇϸé, ¹° ÀÖ´Â °÷À¸·Î ÀεµÇÒ ¼öµµ Àֱ⠶§¹®¿¡ »ç½¿À» µû¶ó°£´Ù. ±×¸®°í³ª¼­ ¿ÞÂÊ¿¡¼­ ¾à°£ÀÇ ¼Ò¶õ½º·± ¼Ò¸®¸¦ µè´Â´Ù. ÀÌ°ÍÀÌ ¹°ÀÏ ¼öµµ ÀÖ´Ù´Â °ÍÀ» ¾Ë¸é ±× ¹æÇâÀ¸·Î ÁÖÀDZí°Ô ¿òÁ÷ÀδÙ. ¿òÁ÷ÀÓ¿¡ µû¶ó °ø±â Áß¿¡¼­ ½À±â°¡ ¸¹¾ÆÁüÀ» ¹ß°ßÇÑ´Ù - ¹°ÀÇ "³¿»õ" ¸¦ ¸ºÀ» ¼ö ÀÖ´Ù. ¸¶Áö¸·À¸·Î, ½Ã³»¸¦ ¹ß°ßÇÏ°í ¹°À» ¸¶½Å´Ù. ÀÌ ¿¹°¡ º¸¿©ÁÖµíÀÌ, ºñ·Ï ºÎÁ¤È®ÇÏ°í º¸ÀåµÇÁö ¾ÊÀº °ÍÀÌÁö¸¸ °æÇèÀû Á¤º¸´Â Ž»ö ¹æ¹ýÀÌ À绡¸®, ÀûÀýÇÏ°Ô ¸ñÇ¥¸¦ ãÀ» ±âȸ¸¦ Áõ°¡½ÃŲ´Ù. Áï, ºü¸¥ ¼º°øÀÇ °¡´É¼ºÀ» Áõ°¡½ÃŲ´Ù.

Ưº°ÇÑ ÀÀ¿ëÀ» À§ÇÏ¿© ¼³°èµÈ ÇÁ·Î±×·¥¿¡ °æÇèÀû Á¤º¸¸¦ ½±°Ô Æ÷ÇÔÇÒ ¼ö ÀÖÁö¸¸, ÀϹÝÈ­µÈ °æÇèÀû Ž»öÀ» ¸¸µå´Â °ÍÀº ºÒ°¡´ÉÇÏ´Ù°í »ý°¢ÇÒÁöµµ ¸ð¸¥´Ù. ±×·¯³ª, ¾Ë´Ù½ÃÇÇ ÀÌ°ÍÀº ±×·¸Áö°¡ ¾Ê´Ù.

¾ÆÁÖ Á¾Á¾ °æÇèÀû Ž»ö ¹æ¹ýµéÀº ¹®Á¦ÀÇ ¾î¶² ¸éÀ» ÃÖ´ëÈ­Çϰųª ÃÖ¼ÒÈ­ÇÏ´Â µ¥¿¡ ±âÃʸ¦ µÐ´Ù. »ç½Ç»ó °ËÅäÇÒ µÎ °¡Áö °æÇèÀû Á¢±Ù¹æ¹ýÀº ¹Ý´ë °æÇèÀ» »ç¿ëÇÏ°í, ´Ù¸¥ °á°ú¸¦ ³½´Ù. ÀÌ µÎ Á¢±Ù¹æ½ÄÀº ±âº»ÀûÀÎ ±íÀÌ¿ì¼± Ž»ö ·çƾ¿¡ ±âÃÊÇÑ´Ù.

8. ¾ð´ö¿À¸£±â ±â¹ý (THE HILL CLIMBING SEARCH TECHNIQUE)

¾Õ¿¡¼­ º» ´º¿å¿¡¼­ ·Î½º¾ØÁ©¸®½º±îÁö ºñÇà±â¸¦ ¿¹¾àÇÏ´Â ¹®Á¦¿¡¼­, ½Â°´ÀÌ ÃÖ¼ÒÈ­ÇÏ±æ ¹Ù¶ó´Â µÎ°¡Áö °¡´ÉÇÑ Á¦¾àÁ¶°ÇÀÌ ÀÖ´Ù. ù°´Â ¸¸µé¾îÁ®¾ß ÇÏ´Â ¿¬°áÀÇ ¼öÀÌ´Ù. µÎ ¹ø°´Â °æ·ÎÀÇ ±æÀÌÀÌ´Ù. °¡Àå ªÀº °æ·Î°¡ ¹Ýµå½Ã °¡Àå ÀûÀº ¼öÀÇ ¿¬°áÀ» ¿øÇÏ´Â °ÍÀº ¾Æ´ÔÀ» ±â¾ïÇÏ¿©¾ß ÇÑ´Ù. ù ¹ø° Çطμ­ ¿¬°áÀÇ ¼ö¸¦ ÃÖ¼ÒÈ­ÇÏ´Â °ÍÀ» ¹ß°ßÇÏ·Á°í ½ÃµµÇϴ Ž»ö ¾Ë°í¸®ÁòÀº, °í·ÁµÈ °Å¸®°¡ ±æ¼ö·Ï ¸ñÀûÁö¿¡ ´õ °¡±îÀÌ ³õÀÏ, ±×°Í¿¡ ÀÇÇؼ­ ¿¬°áÀÇ ¼ö°¡ ÁÙ¾îµé °¡´É¼ºÀÌ ´õ Ä¿Áø´Ù°í ÇÏ´Â °æÇèÀ» »ç¿ëÇÑ´Ù. AI ¿¡¼­, ÀÌ·± À¯ÇüÀÇ Å½»ö ¹æ¹ýÀ» ¾ð´ö ¿À¸£±â (hill-climbing) ¶ó°í ºÎ¸¥´Ù.

°ø½ÄÀûÀ¸·Î, ¾ð´ö¿À¸£±â ¾Ë°í¸®ÁòÀº ´ÙÀ½ ´Ü°è·Î¼­ ¸ñÇ¥¿¡ °¡Àå °¡±õ°Ô ³õÀÏ °Í°°Àº ³ëµå¸¦ ¼±ÅÃÇÑ´Ù. ¾Ë°í¸®ÁòÀº »êÀ» ¹ÝÂë ¿Ã¶ó°¡¼­ ¾îµÒ¼Ó¿¡¼­ ±æÀ» ÀÒÀº µµº¸¿©ÇàÀÚÀÇ À¯Ãß¿¡¼­ ±× À̸§À» µû¿Ô´Ù. µµº¸¿©ÇàÀÚÀÇ Ä·ÇÁ°¡ »êÀÇ Á¤»ó¿¡ ÀÖ´Ù°í °¡Á¤Çϸé, ¾îµÒ ¼Ó¿¡¼­Á¶Â÷, ¿©ÇàÀÚ´Â À§·Î ¿Ã¶ó°¡´Â °¢ ´Ü°è°¡ ¿Ã¹Ù¸¥ ¹æÇâÀ¸·Î °¡´Â ´Ü°èÀÓÀ» ¾È´Ù.

ºñÇà±â ¿¹¾à ¹®Á¦¿¡ ´ëÇÏ¿©, Áö½Äº£À̽º¿¡ ÀÖ´Â Á¤º¸¸¸À» °¡Áö°í ÁøÇàÇϸ鼭 °æ·Î ¹èÁ¤ ÇÁ·Î±×·¥¿¡ ´ÙÀ½ÀÇ ¾ð´ö¿À¸£±â °æÇèÀ» ÅëÇÕÇÒ ¼ö ÀÖ´Ù : ¸ñÀûÁö¿¡ ´õ °¡±î¿ï °ÍÀ̶ó´Â Èñ¸Á¿¡¼­, °¡´ÉÇÑÇÑ ÇöÀç À§Ä¡¿¡¼­ ¸Õ ¿¬°á ºñÇà±â¸¦ ¼±ÅÃÇغ¸ÀÚ. À̸¦ À§Çؼ­ ¾Æ·¡¿Í °°ÀÌ find() ·çƾÀ» º¯ÇüÇØ¾ß ÇÑ´Ù.

    /* given from, find anywhere farthest away */

    find(from, anywhere)

    char *from, *anywhere;

    {

      int pos, dist;

      pos=dist=0;

      find_pos=0;

      while (find_pos<f_pos) {

        if (!strcmp(flight[find_pos].from, from) && !flight[find_pos].skip) {

          if (flight[find_pos].distance>dist) {

            pos=find_pos;

            dist=flight[find_pos].distance;

          }

        }

        find_pos++;

      }

      if (pos) {

        strcpy(anywhere, flight[pos].to);

        flight[pos].skip=1;

        return flight[pos].distance;

      }

      return 0;

    }

find() ·çƾÀº ÀÌÁ¦ Ãâ¹ß µµ½Ã·ÎºÎÅÍ °¡Àå ¸Õ ¿¬°áÀ» ã±â À§ÇÏ¿© Àüü µ¥ÀÌÅͺ£À̽º¸¦ Ž»öÇÑ´Ù. ¾ð´ö¿À¸£±â ÇÁ·Î±×·¥ Àüü°¡ ¾Æ·¡¿¡ ÀÖ´Ù. À̹ø¿¡´Â ÄÄÇ»ÅÍ¿¡¼­ ÀÌ ÇÁ·Î±×·¥À¸·Î µé¾î°¡¾ß ÇÑ´Ù.  

    /* Hill - climbing */

    #include "stdio.h"

    #define MAX 100

    /* structure of the flight database (db) */

    struct FL {

      char from[20];

      char to[20];

      int distance;

      char skip;     /* used for backtracking */

    };

    struct FL flight[MAX];     /* array of db structures */

    int f_pos=0;         /* number of entries in flight db */

    int find_pos=0;     /* index for searching flight db */

     

    int tos=0;            /* top of stack */

    struct stack {

      char from[20];

      char to[20];

      int dist;

    };

    struct stack bt_stack[MAX];       /* backtrack stack */

     

    main()

    {

      char from[20], to[20];

      setup();

      printf("from ? ");

      gets(from);

      printf("to ? ");

      gets(to);

      isflight(from, to);

      route(to);

    }

     

    setup()

    {

      assert_flight("New York", "Chicago", 1000);

      assert_flight("Chicago", "Denver", 1000);

      assert_flight("New York", "Toronto", 800);

      assert_flight("New York", "Denver", 1900);

      assert_flight("Toronto", "Calgary", 1500);

      assert_flight("Toronto", "Los Angeles", 1800);

      assert_flight("Toronto", "Chicago", 500);

      assert_flight("Denver", "Urbana", 1000);

      assert_flight("Denver", "Houston", 1500);

      assert_flight("Houston", "Los Angeles", 1500);

      assert_flight("Denver", "Los Angeles", 1000);

    }

    /* place facts into flight db */

    assert_flight(from, to. dist)

    char *from, *to;

    int dist;

    {

      if (f_pos<MAX) {

        strcpy(flight[f_pos].from, from);

        strcpy(flight[f_pos].to, to);

        flight[f_pos].distance=dist;

        flight[f_pos].skip=0;

        f_pos++;

      }

      else printf("flight database full. ¡¬n");

    }

     

    /* show the route and distance */

    route(to)

    char *to;

    {

      int dist, t;

      dist=0;

      t=0;

      while(t<tos) {

        printf("%s to", bt_stack[t].from);

        dist+=bt_stack[t].dist;

        t++;

      }

      printf("%s ¡¬n", to);

      printf("distance is %d¡¬n", dist);

    }

     

    /* if connection between from and to, then return the distance fo flight ; if not, return 0 */

    match(from, to)

    char *from, *to;

    {

      register int t;

      for (t=f_pos-1; t>-1; t--)

        if (!strcmp(flight[t].from, from) && !strcmp(flight[t].to, to))

          return flight[t].distance;

        return 0;    /* not found */

    }

     

    /* given from, find anywhere farthest away */

    find(from, anywhere)

    char *from, *anywhere;

    {

      int pos, dist;

      pos=dist=0;

      find_pos=0;

      while (find_pos<f_pos) {

        if (!strcmp(flight[find_pos].from, from) && !flight[find_pos].skip) {

          if (flight[find_pos].distance>dist) {

            pos=find_pos;

            dist=flight[find_pos].distance;

          }

        }

        find_pos++;

      }

      if (pos) {

        strcpy(anywhere, flight[pos].to);

        flight[pos].skip=1;

        return flight[pos].distance;

      }

      return 0;

    }

     

    /* determine if there is a route between from and to */

    isflight(from, to)

    char *from, *to;

    {

      int d, temp, dist;

      char anywhere[20];

       

      if (d=match(from, to)) {

        /* is goal */

        push(from, to, d);

        return;

      }

      /* find any connection */

      if (dist=find(from, anywhere)) {

        push(from, to, dist);

        isflight(anywhere, to);

      }

      else if (tos>0) {

        pop(from, to, &dist);

        isflight(from, to);

      }

    }

     

    /* stack routines */

    push(from, to, dist)

    char *from, *to;

    int dist;

    {

      if (tos<MAX) {

        strcpy(bt_stack[tos].from, from);

        strcpy(bt_stack[tos].to, to);

        bt_stack[tos].dist=dist;

        tos++;

      }

      else printf("stack full. ¡¬n");

    }

    pop(from, to, dist)

    char *from, *to;

    int *dist;

    {

      if (tos>0) {

        tos--;

        strcpy(from, bt_stack[tos].from);

        strcpy(to, bt_stack[tos].to);

        *dist=bt_stack[tos].dist;

      }

      else printf("stack underflow. ¡¬n");

    }

ÇÁ·Î±×·¥À» ¼öÇà½Ãų ¶§ ¹ß°ßµÈ ÇØ´Â ´ÙÀ½°ú °°´Ù.

    New York to Denver to Los Angeles

    distance is 2900

ÀÌ °á°ú´Â ¾ÆÁÖ ÁÁ´Ù! µµÁß¿¡ ÃÖ¼ÒÀÇ Á¤Áö Ƚ¼ö - ´Ü Çѹø - ¸¦ °®´Â´Ù. ±×¸®°í °¡Àå ªÀº °æ·Î¿¡ ¾ÆÁÖ °¡±õ´Ù. ´õ¿ì±â, ¸¹Àº ¹éÆ®·¡Å·À» ÅëÇÑ ³¶ºñµÇ´Â ½Ã°£À̳ª ³ë·Â¾øÀÌ À̸¦ ÇÑ´Ù.

±×·¯³ª µ§¹ö¿¡¼­ ·Î½º¾ØÁ©¸®½º ±îÁöÀÇ ¿¬°áÀÌ Á¸ÀçÇÏÁö ¾ÊÀ¸¸é ÀÌ Å½»öÀº ÁÁÁö ¾ÊÀ» °ÍÀÌ´Ù. »ç½Ç»ó, ÇØ´Â 4900 ¸¶ÀÏÀÇ °Å¸®¿¡ À̸£´Â ´º¿å, µ§¹ö, ÈÞ½ºÅæ, ·Î½º¾ØÁ©¸®½º°¡ µÉ °ÍÀÌ´Ù. ÀÌ ÇØ´Â ÈÞ½ºÅæ±îÁöÀÇ °æ·Î°¡ ·Î½º¾ØÁ©¸®½º¶ó´Â ¸ñÇ¥¿¡ ´õ ±ÙÁ¢½ÃÅ°Áö ¾Ê±â ¶§¹®¿¡ À߸øµÈ Á¤»ó¿¡ ¿À¸¥´Ù. ±×¸² 7 Àº Çظ¦ º¸ÀÌ°í À߸øµÈ Á¤»óÀ¸·ÎÀÇ °æ·Î¸¦ º¸¿©ÁØ´Ù.

±×¸² 7  ÇØ¿Í À߸øµÈ Á¤»óÀ» ã±âÀ§ÇÑ ¾ð´ö¿À¸£±â °æ·Î

(1) ¾ð´ö¿À¸£±â Ž»ö Æò°¡ (Evaluating the Hill-Climbing Search)

¸¹Àº »óȲ¿¡¼­, ¾ð´ö¿À¸£±â Ž»öÀº ÇØ¿¡ µµ´ÞÇϱâ Àü¿¡ ¹æ¹®µÉ ÇÊ¿ä°¡ ÀÖ´Â ³ëµåÀÇ ¼ö¸¦ ÁÙÀÌ·Á´Â °æÇâÀÌ Àֱ⠶§¹®¿¡ ¾ÆÁÖ ÁÁ´Ù. ù°´Â ¿¹¿¡ ÀÖ´Â °Íó·³ À߸øµÈ ¾ð´öÀ» ¿À¸£´Â ¹®Á¦ÀÌ´Ù. ÀÌ °æ¿ì¿¡, Çظ¦ ã±â À§ÇÏ¿© Ž»öÀº Áö³ªÄ¡°Ô ¹éÆ®·¢ÇÑ´Ù. µÎ ¹ø°´Â "°í¿ø (plateaus)" ¹®Á¦ÀÌ´Ù. ¿©±â¼­ ¸ðµç ´ÙÀ½ ´Ü°èµéÀº ¶È°°ÀÌ ÁÁ¾Æº¸Àδ٠(¶Ç´Â ³ªºüº¸ÀδÙ). ÀÌ °æ¿ì¿¡, ¾ð´ö¿À¸£±â´Â ±íÀÌ ¿ì¼± Ž»ö°ú ¸¶Âù°¡ÁöÀÌ´Ù. ¼¼ ¹ø°´Â "»êµî¼ºÀÌ (ridges)" ¹®Á¦ÀÌ´Ù. ÀÌ °æ¿ì¿¡, ¾ð´ö¿À¸£±â´Â È¿°úÀûÀÌÁö ¸øÇѵ¥, ¿Ö³ÄÇÏ¸é ¾Ë°í¸®ÁòÀÌ ¹éÆ®·¡Å·ÇÏ´Â µ¿¾È »êµî¼ºÀÌ°¡ ¿©·¯¹ø ±³Â÷µÇ°Ô ÇÒ °ÍÀ̱⠶§¹®ÀÌ´Ù. ÀÌ·¯ÇÑ ÀáÀçÀûÀÎ ¹®Á¦¿¡µµ ºÒ±¸ÇÏ°í, ¾ð´ö¿À¸£±â´Â ÀϹÝÀûÀ¸·Î, °æÇèÀ» »ç¿ëÇÏÁö ¾Ê´Â ¾î¶² ¹æ¹ýº¸´Ùµµ ´õ »¡¸® ÃÖÀûÀÇ Çظ¦ »ý¼ºÇÑ´Ù.

9. ÃÖ¼Òºñ¿ë Ž»ö±â¹ý (THE LEAST-COST SEARCH TECHNIQUE)

¾ð´ö¿À¸£±â Ž»öÀÇ ¹Ý´ë°¡ ÃÖ¼Òºñ¿ë Ž»öÀÌ´Ù. ÀÌ ±â¹ýÀ» ·Ñ·¯ ½ºÄÉÀÌÆ®¸¦ ½Å°í Å« ¾ð´öÀÇ ±æ Áß°£¿¡ ¼­ ÀÖ´Â °Í°ú ºñ½ÁÇÏ´Ù°í »ý°¢ÇØ º¸ÀÚ : À§·Î °¡´Â °Íº¸´Ù ¾Æ·¡·Î ³»·Á°¡´Â °ÍÀÌ ÈξÀ ´õ ½±´Ù´Â Á¤È®ÇÑ ´À³¦À» °®´Â´Ù!  ±×·¯¹Ç·Î, ÃÖ¼Òºñ¿ëÀº ÃÖ¼ÒÀÇ ³ë·ÂÀÌ µå´Â °æ·Î¸¦ ÅÃÇÑ´Ù.

ºñÇà±â ¿¹¾à ¹®Á¦¿¡ ÃÖ¼Òºñ¿ë Ž»öÀ» Àû¿ëÇÏ´Â °ÍÀº, ¹ß°ßµÈ °æ·Î°¡ °¡Àå ªÀº °Å¸®¸¦ °®´Â ÁÁÀº ±âȸ¸¦ °®µµ·Ï ÇÁ·Î±×·¥ÀÌ ¸ðµç °æ¿ì¿¡ °¡Àå ªÀº ¿¬°á ºñÇà±â¸¦ ÅÃÇÒ °ÍÀ̶ó´Â °ÍÀ» ÀǹÌÇÑ´Ù. ¿¬°áÀÇ ¼ö¸¦ ÃÖ¼ÒÈ­ÇÏ´Â ¾ð´ö¿À¸£±â Ž»ö°ú´Â ´Þ¸®, ÃÖ¼Òºñ¿ëÀº ¿©ÇàÇÒ ¸¶Àϼö¸¦ ÃÖ¼ÒÈ­ÇÑ´Ù.

ÃÖ¼Òºñ¿ëÀ» »ç¿ëÇϱâ À§Çؼ­, ¾Æ·¡Ã³·³ ´Ù½Ã find() ¸¦ º¯°æÇØ¾ß ÇÑ´Ù.

    /* find closest anywhere */

    find(from, anywhere)

    char *from, *anywhere;

    {

      int pos, dist;

      pos=0;

      dist=32000;           /* larger than the longest route */

      find_pos=0;

      while (find_pos<f_pos) {

        if (!strcmp(flight[find_pos].from, from) && !flight[find_pos].skip) {

          if (flight[find_pos].distance>dist) {

            pos=find_pos;

            dist=flight[find_pos].distance;

          }

        }

        find_pos++;

      }

      if (pos) {

        strcpy(anywhere, flight[pos].to);

        flight[pos].skip=1;

        return flight[pos].distance;

      }

      return 0;

    }

º¸´Â ¹Ù¿Í °°ÀÌ, find() ÀÇ ÀÌ ¹öÀü°ú ¾ð´ö¿À¸£±â Ž»ö¿¡¼­ »ç¿ëµÈ ¹öÀü°úÀÇ À¯ÀÏÇÑ º¯È­´Â ÀÌ ¹öÀüÀÌ ¸Å¹ø °¡Àå ªÀº ¿¬°á ºñÇà±â¸¦ ¹ß°ßÇÑ´Ù´Â °ÍÀÌ´Ù. find() ÀÇ ÀÌ ¹öÀüÀ» °¡Áö°í, ÇØ´Â ´ÙÀ½°ú °°´Ù.

    New York to Toronto to Los Angeles

    distance is 2600

ÀÌ°ÍÀº ÃÖ¼Òºñ¿ë ¹æ¹ýÀÌ °¡Àå ªÀº °æ·Î¸¦ ¹ß°ßÇßÀ½À» º¸¿©ÁØ´Ù. ±×¸² 8 Àº ÇرîÁö ÃÖ¼Òºñ¿ë Ž»öÀÇ °æ·Î¸¦ º¸¿©ÁØ´Ù.

±×¸² 8  Çظ¦ ã±âÀ§ÇÑ ÃÖ¼Òºñ¿ë °æ·Î

(1) ÃÖ¼Òºñ¿ë Ž»ö Æò°¡ (Evaluating the Least-Cost Search)

ÃÖ¼Òºñ¿ë Ž»öÀº ¼ø¼­°¡ µÚ¹Ù²ï °Í¸¸ Á¦¿ÜÇÏ°í, ¾ð´ö¿À¸£±â Ž»ö°ú °°Àº ÀåÁ¡ ´ÜÁ¡À» °®´Â´Ù. À߸øµÈ °è°î, ÀúÁö (lowland), °ñÂ¥±â°¡ ÀÖÀ» ¼ö ÀÖ´Ù ; ±×·¯³ª Àü¹ÝÀûÀ¸·Î ÃÖ¼Òºñ¿ë Ž»öÀº ¾ÆÁÖ Àß ÀÛµ¿ÇÏ·Á´Â °æÇâÀÌ ÀÖ´Ù. ±×·¯³ª ÀÌ Æ¯º°ÇÑ ¹®Á¦¿¡ ´ëÇÏ¿© ¾ð´ö¿À¸£±â º¸´Ù ´õ Àß ¼öÇàÇß´Ù°í Çؼ­ ÀϹÝÀûÀ¸·Î ´õ ÁÁ´Ù°í »ý°¢ÇÏÁö´Â ¸»¾Æ¾ß ÇÑ´Ù. Æò±ÕÀûÀ¸·Î blind Ž»öÀÇ ¼º´ÉÀ» ´É°¡ÇÒ °ÍÀ̶ó°í¸¸ ¸»ÇÒ ¼ö ÀÖ´Ù.

10. Ž»ö±â¹ý ¼±Åà (CHOOSING A SEARCH TECHNIQUE)

°æÇèÀû ±â¹ýÀº blind Ž»öº¸´Ù ´õ Àß µ¿ÀÛÇÏ·Á´Â °æÇâÀÌ ÀÖ´Ù. ±×·¯³ª, ´ÙÀ½ ³ëµå°¡ ¸ñÇ¥±îÁöÀÇ °æ·Î¿¡ ÀÖÀ» °¡´É¼ºÀ» ÁÙ ÃæºÐÇÑ Á¤º¸°¡ ¾øÀ» ¼öµµ Àֱ⠶§¹®¿¡ °æÇèÀû Ž»öÀ» ÀÌ¿ëÇÒ¼ö ÀÖ´Â ¹®Á¦µé¿¡ ´ëÇؼ­, ±×¸®°í µÎ ¹ø°´Â ÀÌ¿ëÇÒ ¼ö ¾ø´Â ¹®Á¦µé¿¡ ´ëÇؼ­ ¹®Á¦¿¡ °æÇèÀ» Àû¿ëÇÒ ¼ö ¾ø´Ù¸é ±íÀÌ¿ì¼± Ž»öÀÌ ÀϹÝÀûÀ¸·Î °¡Àå ÁÁ±â ¶§¹®¿¡ ±×°ÍÀ» ¼±ÅÃÇØ¾ß ÇÑ´Ù. ÀÌ ±ÔÄ¢ÀÇ À¯ÀÏÇÑ ¿¹¿Ü´Â, ³Êºñ¿ì¼± Ž»öÀÌ ´õ Àß ÀÛµ¿ÇÒ °ÍÀ̶ó°í ¾Ë·ÁÁÖ´Â Á¤º¸¸¦ °®°Ô µÇ´Â »óȲÀÌ´Ù.

¾ð´ö¿À¸£±â¿Í ÃÖ¼Òºñ¿ë »çÀÌÀÇ ¼±ÅÃÀº ¾î¶² Á¦¾àÁ¶°ÇÀ» ÃÖ¼ÒÈ­Çϰųª ÃÖ´ëÈ­ÇÏ·Á°í Çϴµ¥¿¡ ÀÇÁ¸ÇÑ´Ù. ÀϹÝÀûÀ¸·Î, ¾ð´ö¿À¸£±â Ž»öÀº ¹æ¹®µÉ ³ëµåÀÇ ¼ö°¡ ÃÖ¼ÒÀÎ Çظ¦ »ý¼ºÇÏ´Â ¹Ý¸é, ÃÖ¼Òºñ¿ë Ž»öÀº ÃÖ¼ÒÀÇ ³ë·ÂÀ» ¿ä±¸ÇÏ´Â °æ·Î¸¦ ã´Â´Ù.

¸¸¾à ÃÖÀû¿¡ °¡±î¿î Çظ¦ ã°í ÀÖÁö¸¸ ¼Ò¸ðÀû Ž»öÀ» Àû¿ëÇÒ¼ö ¾ø´Ù¸é, °¢ Ž»ö ±â¹ýÀ» ½ÃµµÇؼ­ °¡Àå ÁÁÀº Çظ¦ ã¾Æ¾ß ÇÑ´Ù. Ž»öÀº ½ÇÁ¦·Î ´Ù¸¥ ¹æ¹ýÀ¸·Î ÀÛµ¿ÇÏ°í, ±×·¯¹Ç·Î Åë°èÀûÀ¸·Î Çϳª°¡ ´Ù¸¥ °Íµéº¸´Ù ´õ ³ªÀº °á°ú¸¦ ³»¾ß Çϱ⠶§¹®¿¡ ÀÌ ¹æ¹ýÀº È¿°úÀûÀÌ´Ù.

11. º¹¼ö ÇØ Ã£±â (FINDING MULTIPLE SOLUTIONS)

¶§¶§·Î, °°Àº ¹®Á¦¿¡ ´ëÇÑ ¿©·¯°³ÀÇ Çظ¦ ¹ß°ßÇØ¾ß ÇÑ´Ù. ±×·¯³ª ¼Ò¸ðÀû Ž»ö¿¡¼­ ¹ß»ýÇÏ´Â, ¸ðµç Çظ¦ ã´Â °Í°ú °°Áö´Â ¾Ê´Ù. ¿¹¸¦µé¾î, "²ÞÀÇ Áý (dream house)" À» ¼³°èÇÏ·Á ÇÑ´Ù°í »ý°¢Çغ¸ÀÚ : °¡Àå ÁÁ¾ÆÇÏ´Â °ÍÀ» ¹ß°ßÇϱâ À§ÇØ °¢ ÃþÀÇ °èȹÀ» ¿©·¯ °³ ½ºÄÉÄ¡ÇÑ´Ù ; ¸ðµç (all) °¡´ÉÇÑ ÁýµéÀ» ½ºÄÉÄ¡ÇÏÁö´Â ¾Ê´Â´Ù. ±×·¯¹Ç·Î, ¿©·¯°³ÀÇ ÇØ´Â »óȲ¿¡ ´ëÇÑ °¡Àå ÁÁÀº Çظ¦ ¹ß°ßÇÏ´Â °ÍÀ» µ½±â À§ÇÏ¿© ¿©·¯ °¡Áö ¿É¼ÇÀ» Á¦½ÃÇÒ¼ö ÀÖ´Ù.

º¹¼öÀÇ Çظ¦ »ý¼ºÇÏ´Â ¸¹Àº ¹æ¹ýÀÌ ÀÖÁö¸¸, ¿©±â¼­´Â µÎ °¡Áö¸¸ °ËÅäµÈ´Ù : °æ·ÎÁ¦°Å¿Í ³ëµåÁ¦°Å (path-removal and node-removal), ÀÌ ¹æ¹ýµéÀÇ À̸§ÀÌ ÀǹÌÇϵíÀÌ, ±º´õ´õ±â ¾øÀÌ º¹¼öÀÇ Çظ¦ »ý¼ºÇÏ´Â °ÍÀº ¹ß°ßÇÏ´Â Çظ¦ ½Ã½ºÅÛÀ¸·ÎºÎÅÍ Á¦°ÅÇÒ °ÍÀ» ¿ä±¸ÇÑ´Ù. ÀÌ ¹æ¹ý Áß ¾Æ¹«°Íµµ ¸ðµç Çظ¦ ¹ß°ßÇÏ·Á°í ½ÃµµÇÏÁö ¾Ê´Â´Ù (¶Ç´Â »ç¿ëµÉ ¼öµµ ¾ø´Ù) ´Â °ÍÀ» È®½ÇÈ÷ ±â¾ïÇØ¾ß ÇÑ´Ù. ¸ðµç Çظ¦ ¹ß°ßÇÏ´Â °ÍÀº ´Ù¸¥ ¹®Á¦ÀÌ°í ¼Ò¸ðÀûÀΠŽ»öÀ» ÀǹÌÇϱ⠶§¹®¿¡ ÀϹÝÀûÀ¸·Î ÇàÇØÁöÁö ¾Ê´Â´Ù.

(1) °æ·Î Á¦°Å ¹æ¹ý (The Path-Removal Method)

º¹¼ö Çظ¦ »ý¼ºÇÏ´Â °æ·Î Á¦°Å ¹æ¹ýÀº ÇöÀçÀÇ ±¸¼ºÇÏ´Â, ±×¸®°í³ª¼­ ¶Ç ´Ù¸¥ Çظ¦ ãÀ¸·Á°í ½ÃµµÇÏ´Â ¸ðµç ³ëµåµéÀ» µ¥ÀÌÅͺ£À̽º·ÎºÎÅÍ Á¦°ÅÇÑ´Ù. º»ÁúÀûÀ¸·Î, °æ·Î Á¦°Å ¹æ¹ýÀº Æ®¸®¿¡¼­ °¡Áö¸¦ ÀÚ¸¥´Ù.

°æ·Î Á¦°Å ¹æ¹ýÀ» °¡Áö°í º¹¼ö Çظ¦ ¹ß°ßÇϱâ À§ÇÏ¿© ¾Æ·¡¿¡ ÀÖ´Â °Íó·³ ±íÀÌ¿ì¼± Ž»ö¿¡¼­ main() À» º¯°æÇÏ´Â °Í¸¸ ÇÊ¿äÇÏ´Ù.  

    main()

    {

      char from[20], to[20];

      setup();

      printf("from ? ");

      gets(from);

      printf("to ? ");

      gets(to);

      do {

        isflight(from, to);

        route(to);

        tos=0;    /* reset the backtrack stack */

      } while (getche() != 'q');

    }

ÇØÀÇ ÀϺÎÀÎ ¾î¶² ¿¬°áµµ skip Çʵ尡 Ç¥½ÃµÇ°Ô ÇÒ °ÍÀ̱⠶§¹®¿¡, ´õ ÀÌ»ó find() ¿¡ ÀÇÇØ ¹ß°ßµÉ ¼ö ¾ø´Ù. ±×·¯¹Ç·Î, ÇØ¿¡¼­ ¸ðµç ¿¬°áÀº È¿°úÀûÀ¸·Î Á¦°ÅµÈ´Ù. ÇØ¾ß ÇÒ À¯ÀÏÇÑ °ÍÀº tos ¸¦ ¸®¼ÂÇÏ´Â °ÍÀε¥, ÀÌ°ÍÀº ¹éÆ®·¢ ½ºÅÃÀ» Ŭ¸®¾î½ÃŲ´Ù.

main() ÀÇ ÀÌ ¹øÀüÀ» °¡Áö°í ÇÁ·Î±×·¥À» ¼öÇàÇÏ¸é ´ÙÀ½À» ¹ß°ßÇÑ´Ù.

    New York to Chicago to Denver to Los Angeles

    distance is 3000

    New York to Toronto to Los Angeles

    distance is 2600

    New York to Denver to Los Angeles

    distance is 2900

°¡Àå ÁÁÀº ÇØ ¼¼ °³°¡ ¹ß°ßµÈ´Ù´Â °ÍÀº Àç¹ÌÀÖ´Ù. ±×·¯³ª, ÀÌ °á°ú¿¡ ´ëÇÏ¿© ÀϹÝÈ­ÇÒ¼ö ÀÖ´Ù°í ±â´ëÇÏÁö´Â ¸»¾Æ¾ß ÇÑ´Ù. ¿Ö³ÄÇϸé, µ¥ÀÌÅÍ°¡ µ¥ÀÌÅͺ£À̽º¿¡ ³õ¿©Áö´Â ¹æ¹ý°ú, ¿¬±¸ÇÏ°í ÀÖ´Â »óȲ¿¡ ±âÃʸ¦ µÎ±â ¶§¹®ÀÌ´Ù.

(2) ³ëµå Á¦°Å ¹æ¹ý (The Node-Removal Method)

³ëµå Á¦°Å ¹æ¹ýÀº º¹¼ö Çظ¦ »ý¼ºÇÏ´Â ¶Ç ´Ù¸¥ ¹æ¹ýÀÌ´Ù. ´Ü¼øÈ÷ ÇöÀç ÇØÀÇ °æ·Î¿¡¼­ ¸¶Áö¸· ³ëµå¸¦ Á¦°ÅÇÏ°í ±×¸®°í³ª¼­ ´Ù½Ã ½ÃµµÇÑ´Ù. À̸¦ Çϱâ À§Çؼ­ main() ÇÔ¼ö´Â ¹éÆ®·¢ ½ºÅÿ¡¼­ ¸¶Áö¸· ³ëµå¸¦ ²¨³»°í, retract() ¶ó°í ÇÏ´Â »õ ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© µ¥ÀÌÅͺ£À̽º·ÎºÎÅÍ ±×°ÍÀ» Á¦°ÅÇØ¾ß ÇÑ´Ù. ¶ÇÇÑ clearmarkers() ¸¦ »ç¿ëÇÏ¿© skip Çʵ带 ¸ðµÎ ¸®¼ÂÇÏ°í, ¹éÆ®·¢ ½ºÅÃÀ» Ŭ¸®¾îÇØ¾ß ÇÑ´Ù. main(), retract(), ±×¸®°í clearmarkers() ÇÔ¼öµéÀÌ ¾Æ·¡¿¡ ÀÖ´Ù.

    main()

    {

      char from[20], to[20], c1[20], c2[20];

      int d;

      setup();

      printf("To terminate, press 'q' .... ¡¬n");

      printf("from ? ");

      gets(from);

      printf("to ? ");

      gets(to);

      do {

        isflight(from, to);

        route(to);

        clearmarkers();      /* reset the database */

        if (tos>0) pop(c1, c2, &d);

        retract(c1, c2);    /* remove last node from database */

        tos=0;    /* reset the backtrack stack */

      } while (getche() != 'q');

    }

     

    /* remove an entry from the database */

    retract(from, to)

    char *from, *to;

    {

      int t;

      for (t=0; t<f_pos; t++)

        if (!strcmp(flight[t].from, from) && !strcmp(flight[t].to, to)) {

          strcpy(flight[t].from, "");

          return;

        }

    }

ÀÌ ¹æ¹ýÀº µµ½Ã À̸§À¸·Î ´Ü¼øÈ÷ ±æÀÌ°¡ 0 ÀÎ ½ºÆ®¸µÀ» »ç¿ëÇÏ¿© ¿£Æ®¸®¸¦ Á¦°ÅÇÑ´Ù (retract). ÆíÀǸ¦ À§ÇÏ¿© Àüü ³ëµå Á¦°Å ÇÁ·Î±×·¥À» ¿©±â¿¡ Á¦½ÃÇÑ´Ù.

    /* Depth-first with multiple solutions using the node-removal method */

    #include "stdio.h"

    #define MAX 100

    /* structure of the flight database (db) */

    struct FL {

      char from[20];

      char to[20];

      int distance;

      char skip;     /* used in backtracking */

    };

    struct FL flight[MAX];     /* array of db structures */

    int f_pos=0;         /* number of entries in flight db */

    int find_pos=0;     /* index for searching flight db */

     

    int tos=0;            /* top of stack */

    struct stack {

      char from[20];

      char to[20];

      int dist;

    };

    struct stack bt_stack[MAX];       /* backtrack stack */

     

    main()

    {

      char from[20], to[20], c1[20], c2[20];

      int d;

      setup();

      printf("To terminate, press 'q' .... ¡¬n");

      printf("from ? ");

      gets(from);

      printf("to ? ");

      gets(to);

      do {

        isflight(from, to);

        route(to);

        clearmarkers();      /* reset the database */

        if (tos>0) pop(c1, c2, &d);

        retract(c1, c2);    /* remove last node from database */

        tos=0;    /* reset the backtrack stack */

      } while (getche() != 'q');

    }

     

    setup()

    {

      assert_flight("New York", "Chicago", 1000);

      assert_flight("Chicago", "Denver", 1000);

      assert_flight("New York", "Toronto", 800);

      assert_flight("New York", "Denver", 1900);

      assert_flight("Toronto", "Calgary", 1500);

      assert_flight("Toronto", "Los Angeles", 1800);

      assert_flight("Toronto", "Chicago", 500);

      assert_flight("Denver", "Urbana", 1000);

      assert_flight("Denver", "Houston", 1500);

      assert_flight("Houston", "Los Angeles", 1500);

      assert_flight("Denver", "Los Angeles", 1000);

    }

    /* place facts into flight db */

    assert_flight(from, to. dist)

    char *from, *to;

    int dist;

    {

      if (f_pos<MAX) {

        strcpy(flight[f_pos].from, from);

        strcpy(flight[f_pos].to, to);

        flight[f_pos].distance=dist;

        flight[f_pos].skip=0;

        f_pos++;

      }

      else printf("flight database full. ¡¬n");

    }

     

    /* reset the "skip" field - i.e., reactivate all modes */

    clearmarkers()

    {

      int t;

      for (t=0; t<f_pos; ++t)  flight[t].skip=0;

    }

     

    /* remove an entry from the database */

    retract(from, to)

    char *from, *to;

    {

      int t;

      for (t=0; t<f_pos; t++)

        if (!strcmp(flight[t].from, from) && !strcmp(flight[t].to, to)) {

          strcpy(flight[t].from, "");

          return;

        }

    }

     

    /* show the route and distance */

    route(to)

    char *to;

    {

      int dist, t;

      dist=0;

      t=0;

      while(t<tos) {

        printf("%s to", bt_stack[t].from);

        dist+=bt_stack[t].dist;

        t++;

      }

      printf("%s ¡¬n", to);

      printf("distance is %d¡¬n", dist);

    }

     

    /* given from, find anywhere */

    find(from, anywhere)

    char *from, *anywhere;

    {

      find_pos=0;

      while (find_pos<f_pos) {

        if (!strcmp(flight[find_pos].from, from) && !flight[find_pos].skip) {

          strcpy(anywhere, flight[find_pos].to);

          flight[find_pos].skip=1;     

          return flight[find_pos].distance;

        }

        find_pos++;

      }

      return 0;

    }

     

    /* if connection between from and to, then return the distance fo flight ; if not, return 0 */

    match(from, to)

    char *from, *to;

    {

      register int t;

      for (t=f_pos-1; t>-1; t--)

        if (!strcmp(flight[t].from, from) && !strcmp(flight[t].to, to))

          return flight[t].distance;

        return 0;    /* not found */

    }

     

    /* determine if there is a route between from and to */

    isflight(from, to)

    char *from, *to;

    {

      int d, dist;

      char anywhere[20];

      if (d=match(from, to)) {

        push(from, to, d);       /* distance */

        return;

      }

      if (dist=find(from, anywhere)) {

        push(from, to, dist);

        isflight(anywhere, to);

      }

      else if (tos>0) {

        /* backtrack */

        pop(from, to, &dist);

        isflight(from, to);

      }

    }

     

    /* stack routines */

    push(from, to, dist)

    char *from, *to;

    int dist;

    {

      if (tos<MAX) {

        strcpy(bt_stack[tos].from, from);

        strcpy(bt_stack[tos].to, to);

        bt_stack[tos].dist=dist;

        tos++;

      }

      else printf("stack full. ¡¬n");

    }

    pop(from, to, dist)

    char *from, *to;

    int *dist;

    {

      if (tos>0) {

        tos--;

        strcpy(from, bt_stack[tos].from);

        strcpy(to, bt_stack[tos].to);

        *dist=bt_stack[tos].dist;

      }

      else printf("stack underflow. ¡¬n");

    }

ÀÌ ÇÁ·Î±×·¥À» ¼öÇàÇÏ¸é ´ÙÀ½ ÇصéÀ» »ý¼ºÇÑ´Ù :

    New York to Chicago to Denver to Los Angeles

    distance is 3000

    New York to Chicago to Denver to Houston to Los Angeles

    distance is 5000

    New York to Toronto to Los Angeles

    distance is 2600

¿©±â¼­, µÎ ¹ø° ÇØ´Â °¡´ÉÇÑ ÃÖ¾ÇÀÇ °æ·ÎÀÌÁö¸¸, ÇÁ·Î±×·¥Àº ¿©ÀüÈ÷ ÃÖÀûÀÇ Çظ¦ ¹ß°ßÇÑ´Ù. ÀÌ °á°úµéÀº µ¥ÀÌÅͺ£À̽º¿¡¼­ µ¥ÀÌÅÍÀÇ ¹°¸®Àû ±¸Á¶¿Í, ¿¬±¸ÁßÀΠƯº°ÇÑ »óȲ¿¡ ±âÃÊÇϱ⠶§¹®¿¡ ±×°ÍµéÀ» ÀϹÝÈ­ÇÏ´Â °ÍÀº ºÒ°¡´ÉÇÏ´Ù.

12. ÃÖÀûÇØ Ã£±â (FINDING THE OPTIMAL SOLUTION)

Áö±Ý±îÁö ¼³¸íµÈ ¸ðµç Ž»ö ±â¹ýµéÀº ÇϳªÀÇ Çظ¦ ã´Âµ¥¿¡ °ü°èÇÑ´Ù. °æÇèÀû Ž»ö¿¡ ÀÇÇØ º¸¿©Áø °Íó·³, ÁÁÀº, ¹Ù¶÷Á÷ÇÏ°Ô´Â ÃÖÀûÀÇ Çظ¦ ¹ß°ßÇÏ´Â °¡´É¼ºÀ» Çâ»ó½ÃÅ°·Á´Â ³ë·ÂÀÌ ÀÖ¾ú´Ù. ±×·¯³ª ¶§¶§·Î ÃÖÀûÀÇ Çظ¸ÀÌ ¿ä±¸µÈ´Ù. ¿©±â¼­ »ç¿ëµÈ ÃÖÀû ÇØ (optimal solution) ¶ó´Â ¿ë¾î´Â ´Ü¼øÈ÷ ¿©·¯°³ÀÇ º¹¼ö ÇØ »ý¼º ±â¹ýµé Áß Çϳª¸¦ »ç¿ëÇÏ¿© ¹ß°ßÇÒ ¼ö ÀÖ´Â °¡Àå ÁÁÀº °æ·Î¸¦ ÀǹÌÇÑ´Ù - ½ÇÁ¦·Î °¡Àå ÁÁÀº ÇØ°¡ ¾Æ´Ò ¼öµµ ÀÖ´Ù (Á¤¸»·Î ÃÖÀûÀÎ Çظ¦ ¹ß°ßÇÏ´Â °ÍÀº ¾ÆÁÖ ºñ½Ñ ¼Ò¸ðÀû Ž»öÀ» ¿ä±¸ÇÒ °ÍÀÌ´Ù).

µû¶ó¼­, ºñÇà±â ¿¹¾àÀÇ º¸±â¸¦ ¶°³ª±â Àü, ÀÌ Àý¿¡¼­´Â, °Å¸®¸¦ ÃÖ¼ÒÈ­Çϱ⸦ ¿øÇÑ´Ù´Â °¡Á¤ÇÏ¿¡, ÃÖÀûÀÇ ¿¹¾àÀ» ¹ß°ßÇÏ´Â ÇÁ·Î±×·¥À» °³¹ßÇÑ´Ù. ¿©±â¿¡¼­ °³¹ßµÈ ÇÁ·Î±×·¥Àº º¹¼ö Çظ¦ »ý¼ºÇÏ´Â °æ·ÎÁ¦°Å ¹æ¹ý°ú, °Å¸®¸¦ ÃÖ¼ÒÈ­Çϱâ À§ÇÏ¿© ÃÖ¼Òºñ¿ë Ž»öÀ» »ç¿ëÇÑ´Ù.

°¡Àå ªÀº ¿¹¾àÀ» ¹ß°ßÇØ ³»´Â ¿­¼è´Â ¾ÕÀÇ °Íº¸´Ù ´õ ÀÛÀº °Å¸®¸¦ °®´Â Çظ¦ º¸À¯ÇÏ´Â °ÍÀÌ´Ù. ±×·¯¹Ç·Î, ÇÁ·Î±×·¥ÀÌ »ý¼ºÇÒ ´õ ÀÌ»óÀÇ ÇØ°¡ ¾øÀ» ¶§, ÃÖÀûÀÇ Çظ¸ÀÌ ³²À» °ÍÀÌ´Ù. À̸¦ ÀÌ·ç±â À§ÇØ, route() ÇÔ¼ö¸¦ ÁÖ·Î º¯°æ½ÃÅ°°í, ÇöÀçÀÇ Çظ¦ º¸À¯Çϱâ À§ÇØ, ±×¸®°í ¿Ï¼ºµÇ¸é ÃÖÀûÀÇ Çظ¦ º¸À¯Çϱâ À§ÇÏ¿© solution À̶ó°í ºÎ¸£´Â ºÎ°¡ÀûÀÎ ½ºÅÃÀ» ¸¸µé¾î¾ß ÇÑ´Ù. º¯ÇüµÈ route() °¡ ¾Æ·¡¿¡ ÀÖ´Ù.

    /* finding shortest distance */

    route(to)

    char *to;

    {

      int dist, t;

      static int old_dist=32000;

      if (!tos) return 0;                /* all done */

      dist=0;

      t=0;

      while(t<tos) {

        dist+=bt_stack[t].dist;

        t++;

      }

       

      /* if shorter than make new solution */

      if (dist<old_dist && dist) {

        t=0;

        old_dist=dist;

        stos=0;               /* clear old route from solution stack */

        while (t<tos) {

          spush(bt_stack[t].from, bt_stack[t].to, bt_stack[t].dist);

          t++;

        }

      }

      return dist;

    }

Àüü ÇÁ·Î±×·¥ÀÌ ¿©±â¿¡ ÀÖ´Ù. main() ¿¡¼­ÀÇ º¯È­¿Í, »õ·Î¿î ÇØÀÇ ³ëµå¸¦ solution ½ºÅÿ¡ ³õ´Â spush() ¸¦ ´õÇÑ °ÍÀ» ÁÖ¸ñÇØ¾ß ÇÑ´Ù. 

    /* Optimal solution using least-cost with path-removal */

    #include "stdio.h"

    #define MAX 100

    /* structure of the flight database (db) */

    struct FL {

      char from[20];

      char to[20];

      int distance;

      char skip;     /* used for backtracking */

    };

    struct FL flight[MAX];     /* array of db structures */

    int f_pos=0;         /* number of entries in flight db */

    int find_pos=0;     /* index for searching flight db */

     

    int tos=0;            /* top of stack */

    struct stack {

      char from[20];

      char to[20];

      int dist;

    };

    struct stack bt_stack[MAX];       /* backtrack stack */

    struct stack solution[MAX];        /* hold temporary solutions */

     

    main()

    {

      char from[20], to[20];

      int t, d;

      setup();

      printf("from ? ");

      gets(from);

      printf("to ? ");

      gets(to);

      do {

        isflight(from, to);

        d=route(to);

        tos=0;    /* reset the backtrack stack */

      } while (d != 0);        /* while still finding solutions */

       

      t=0;

      printf("Optimal solution is : ¡¬n");

      while (t<stos) {

        printf("%s to ", solution[t].from);

        d+=solution[t].dist;

        t++;

      }

      printf("%s ¡¬n", to);

      printf("distance is %d ¡¬n", d);

    }

     

    setup()

    {

      assert_flight("New York", "Chicago", 1000);

      assert_flight("Chicago", "Denver", 1000);

      assert_flight("New York", "Toronto", 800);

      assert_flight("New York", "Denver", 1900);

      assert_flight("Toronto", "Calgary", 1500);

      assert_flight("Toronto", "Los Angeles", 1800);

      assert_flight("Toronto", "Chicago", 500);

      assert_flight("Denver", "Urbana", 1000);

      assert_flight("Denver", "Houston", 1500);

      assert_flight("Houston", "Los Angeles", 1500);

      assert_flight("Denver", "Los Angeles", 1000);

    }

    /* place facts into flight db */

    assert_flight(from, to. dist)

    char *from, *to;

    int dist;

    {

      if (f_pos<MAX) {

        strcpy(flight[f_pos].from, from);

        strcpy(flight[f_pos].to, to);

        flight[f_pos].distance=dist;

        flight[f_pos].skip=0;

        f_pos++;

      }

      else printf("flight database full. ¡¬n");

    }

     

    /* finding shortest distance */

    route(to)

    char *to;

    {

      int dist, t;

      static int old_dist=32000;

      if (!tos) return 0;                /* all done */

      dist=0;

      t=0;

      while(t<tos) {

        dist+=bt_stack[t].dist;

        t++;

      }

       

      /* if shorter than make new solution */

      if (dist<old_dist && dist) {

        t=0;

        old_dist=dist;

        stos=0;               /* clear old route from solution stack */

        while (t<tos) {

          spush(bt_stack[t].from, bt_stack[t].to, bt_stack[t].dist);

          t++;

        }

      }

      return dist;

    }

     

    /* if flight between from and to, then return the distance of flight ; if not, return 0 */

    match(from, to)

    char *from, *to;

    {

      register int t;

      for (t=f_pos-1; t>-1; t--)

        if (!strcmp(flight[t].from, from) && !strcmp(flight[t].to, to))

          return flight[t].distance;

        return 0;    /* not found */

    }

     

    /* given from, find anywhere */

    find(from, anywhere)

    char *from, *anywhere;

    {

      find_pos=0;

      while (find_pos<f_pos) {

        if (!strcmp(flight[find_pos].from, from) && !flight[find_pos].skip) {

          strcpy(anywhere, flight[find_pos].to);

          flight[find_pos].skip=1;     

          return flight[find_pos].distance;

        }

        find_pos++;

      }

      return 0;

    }

     

    /* determine if there is a route between from and to */

    isflight(from, to)

    char *from, *to;

    {

      int d, dist;

      char anywhere[20];

      if (d=match(from, to)) {

        push(from, to, d);       /* distance */

        return;

      }

      if (dist=find(from, anywhere)) {

        push(from, to, dist);

        isflight(anywhere, to);

      }

      else if (tos>0) {

        pop(from, to, &dist);

        isflight(from, to);

      }

    }

     

    /* stack routines */

    push(from, to, dist)

    char *from, *to;

    int dist;

    {

      if (tos<MAX) {

        strcpy(bt_stack[tos].from, from);

        strcpy(bt_stack[tos].to, to);

        bt_stack[tos].dist=dist;

        tos++;

      }

      else printf("stack full. ¡¬n");

    }

    pop(from, to, dist)

    char *from, *to;

    int *dist;

    {

      if (tos>0) {

        tos--;

        strcpy(from, bt_stack[tos].from);

        strcpy(to, bt_stack[tos].to);

        *dist=bt_stack[tos].dist;

      }

      else printf("stack underflow. ¡¬n");

    }

     

    /* solution stack */

    spush(from, to, dist)

    char *from, *to;

    int dist;

    {

      if (stos<MAX) {

        strcpy(solution[stos].from, from);

        strcpy(solution[stos].to, to);

        solution[stos].dist=dist;

        stos++;

      }

      else printf("Shortest distance stack full. ¡¬n");

    }

ÀÌ ¹æ¹ýÀº ÇÑ°¡Áö ºñÈ¿À²¼ºÀ» °®´Â´Ù : ±× ¹æ¹ýÀº °á·Ð±îÁöÀÇ ¸ðµç °æ·Î¸¦ µû¸¥´Ù. Çâ»óµÈ ¹æ¹ýÀº ±× °æ·Î¿Í °ü·ÃµÈ °Å¸®°¡ ÇöÀçÀÇ °Å¸®¿Í °°°Å³ª ±×°ÍÀ» ÃÊ°úÇß´Ù´Â °ÍÀ» ¹ß°ßÇÏÀÚ¸¶ÀÚ °æ·Î µû¶ó°¡±â¸¦ ¸ØÃá´Ù. ±×·¯ÇÑ Çâ»óÀ» ¼ö¿ëÇϱâ À§ÇÏ¿© ÀÌ ÇÁ·Î±×·¥À» º¯ÇüÇÏ´Â °ÍÀÌ Àç¹ÌÀÖ´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù.

13. ÀÒ¾î ¹ö¸° ¿­¼è·Î µ¹¾Æ°¡¼­ (BACK TO THE MISSING KEYS)

¹®Á¦ÇØ°á¿¡ ´ëÇÑ ÀÌ ÀåÀ» °á·ÐÁþ±â À§ÇØ, ¾Õ¿¡¼­ ¼³¸íµÈ ÀÒ¾î ¹ö¸° ¿­¼è¸¦ ã´Â C ÇÁ·Î±×·¥À» Á¦°øÇÏ´Â °Í¸¸ÀÌ ÀûÀýÇÑ °Í °°´Ù. ºñ·Ï ¿­¼è¸¦ ã´Â °ÍÀº µÎ µµ½Ã »çÀÌÀÇ °æ·Î¸¦ ã´Â °Í°ú ´Ù¸¥ ¹®Á¦ÀÌÁö¸¸, ±×°ÍÀ» ÇØ°áÇϱâ À§Çؼ­µµ °°Àº ±â¹ýÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. Áö±ÝÂëÀº ÀÌ¹Ì ¹®Á¦¸¦ ÇØ°áÇϱâ À§ÇÏ¿© C ¸¦ ¾î¶»°Ô »ç¿ëÇÒ °ÍÀΰ¡¿¡ ´ëÇÏ¿© ¾ÆÁÖ Àß ÀÌÇØÇØ¾ß ÇÑ´Ù. µû¶ó¼­ ´õ ÀÌ»óÀÇ ¼³¸í¾øÀÌ Áñ°Å¿òÀ» À§ÇÏ¿© ÇÁ·Î±×·¥À» Á¦½ÃÇÑ´Ù!

    /* Find the keys using depth-first */

    #include "stdio.h"

    #define MAX 100

    /* structure of the flight database (db) */

    struct FL {

      char from[20];

      char to[20];

      char skip;     

    };

    struct FL flight[MAX];     /* array of db structures */

    int f_pos=0;         /* number of entries in flight db */

    int find_pos=0;     /* index for searching flight db */

     

    int tos=0;            /* top of stack */

    struct stack {

      char from[20];

      char to[20];

    };

    struct stack bt_stack[MAX];       /* backtrack stack */

     

    main()

    {

      char from[20], to[20];

      setup();

      iskeys("front_door", "keys");

      route(to);

    }

     

    setup()

    {

      assert_keys("front_door", "lr");

      assert_keys("lr", "bath");

      assert_keys("lr", "hall");

      assert_keys("hall", "bd1");

      assert_keys("hall", "bd2");

      assert_keys("hall", "mb");

      assert_keys("lr", "kitchen");

      assert_keys("kitchen", "keys");

    }

     

    /* place facts into database */

    assert_keys(from, to)

    char *from, *to;

    int dist;

    {

      if (f_pos<MAX) {

        strcpy(keys[f_pos].from, from);

        strcpy(keys[f_pos].to, to);

        keys[f_pos].skip=0;

        f_pos++;

      }

      else printf("keys database full. ¡¬n");

    }

     

    /* show the route */

    route(to)

    char *to;

    {

      int dist, t;

      dist=0;

      t=0;

      while(t<tos) {

        printf("%s ", bt_stack[t].from);

        t++;

        if (t<tos)  printf(" to ");

      }

      printf("¡¬n");

    }

     

    match(from, to)

    char *from, *to;

    {

      register int t;

      for (t=f_pos-1; t>-1; t--)

        if (!strcmp(keys[t].from, from) && !strcmp(keys[t].to, to))

          return 1;

        return 0;    /* not found */

    }

     

    /* given from, find anywhere */

    find(from, anywhere)

    char *from, *anywhere;

    {

      find_pos=0;

      while (find_pos<f_pos) {

        if (!strcmp(keys[find_pos].from, from) && !keys[find_pos].skip) {

          strcpy(anywhere, keys[find_pos].to);

          keys[find_pos].skip=1;     

          return 1;

        }

        find_pos++;

      }

      return 0;

    }

     

    /* determine if there is a route between from and to */

    iskeys(from, to)

    char *from, *to;

    {

      char anywhere[20];

      if (match(from, to)) {

        push(from, to);      

        return;

      }

      if (find(from, anywhere)) {

        push(from, to);

        iskeys(anywhere, to);

      }

      else if (tos>0) {

        pop(from, to);

        iskeys(from, to);

      }

    }

     

    /* stack routines */

    push(from, to)

    char *from, *to;

    {

      if (tos<MAX) {

        strcpy(bt_stack[tos].from, from);

        strcpy(bt_stack[tos].to, to);

        tos++;

      }

      else printf("stack full. ¡¬n");

    }

    pop(from, to)

    char *from, *to;

    {

      if (tos>0) {

        tos--;

        strcpy(from, bt_stack[tos].from);

        strcpy(to, bt_stack[tos].to);

      }

      else printf("stack underflow. ¡¬n");

    }