Monday, October 23, 2017

आर्टिफीसियल इंटेलिजेंस में Search algorithm किसी समस्या के समाधान का खोजने का एक व्यापक तरीका है. यहाँ कुछ एकल-खिलाड़ी खेल जैसेकि- सुडोकु, क्रॉसवर्ड आदि हैं, जिनमें search algorithm आपको किसी विशेष स्थिति को खोजने या उस स्थिति में निर्णय लेने में आपकी मदद करती है.

Single Agent Pathfinding Problem

अनेक खेल जैसेकि 3X3 eight-title,  4X4 fifteen title, और 5X5 twenty four title puzzle (पहेली), single agent pathfinding खेल हैं. इसमें अनेक titles की एक matrix (सारणिक) होती है जिसमें अनेक खाली title भी होते हैं. एक खिलाड़ी को इन titles को खाली स्थान पर खिसकाकर लंबवत या आड़ इस तरह से व्यवस्थित करना होता है की वह एक लक्ष्य को पा सके.
Single agent pathfinding problem अन्य उदाहरण हैं-  Travelling Salesman Problem, Rubik’s Cube, और Theorem Proving.

Search terminology (शब्दावली)

Problem Space – यह वह environment है जहां search अपना काम करती है. जिसमें states का set, और state को बदलने वाले operators का set  सम्मिलित हैं.
Problem Instance - इसमें Initial state + Goal state सम्मिलित हैं.
Problem Space Graph – यह problem state का प्रतिनिधित्व करती है. State को node और operator को edge से दिखाया जाता है.
Depth of a problem – सबसे छोटे रास्ते की लंबाई (Length of a shortest path) या operator की सबसे छोटी श्रृंखला (shortest sequence), Initial State (प्रारंभिक अवस्था) से goal state (लक्ष्य अवस्था) तक.
Space Complexity – node की अधिकतम संख्या जो कि memory में संग्रहित हो सकती है.
Time Complexity – अधिकतम node की संख्या जिनका सृजन किया जा सकता है.
Admissibility − एल्गोरिथम की वह विशेषता जिससे हमेशा optimal solution पाया जा सके.
Branching Factor − Problem space graph में child node की औसत संख्या.

Brute-Force Search Strategies

यह सबसे सरल हैं, क्योंकि इन्हें domain-specific knowledge की जरूरत नहीं होती है. यह कम संख्या में संभावित अवस्थाओं में बहुत अच्छा काम करती है.
इसके लिए निम्न चीजों की जरूरत होती है
·         State description (स्थिति का विवरण)
·         A set of valid operators (उचित आपरेटर का समुच्चय)
·         Initial state (प्रारंभिक स्थिति)
·         Goal state description (लक्ष्य का विवरण)

Breadth-First Search

इसमें शुरूआत root node से करते हैं, फिर सबसे पहले neighboring nodes का परीक्षण करते हैं और फिर अगले level के  neighbors को देखते हैं. यह एक बार में एक tree को बनाता है जबतक की solution (समाधान) नहीं मिल जाए. इसका उपयोग FIFO (First In First Out) queue data structure का प्रयोग करके भी किया जा सकता है.  यह तरीका (method) किसी समस्या का shortest path उपलब्ध करता है.
Theorem: यदि branching factor (किसी node के लिए child node की औसत संख्या)  और depth  है तब level  पर node की संख्या  होगी.
Corollary: सबसे खराब स्थिति में create की गई कुल node की संख्या होगी  .
दोष- चूकीं प्रत्येक level पर nodes को बचाकर रखा जाता है, अगली node को create करने के लिए, यह काफी ज्यादा memory space घेरती है.  Nodes को store करने के लिए   Space requirement, exponential होती है.
इसकी complexity, nodes की संख्या पर निर्भर करती है. यह duplicate nodes की जांच कर सकती है.

Depth-First Search

इसका उपयोग Last In First Out (LIFO) data structure में भी किया जाता है. इसमें भी node का वही set मिलता है जैसेकि Breadth-First search  में method में मिलता है, केवल उसका क्रम (order) होता है.
प्रत्येक iteration में किसी एक रास्ते (path) में root से leaf तक पड़ने वाली nodes को संग्रहित किया जाता है, इस कारण nodes को संग्रहित करने के लिए space requirement, रैखिक (linear) होती है. यदि branching factor band depth, m है, तब storage space bm होगी.
दोष – इस एल्गोरिथम को terminate नहीं किया जा सकता है और यह एक ही रास्ते पर अनंत बार (infinitely) जा सकती है. इस समस्या का समाधान है की cut-off depth का प्रयोग करें. यदि आदर्श (ideal)  cut-off, d, और यदि चयन किया गया cut-off, d से कम है, तब यह एल्गोरिथम असफल हो सकती है. यदि चयन किया cut-off, d से ज्यादा है, तब निष्पादन का समय (execution time) बढ़ सकता है.
इसकी paths की संख्या पर complexity निर्भर करती है. यह duplicate nodes की जांच नहीं कर सकता है.

