آموزش هوش مصنوعی با پایتون - جستجوی اکتشافی

جستجوی اکتشافی نقش کلیدی در هوش مصنوعی دارد. در این فصل، با جزئیات درباره آن یاد خواهید گرفت.

مفهوم جستجوی اکتشافی در هوش مصنوعی

روش اکتشافی، قاعده‌ای سرانگشتی است که ما را به سمت راه‌حل احتمالی هدایت می‌کند. بیشتر مسائل در هوش مصنوعی ماهیتی نمایی دارند و دارای راه‌حل‌های احتمالی بسیاری هستند. شما دقیقاً نمی‌دانید کدام راه‌حل‌ها درست هستند و بررسی تمام راه‌حل‌ها هزینه بسیار زیادی خواهد داشت.

بنابراین، استفاده از روش اکتشافی دامنه جستجو برای یافتن راه‌حل را محدود می‌کند و گزینه‌های نادرست را حذف می‌کند. به روشی که در آن از روش اکتشافی برای هدایت جستجو در فضای جستجو استفاده می‌شود، جستجوی اکتشافی گفته می‌شود. تکنیک‌های اکتشافی بسیار مفید هستند، زیرا استفاده از آن‌ها می‌تواند فرایند جستجو را سرعت ببخشد.

تفاوت بین جستجوی ناآگاهانه و آگاهانه

دو نوع راهبرد کنترلی یا تکنیک جستجو وجود دارد: ناآگاهانه و آگاهانه. در ادامه، این دو نوع به‌تفصیل توضیح داده شده‌اند:

جستجوی ناآگاهانه

این روش با نام جستجوی کور یا راهبرد کنترل کور نیز شناخته می‌شود. دلیل این نام‌گذاری آن است که فقط اطلاعات مربوط به تعریف مسئله در دسترس است و هیچ اطلاعات اضافی دیگری درباره حالت‌ها وجود ندارد. این نوع تکنیک‌های جستجو برای یافتن راه‌حل، کل فضای حالت را جستجو می‌کنند. جستجوی سطح‌اول (BFS) و جستجوی عمق‌اول (DFS) نمونه‌هایی از جستجوی ناآگاهانه هستند.

جستجوی آگاهانه

این روش با نام جستجوی اکتشافی یا راهبرد کنترل اکتشافی نیز شناخته می‌شود. دلیل این نام‌گذاری آن است که اطلاعات اضافی‌ای درباره حالت‌ها در دسترس است. این اطلاعات اضافی برای محاسبه اولویت گره‌های فرزند جهت بررسی و گسترش آن‌ها مفید است. برای هر گره، یک تابع اکتشافی در نظر گرفته می‌شود. جستجوی بهترین‌اول (BFS)، الگوریتم A*، میانگین و تحلیل، نمونه‌هایی از جستجوی آگاهانه هستند.

مسائل ارضای محدودیت (CSPs)

محدودیت به معنای قید یا محدودسازی است. در هوش مصنوعی، مسائل ارضای محدودیت مسائلی هستند که باید با رعایت برخی محدودیت‌ها حل شوند. هنگام حل چنین مسائلی، باید تمرکز اصلی بر نقض نکردن محدودیت‌ها باشد. در نهایت، هنگامی که به راه‌حل نهایی می‌رسیم، مسئله ارضای محدودیت باید با تمام قیود تعیین‌شده سازگار باشد.

حل مسائل دنیای واقعی با استفاده از ارضای محدودیت

در بخش‌های قبلی، به ایجاد مسائل ارضای محدودیت پرداختیم. اکنون بیایید این روش را برای مسائل دنیای واقعی نیز به کار ببریم. برخی از نمونه‌های مسائل دنیای واقعی که با استفاده از ارضای محدودیت حل می‌شوند، عبارت‌اند از:

حل رابطه جبری

با کمک مسئله ارضای محدودیت، می‌توانیم روابط جبری را حل کنیم. در این مثال، تلاش می‌کنیم رابطه جبری ساده a*2 = b را حل کنیم. این برنامه مقادیر a و b را در محدوده‌ای که تعیین می‌کنیم، برمی‌گرداند.

