Кіріспе

Іздеу алгоритмі – математикалық оңтайландыруда қолданылатын сызықтық іздеу алгоритмі. Backtracking – шектеулерді қанағаттандыру мәселелері сияқты, кейбір есептеулік мәселелерді шешуге арналған алгоритмдер класы, ол шешімдерге үміткерлерді бірте-бірте құрастырады және кандидаттың дұрыс шешімге толықтырылуы мүмкін емес екенін анықтағанда одан бас тартады ("кері оралады"). Backtracking-тің классикалық мысалы – сегіз патшайымның мәселесі, ол стандартты шахмат тақтасында бір-біріне шабуыл жасамау үшін сегіз патшайымды орналастырудың барлық мүмкіндіктерін табуды талап етеді. Кері қадам жасаудың әдеттегі тәсілінде, ішінара үміткерлер – тақтаның алғашқы k қатарындағы k патшайымның орналасуы, барлығы әртүрлі қатарлар мен бағандарда орналасқан. Егер жартылай шешімде бір-біріне шабуыл жасайтын екі патшайым болса, онда одан бас тартуға болады. Backtracking тек "ішінара үміткерлік шешім" ұғымын қабылдайтын және оның жарамды шешімге толықтырылу мүмкіндігін салыстырмалы түрде жылдам тексеруге болатын мәселелер үшін ғана қолданылуы мүмкін. Мысалы, ретсіз кестеде белгілі бір мәнді табу үшін ол тиімсіз. Дегенмен, қолданылған жағдайда, backtracking барлық толық үміткерлерді қарапайым түрде санаудан әлдеқайда жылдам, өйткені ол бір тексеру арқылы көптеген үміткерлерді жоюға мүмкіндік береді. Backtracking – кроссвордтар, сөздік арифметика, Судоку және басқа да көптеген мәселелер сияқты шектеулерді қанағаттандыру мәселелерін шешу үшін маңызды құрал. Бұл көбінесе талдау, рюкзак мәселесі және басқа да комбинаторлық оңтайландыру мәселелері үшін ең ыңғайлы техника болып табылады. Бұл сонымен қатар Icon, Planner және Prolog бағдарламалау тілдерінде қолданылатын бағдарламаны орындау стратегиясы болып табылады. Backtracking шешілетін мәселені, ішінара үміткерлердің сипатын және оларды толық үміткерлерге қалай кеңейту керектігін анықтайтын пайдаланушы берген "қара жәшік процедураларына" тәуелді. Сондықтан ол нақты алгоритм емес, метаэвристика болып табылады, бірақ басқа көптеген метаэвристикалардан айырмашылығы, ол шекті мәселенің барлық шешімдерін шектелген уақыт ішінде табуға кепілдік береді. "Backtrack" термині 1950 жылдары американдық математик Д. Х. Лемермен енгізілген. 1962 жылғы SNOBOL жолдарды өңдеудің алғашқы тілі, жалпы кері қадам жасау мүмкіндігін ұсынған алғашқы тіл болған деуге болады.

Әдістің сипаттамасы

Артқа қарай іздеу алгоритмі берілген мәселенің барлық мүмкін шешімдерін алу үшін әртүрлі тәсілдермен толықтырылуы мүмкін ішінара үміткерлер жиынтығын қарастырады. Толықтыру кезең-кезеңмен, үміткерлерді кеңейту қадамдарының тізбегі арқылы жүзеге асырылады. Теориялық тұрғыдан алғанда, ішінара үміткерлер ағаш құрылымының түйіндері ретінде, яғни іздеу ағашы ретінде бейнеленеді. Әрбір ішінара үміткер – одан бір кеңейту қадамымен ерекшеленетін үміткерлердің «анасы» болып табылады; ал ағаштың жапырақтары – одан әрі кеңейтілмейтін ішінара үміткерлер. Артқа қарай іздеу алгоритмі осы іздеу ағашын түбірден бастап төменге қарай, тереңдік бойынша рекурсивті түрде шарлайды. Әрбір *c* түйінде алгоритм *c*-нің жарамды шешімге толықтырылу мүмкіндігін тексереді. Егер бұл мүмкін болмаса, *c*-де тамырланған бүкіл кіші ағаштан бас тартқызылады (қырқылады). Әйтпесе, алгоритм (1) *c*-нің өзі жарамды шешім екенін тексереді және егер олай болса, оны пайдаланушыға хабарлайды; және (2) *c*-нің барлық кіші ағаштарын рекурсивті түрде қарастырады. Бұл екі тест және әрбір түйіннің ұрпақтары пайдаланушы ұсынған процедуралармен анықталады. Сондықтан, алгоритммен шарлаған нақты іздеу ағашы – әлеуетті ағаштың бір бөлігі ғана. Алгоритмнің жалпы құны – нақты ағаштың түйіндерінің саны мен әрбір түйіннің алу және өңдеу құнының көбейтіндісіне тең. Бұл факт іздеу ағашын таңдағанда және қырқу тестін іске асырғанда ескерілуі керек.