Bidirectional Search

यह search आगे की ओर बढ़ती है initial state से और goal state से पीछे की तरफ चलती है जबतक की दोनों मिलने के लिए एक common state  की पहचान न कर लें.
चूंकि Initial state से चलने वाला path उस रास्ते से मिलता है जो goal state से उलटा चलता है. प्रत्येक search को total path का आधा ही करना होता है.

Uniform Cost Search

यह सबसे कम कीमत की नोड़ (least cost node) का विस्तार करती हैं. यह Breadth First search के समान ही है यदि विस्तार एक ही लागत (cost) का हो.
यह भिन्न रास्तों (paths) को बढ़ती कीमत के आधार पर खोजती है.
दोष – यहां पर अनेक लंबे रास्ते (paths) हो सकते हैं जिनकी लागत (cost) ≤ C* हो. तब Uniform Cost search को सभी का विश्लेषण करना होता है.

Iterative Deepening Depth-First Search

यह level 1 पर हमेशा depth-first search को करती है, शुरूआत करते हुए फिर से level 2 पर depth-first search करती है, और इसी तरह से तब तक कार्यवाही करती है जब तक कोई solution नहीं मिल जाए.
यह तब तक किसी node का सृजन नहीं करती है जबतक सभी  lower nodes, का सृजन न कर लिया जाए. यह एल्गोरिथम तब काम करना बंद करती है जब वह गहराई (depth) d पर समाधान खोज लेती है. गहराई (depth) d  पर नोड की संख्या bd और गहराई d-1 पर यह bd-1 होगी.

भिन्न एल्गोरिथम की जटिलता की  तुलना

भिन्न एल्गोरिथम की भिन्न मानकों के अनुसार तुलना
Criterion
Breadth First
Depth First
Bidirectional
Uniform Cost
Interactive Deepening
Time
bd
bm
bd/2
bd
bd
Space
bd
bm
bd/2
bd
bd
Optimality
हाँ
नहीं
हाँ
हाँ
हाँ
Complex
हाँ
नहीं
हाँ
हाँ
हाँ

Informed (Heuristic) Search Strategies

बड़ी समस्याओं को हल करने के लिए जिसमें काफी संख्या में संभावित अवस्थाएं हों, problem-specific knowledge को भी जोड़ने की जरूरत होती है जिससे की search algorithm की दक्षता को बढ़ाया जा सके.

Heuristic Evaluation Functions

यह दो states के बीच optimal path की cost की गणना करता है. Sliding-tiles games के लिए एक heuristic function की गणना यह गिनते हुए की जाती है की प्रत्येक tiles ने कितने moves  लिए अपनी goal state से और फिर इन tiles के सभी moves को जोड़ा जाता है.

Pure Heuristic Search

यह nodes का विस्तार करता है उनकी heuristic values के अनुसार. यह दो lists तैयार करता है, एक बंद लिस्ट (closed list) पहले से विस्तरित नोड़ (expanded nodes) के लिए और खुली लिस्ट (open list) बनाए जाने वाली अविस्तारित नोड़ों (unexpanded nodes) के लिए.
प्रत्येक iteration, में वह नोड़ जिसकी minimum heuristic value  है उसका विस्तार (expand) करते हैं, उसकी सभी child nodes का सृजन किया जाता है और उन्हें बंद लिस्ट (closed list) में रखते है. तब, heuristic function को child nodes पर प्रयोग करते है और उन्हें खुली लिस्ट (open list) में रखा जाता है उनकी heuristic value के अनुसार.  सबसे छोटे रास्तों (shorter paths) को save करते हैं और लम्बे रास्तों का त्याग (dispose) कर देते हैं.

A * Search

यह Best First search का सबसे ज्यादा जाने जाना वाला प्रकार है. यह उन रास्तों को पहले से छोड़ देता है जो पहले से महंगे (expensive), परंतु सबसे ज्यादा भरसे वाले रास्तों का विस्तार करता है.
f(n) = g(n) + h(n), जहां
g(n), node n तक पहुंचने की लागत (cost).
h(n), node n से लक्ष्य (goal) तक पहुंचने की अनुमानित लागत (estimated cost).
f(n), node n से लक्ष्य (goal) तक पहुंचने वाले रास्ते की अनुमानित कुल लागत (estimated total cost). इसके लिए f(n) को बढ़ाते हुए priority queue का प्रयोग करते हैं.

