Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритмдеу жане багдарламалау негиздери 4 г.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
2.73 Mб
Скачать

24 Дәріс тақырыбы: Жолды өңдеу алгоритмі. Рабин алгоритмі.

Бұл алгоритм қарапайым идеяға негізделген. М ұзындықты сөзде п ұзындығының үлгісін іздейміз. П өлшемді шағын терезе оямыз және оның кірістік сөзі бойымен қозғалатын боламыз. Бізді шағын терезедегі сөз берілген үлгімен сәйкес келіп келмейтіндігі қызықтырады. Әріптер бойынша ұзақ салыстыру. Мұның орнына п ұзындықты сөздерде анықталған кейбір функцияны белгілейміз. Егер осы функцияның мәні шағын терезедегі сөзде және үлгіде әр түрлі болса, онда сәйкестік жоқ. Егер мәндер бірдей болса ғана әріптер бойынша сәйкестікті тексеру қажет.

Мұндай тәсілдің пайдасы қандай. Шағын терезедегі сөзге функцияның мәнін есептеу үшін осы сөздің барлық әрпін оқу қажет. Оларды үлгімен бірден салыстырған дұрыс. Шағын терезені ығыстырған кезде сөз толығымен өзгермейді, тек қана соңына әріп жалғанады және басында алып тасталады.

Функцияны есептеу үшін қолайлы мысал келтіру.

Шешім. Сөздегі және үлгідегі барлық әріптерді тұтас сандар болып табылатын олардың нөмірлерімен ауыстырамыз. Сонда қолайлы функция цифрлар сомасы болып табылады. (Шағын терезені ығыстырған кезде жаңа сан қосу және жоғалғанын шығарып тастау қажет).

Әрбір функция үшін ол нашар қолданылатын сөз болады. Бірақ басқа функция бұл жағдайда жақсы жұмыс жасауы мүмкін. Мынадай идея туындайды: көп функция жинап алу қажет және алгоритм жұмысының басында олардың арасынан кез-келгенін таңдап алу.

Қолайлы функциялар үйіріне мысал келтірейік.

Шешім. Р кез келген санын және р модулі бойынша х кез келген қалдығын таңдап аламыз. П ұзындығының әрбір сөзін бүтін сандардың тізбегі ретінде (әріптерді кодтармен алмастырып) қарастырамыз. Бұл сандарды п-1 дәрежесінің көпмүше коэффициенті ретінде қарастыратын боламыз және осы көпмүшенің мәнін х нүктесінде р модулі бойынша есептейміз. Бұл үйірдің функцияларының бірі болады (р және х әрбір жұбы үшін өз функциясы алынады). Терезені 1-ге ығыстыру үлкен мүшенің азайтуына, х-қа көбейтуге және бос мүше қосуға сәйкес келеді.

Келесі пікір сәйкестік дәл мүмкін еместігін білдіреді. Р саны белгіленген және жай сан, ал Х пен Ү – п ұзындығының екі түрлі сөзі болсын делік. Сонда оларға түрлі көпмүшелер сәйкес келеді (біз барлық әріптердің кодтары түрліше - бұл егер р алфавит әрпі сандарынан үлкен болса мүмкін деп болжаймыз). Функциялар мәнінің сәйкестігі х нүктесінде осы екі түрлі көпмүшелер сәйкес келетінін, яғни олардың айырымы 0-ге айналатынын білдіреді. Айырым п-1 дәрежесінің көпмүшесі және п-1 –ден артық емес түбірі болады. Осылайша, егер р көп кем болса, онда х кездейсоғының сәтсіз нүктеге түсу мүмкіндігі аз.

25 Дәріс тақырыбы: Қайталанбалы алгоритм.

Программалаудың ерекше көңіл бөлетін саласы- жасанды интелект деп аталатын есептер. Бұл жерде біз шешімді берілген есептеу ережелері бойынша емес, байқап көрулер мен қателіктер арқылы іздейтін алгоритмдермен жұмыс жасаймыз. Әдетте байқап көрулер мен қателіктер процесі жеке есептерге бөлінеді. Көбінесе осы есептер рекурсия терминдерінде барынша табиғи көрінеді және ішкі есептің соңғы санын зерттеуді талап етеді. Жалпы түрде барлық процесті ішкі есеп ағашын тұрғызатын (және кесетін) іздеу процесі ретінде ойластыруға болады. Көптеген проблемаларда мұндай іздеу ағашы өте тез өседі, өсу есептің өлшемдеріне байланысты және көбінесе экспоненциальды болады. Сәйкесінше іздеу құны да артады. Кейде кейбір эвристиканы пайдалана отырып, іздеу ағаштарын қысқартуға болады, осылайша есептеу шығындарын белгілі бір шектерге дейін жеткізуге болады.