Пайдалануға қатысты ескертулер

Жоққа шығару процедурасы бульдік мәнді функция болуы керек, егер c-ның ешқандай мүмкін кеңейтілімі P үшін жарамды шешім болмаса, ол тек қана шындық мәнін қайтарады. Егер процедура нақты қорытындыға келе алмаса, жалған мәнін қайтаруы керек. Дұрыс емес шындық нәтижесі кері жолға оралу процедурасының кейбір жарамды шешімдерді жіберіп алуына себеп болуы мүмкін. Процедура reject(P,t) іздеу ағашындағы c-ның барлық t ата-бабалары үшін жалған мәнін қайтарды деп есептеуі мүмкін. Керісінше, кері іздеу алгоритмінің тиімділігі түбірге мүмкіндігінше жақын кандидаттар үшін жоққа шығару процедурасының шындық мәнін қайтаруына байланысты. Егер reject әрқашан жалған мәнін қайтарса, алгоритм барлық шешімдерді табады, бірақ ол түйіндемелі іздеуге тең болады. Қабылдау процедурасы c проблеманың P мысалы үшін толық және жарамды шешім болса шындық мәнін, әйтпесе жалған мәнін қайтаруы керек. Ол c ішінара үміткері және оның ағаштағы барлық ата-бабалары жоққа шығару тестінен өтті деп есептеуі мүмкін. Жоғарыдағы жалпы псевдокод жарамды шешімдер әрқашан әлеуетті іздеу ағашының жапырақтары болады деп есептемейді. Басқаша айтқанда, ол P үшін жарамды шешімді басқа жарамды шешімдерді алу үшін одан әрі кеңейту мүмкіндігін мойындайды. Бірінші және келесі процедуралар кері іздеу алгоритмімен ағаштың c түйінінің балаларын санау үшін қолданылады, яғни c-ден бір кеңейту қадамымен ерекшеленетін үміткерлер. Бірінші шақыру first(P,c) c-ның бірінші баланы белгілі бір тәртіппен қайтаруы керек; ал келесі шақыру next(P,s) сол тәртіппен s түйінінің келесі туысын қайтаруы керек. Егер сұралған бала болмаса, екі функция да ерекше "NULL" үміткерін қайтарады. Бірге түбір, бірінші және келесі функциялар ішінара үміткерлер жиынтығын және әлеуетті іздеу ағашын анықтайды. Оларды P-нің әрбір шешімі ағашта бір жерде кездесуі үшін және ешқандай ішінара үміткер бір реттен артық кездеспеуі үшін таңдау керек. Сонымен қатар, олар тиімді және нәтижелі жоққа шығару шартын қабылдауы керек.

Ерте тоқтату нұсқалары

Жоғарыдағы псевдокод P берілген мысалына шешім болатын барлық үміткерлер үшін нәтижені шығарады. Алгоритмді бірінші шешімді тапқаннан кейін, немесе белгілі бір мөлшердегі шешімдерді тапқаннан кейін тоқтатуға болады; сондай-ақ, белгілі бір сандағы жартылай үміткерлерді тексергеннен кейін немесе белгілі бір көлемдегі процессор уақытын жұмсағаннан кейін тоқтатуға болады.