پس از تکمیل این برنامه پایتون، می‌توانید مبانی حل مسائل با استفاده از ارضای محدودیت را درک کنید.

توجه داشته باشید که پیش از نوشتن برنامه، باید بسته پایتون با نام python-constraint را نصب کنیم. می‌توانید آن را با استفاده از دستور زیر نصب کنید:

pip install python-constraint

مراحل زیر یک برنامه پایتون برای حل رابطه جبری با استفاده از ارضای محدودیت را نشان می‌دهند:

بسته constraint را با استفاده از دستور زیر وارد کنید:

from constraint import *

اکنون، همان‌طور که در ادامه نشان داده شده است، یک شیء از ماژول با نام problem() ایجاد کنید:

problem = Problem()

اکنون، متغیرها را تعریف کنید. توجه داشته باشید که در اینجا دو متغیر a و b داریم و بازه آن‌ها را با استفاده از 10 تعریف می‌کنیم؛ این یعنی راه‌حل را در میان 10 عدد اول پیدا خواهیم کرد.

problem.addVariable('a', range(10))
problem.addVariable('b', range(10))

در مرحله بعد، محدودیت مشخصی را که می‌خواهیم روی این مسئله اعمال کنیم، تعریف کنید. توجه داشته باشید که در اینجا از محدودیت a*2 = b استفاده می‌کنیم.

problem.addConstraint(lambda a, b: a * 2 == b)

اکنون، با استفاده از دستور زیر، شیء مربوط به ماژول getSolution() را ایجاد کنید:

solutions = problem.getSolutions()

در آخر، خروجی را با استفاده از دستور زیر چاپ کنید:

print (solutions)

خروجی برنامه بالا به شکل زیر خواهد بود:

[{'a': 4, 'b': 8}, {'a': 3, 'b': 6}, {'a': 2, 'b': 4}, {'a': 1, 'b': 2}, {'a': 0, 'b': 0}]

مربع جادویی

مربع جادویی آرایشی از اعداد متمایز، معمولاً اعداد صحیح، در یک شبکه مربعی است که در آن مجموع اعداد هر سطر، هر ستون و هر قطر با یکدیگر برابر است. این مقدار یکسان را ثابت جادویی می‌نامند.

در ادامه، مراحل اجرای گام‌به‌گام کد ساده پایتون برای تولید مربع‌های جادویی آمده است:

تابعی با نام magic_square، مطابق شکل زیر، تعریف کنید:

def magic_square(matrix_ms):
   iSize = len(matrix_ms[0])
   sum_list = []

کد زیر، محاسبه مجموع ستون‌های مربع را نشان می‌دهد:

for col in range(iSize):
   sum_list.append(sum(row[col] for row in matrix_ms))

کد زیر، محاسبه مجموع سطرهای مربع را نشان می‌دهد:

sum_list.extend([sum (lines) for lines in matrix_ms])

کد زیر، محاسبه مجموع قطرهای مربع را نشان می‌دهد:

dlResult = 0
for i in range(0,iSize):
   dlResult +=matrix_ms[i][i]
sum_list.append(dlResult)
drResult = 0
for i in range(iSize-1,-1,-1):
   drResult +=matrix_ms[i][i]
sum_list.append(drResult)

if len(set(sum_list))>1:
   return False
return True

اکنون، مقدار ماتریس را مشخص کنید و خروجی را بررسی کنید:

print(magic_square([[1,2,3], [4,5,6], [7,8,9]]))

مشاهده می‌کنید که خروجی False خواهد بود، زیرا مجموع‌ها برابر نیستند.

print(magic_square([[3,9,2], [3,5,7], [9,1,6]]))

مشاهده می‌کنید که خروجی True خواهد بود، زیرا مجموع‌ها با یکدیگر برابرند و در اینجا مقدار آن‌ها 15 است.

پیشرفت مطالعه: وضعیت خوانده‌شدن این درس فقط در همین مرورگر ذخیره می‌شود؛ بدون نیاز به حساب کاربری.