Greedy Best First Search

यह उन node से शुरूआत करते हैं जिनकी की लक्ष्य (goal) के पास दिखने की संभावना दिखती है. यह nodes का विस्तार f(n) = h(n) पर आधारित होकर priority queue का प्रयोग करती है.
दोष −  यह loop में फंस सकती है. जो कि optimal न हो.

Local Search algorithm

यह संभावित समाधान (prospective solution) से शुरूआत करती है और फिर पड़ोस में समाधान (neighboring solution) को खोजती है. यह वापस उचित समाधान (valid solution) पर आ सकते हैं यदि उन्हें किसी भी समय interrupt कर दिया जाए अंत से पहले.

Hill-Climbing Search

यह एक iterative algorithm है यह एक arbitrary solution से शुरूआत करती है और फिर बेहतर solution को पाने की कोशिश करती है solution के एक बार में एक element को  बदलते हुए.  यदि बदलाव बेहतर solution देता है, तब इस बदलाव को नए solution की तरह से प्रयोग किया जाता है. इस प्रक्रिया को तब तक निरंतर दुहराया जाता है जब तक बेहतर सुधार मिलना बंद न हो जाए.
Function Hill-Climbing (problem), उस state को वापस करता है जो कि local maximum होती है.
inputs: problem, a problem
local variables: current, a node
                 neighbor, a node
current <-Make_node(Initial-State[problem])
loop
   do neighbor <- a highest_valued successor of current
      if Value[neighbor] ≤ Value[current] then
      return State[current]
      current <- neighbor                
end
दोष − यह एल्गोरिथम न तो पूर्ण है और न ही यह optimal है.

Local Beam Search

इस एल्गोरिथम में, यह किसी समय में k, states को संज्ञान में लेती है. शुरुआत में यह states आमतौर पर randomly, generate की जाती है. इन k states के successors की गणना objective function की मदद से की जाती है. यदि इनमें से किसी successors से objective function की maximum value मिलती है, तब यह एल्गोरिथम stop हो जाती है. अन्यथा, (initial k states और k number of successors of the states = 2k) states को pool में रखा जाता है. Pool को तब numerically, sort किया जाता है. Highest k states का नई  initial states के लिए चयन किया जाता है. इस प्रक्रिया को निरंतर किया जाता है जब तक maximum value को नहीं पा लिया जाए.
Function BeamSearch (problem, k), solution state को वापस करता है.
start with k randomly generated states
loop
   generate all successors of all k states
   if any of the states = solution, then return the state
   else select the k best successors
end

Simulated Annealing

Annealing किसी धातु को गर्म करने और ठंडा करने की प्रक्रिया है जिससे की उसकी आंतरिक संरचना (internal structure) को उसके भौतिक गुणों (physical properties) में बदलाव के लिए बदला जा सके. जब धातु ठंडी होती है, उसकी नई संरचना पकड़ बनाती है, और धातु इन गुणों को ग्रहण कर लेती है. इस प्रक्रिया को करते समय तापमान में निरंतर बदलाव बनाए रखा जाता रहता है.
हम शुरूआत में तापमान ज्यादा रखते हैं और फिर उसे ठंडा होने देते हैं जैसाकी एल्गोरिथम (प्रक्रिया) अनुमति देती है. जब  तापमान ज्यादा होता है तब एल्गोरिथम सबसे खराब समाधान को स्वीकार करने की अनुमति देती है.
Start
Initialize k = 0; L = integer number of variables;
From i → j, search the performance difference ∆.
If ∆ <= 0 then accept else if exp(-D/T(k)) > random(0,1) then accept;
Repeat steps 1 and 2 for L(k) steps.
k = k + 1;
Repeat steps 1 through 4 till the criteria is met.
End

Travelling Salesman Problem

इस algorithm का उद्देश्य कम खर्च में यात्रा की योजना बनाना है जो कि एक शहर से शुरू होती है, जिसमें रास्ते में पड़ने वाले सभी शहरों में एक बार जाना होता है और अंत में शुरुआत करने वाले शहर में यात्रा खत्म करनी होती है.

Start
सभी संभावित (n -1)! समाधानों को खोजें, जहां n कुल शहरों की संख्या है.
सबसे कम लागत का निर्धारण करें (n -1)! समाधानों की लागत की गणना करते हुए.
अंततः, सबसे कम यात्रा लागत को रखें.