Біз эвристиканың жалпы ержелерін талқылауды мақсат еткен жоқпыз. Жасанды интелект есебі кіші есептерге бөлінеді, бұл ретте рекурсияны қолдануды талқылаймыз. Негізгі әдістерді көрсетуді жақсы таныс аттың жүрісі туралы есеп мысалынан бастаймыз.

Өлшемі п х п, яғни п2 өрісінен тұратын тақта берілген. Бастапқыда Х0, У0 координаттары бар өрісте әдеттегі шахмат ережесі бойынша алмасып отыратын фигура-ат орналасады. Есеп ат тақтаның барлық өрістерінде дәл бір рет болатын (тақтаны айналып шығады) жүрістер тізбегін іздеуден тұрады, яғни п2-1 жүрістерін есептеу қажет.

п2 өрісін айналып өту есебін ықшамдаудың анық тәсілі – барынша қарапайым шешу: кезекті жүрісті орындау немесе ешқандай жүріс мүмкін еместігін дәлелдеу. Сондықтан кезекті жүрісті орындау алгоритмін анықтаудан бастаймыз. Оның бірінші нұсқасы былайша көрінеді:

PROCEDURE TryNextMove;

BEGIN жүрісті таңдауды иницилизациялау;

REPEAT жүрістер тізімінен кезекті кандидатты таңдау;

IF THEN BEGIN жүріс жазбасына сәйкес келеді;

IF тақта толтырылмаған THEN BEGIN TryNextMove;

IF сәтсіздік THEN BEGIN алдыңғы жүрісті жою

END

END

END

UNTIL сәттілік OR енді кандидаттар жоқ

END; {TryNextMove}

Егер біз бұл алгоритмді барынша егжей-тегжейлі суреттегіміз келсе, онда деректер үшін кейбір түсініктерді таңдау қажет. Тақтаны ең қарапайымы матрица ретінде елестетуге болады, оны һ деп атаймыз. Сонымен қатар

TYPE index = 1. . n;

VAR h; ARRAY index, index OF INTEGER;

мәндерін индекстеу үшін типтер енгіземіз.

Біз тақтамен жылжу тарихын білгіміз келетіндіктен, оның өрісін тек қана өрістің бос болуын анықтауға мүмкіндік беретін булевтік мәндермен емес бүтін сандармен беретін боламыз. Мұндай келісімдерге тоқталуға болады:

h [х, у] = 0: (х, у) өрісіне барылған жоқ;

h [х, у] = i: (х, у) өрісіне і- жүрісте барылды.

Енді сәйкес өлшемдерді таңдау қажет. Олар келесі жүрістің бастапқы шартын және нәтижесін (егер жүріс жасалынған болса) анықтауы тиіс. Бірінші жағдайда (х,у) өрісінің координаттарын сұрау қажет, осыдан жүріс пен жүрістің нөмірін көрсететін і саны шығады (белгілеу үшін). Нәтижесі үшін булев өлшемі талап етіледі; егер ол – “шындық” болса, онда жүріс мүмкін болады. Осылайша біз келесі нұсқаға көшеміз.

Қабылданған шешімдер негізінде қандай операторларды нақтылауға болады? Тақта шарты толтырылмағаны анық, i < п2 сияқты қайта жазуға болады. Мұнан басқа егер мүмкін болатын жүріс үшін аттың «секіруі» ережесіне сәйкес анықталатын u және v екі жергілікті айнымалыларын енгізсек, онда сәйкес “ыңғайлы” предикатын шарттың логикалық конъюнкциясы сияқты көрсетуге болады, жаңа өріс (1<u<n и 1<v<n) тақтасының шегінде болады және (huv = 0) әрі бармаған.

Мүмкін болатын жолдың фиксациясы huv := i меншіктеуінің көмегімен, ал жою - huv := 0 көмегімен орындалады. Егер q1 жергілікті айнымалысын енгізсек және оны осы алгоритмге рекурсивті қатынаулар кезінде параметр-нәтиже ретінде пайдаланса, онда q1 сәттіліктің орнына қоюға болады. Осылайша біз келесі вариантқа келеміз:

PROCEDURE Try(i: INTEGER; х, у: index; VAR q; BOOLEAN);

VAR u, v: INTEGER; q1: BOOLEAN;

BEGIN жүрісті таңдауды инициализациялау;

REPEAT <u, v> - шахмат ережесімен анықталатын келесі жүрістің координаттары;

IF (1 <= u) and (u <= n) and (1 <= v) and (v <= n) and (h[u,v] = 0)

THEN BEGIN

h[u,v] := i;

IF i < n*n THEN Try(i+1, u, v,q1);

IF not q1 THEN h[u,v] =0 ELSE q1:=TRUE

END

UNTIL q1 OR басқа жүрістер жоқ;

q := q1

END; {Try}