الگوریتم چیست؟ آموزش کامل از مفاهیم پایه تا هوش مصنوعی و آینده
تا حالا به این فکر کردی که وقتی یک برنامه را باز میکنی، چطور میفهمد باید چه کاری انجام دهد؟ یا مثلاً وقتی در گوگل چیزی را جستجو میکنی، چطور در چند لحظه بین حجم عظیمی از اطلاعات میگردد و نتیجهای را که میخواهد جلوی چشمت میگذارد؟
حتی پیشنهادهایی که در شبکههای اجتماعی میبینی هم اتفاقی نیستند. وقتی چند ویدیوی گیمینگ میبینی و بعد متوجه میشوی صفحه پیشنهادها پر از ویدیوهای مشابه شده، پشت این اتفاق یک سیستم تصمیمگیری وجود دارد.
اسم این سیستمها را زیاد شنیدهایم: الگوریتم.
الگوریتم شاید در نگاه اول یک کلمه کاملاً تخصصی و مخصوص برنامهنویسها به نظر برسد، اما مفهومش خیلی سادهتر از چیزی است که فکر میکنی. الگوریتم در سادهترین تعریف، یعنی یک روش مرحلهبهمرحله برای انجام یک کار یا حل یک مسئله.
در واقع، ما حتی قبل از اینکه کامپیوترها به وجود بیایند هم از الگوریتم استفاده میکردیم. وقتی برای انجام کاری چند مرحله مشخص را پشت سر هم انجام میدهیم، داریم از یک الگوریتم ساده استفاده میکنیم.
یک مثال خیلی ساده از الگوریتم
فرض کن میخواهی یک لیوان چای درست کنی. احتمالاً اول آب را گرم میکنی، بعد چای را آماده میکنی، آب را اضافه میکنی و در نهایت صبر میکنی تا چای آماده شود.
اگر همین مراحل را به صورت مرتب بنویسیم، چیزی شبیه این داریم:
1. آب را گرم کن
2. چای را داخل لیوان بریز
3. آب گرم را اضافه کن
4. چند دقیقه صبر کن
5. چای آماده است
این کد پایتون نیست؛ فقط یک روش ساده برای نمایش مراحل کار است. اما دقیقاً همان چیزی را نشان میدهد که یک الگوریتم انجام میدهد: مشخص میکند برای رسیدن به یک نتیجه، چه مراحلی باید طی شوند.
حالا همین ایده را وارد دنیای کامپیوتر کنیم. کامپیوتر خودش نمیداند برای حل یک مسئله چه کاری باید انجام دهد. ما باید مراحل را برایش مشخص کنیم. هرچه مسئله پیچیدهتر باشد، الگوریتم هم میتواند پیچیدهتر شود.
الگوریتمها از کجا آمدند؟
جالب است بدانیم که مفهوم الگوریتم خیلی قدیمیتر از کامپیوترهای امروزی است. انسانها از گذشته برای انجام محاسبات و حل مسائل ریاضی به روشهای مرحلهبهمرحله نیاز داشتند.
حتی نام «الگوریتم» هم از نام دانشمند ایرانی، محمد بن موسی خوارزمی گرفته شده است. آثار او در گسترش روشهای محاسباتی و ریاضی تأثیر زیادی داشتند و بعدها نام لاتینشده او یعنی Algoritmi به واژهای تبدیل شد که امروزه آن را الگوریتم مینامیم.
البته الگوریتم به معنای امروزی فقط به ریاضیات محدود نیست. امروزه الگوریتمها تقریباً در تمام بخشهای فناوری حضور دارند؛ از جستجوی ساده گرفته تا سیستمهای هوش مصنوعی و پردازش دادههای بسیار بزرگ.
الگوریتم در زندگی روزمره
اگر کمی دقت کنیم، میبینیم که الگوریتمها خیلی بیشتر از چیزی که فکر میکنیم در زندگی روزمره ما حضور دارند.
پیدا کردن مسیر
فرض کن میخواهی از یک نقطه به نقطه دیگری بروی. ممکن است چند مسیر مختلف وجود داشته باشد. یکی کوتاهتر است، یکی ترافیک کمتری دارد و یکی شاید از نظر زمان بهتر باشد.
برنامههای مسیریابی باید اطلاعات مختلفی را بررسی کنند و در نهایت یک مسیر مناسب پیشنهاد دهند. این کار بدون الگوریتمهای مختلف جستجو و مسیریابی بسیار دشوار خواهد بود.
مرتب کردن اطلاعات
یک مثال سادهتر را تصور کن. چند کارت داری که روی هرکدام یک عدد نوشته شده و میخواهی آنها را از کوچک به بزرگ مرتب کنی.
میتوانی هر بار کوچکترین عدد را پیدا کنی، آن را در ابتدای لیست قرار دهی و سپس سراغ بقیه اعداد بروی.
همین ایده ساده یک الگوریتم مرتبسازی است. برنامهنویسها برای مرتب کردن اطلاعات از الگوریتمهای مختلفی استفاده میکنند که هرکدام مزایا و معایب خودشان را دارند.
الگوریتم و برنامه چه فرقی دارند؟
این دو مفهوم خیلی به هم نزدیکاند، اما نباید آنها را یکی بدانیم.
الگوریتم روش حل مسئله است و برنامه پیادهسازی آن روش با استفاده از یک زبان برنامهنویسی است.
مثلاً فرض کن میخواهی برنامهای بنویسی که دو عدد را از کاربر بگیرد و حاصل جمع آنها را نمایش دهد. الگوریتم میتواند این باشد:
1. عدد اول را دریافت کن
2. عدد دوم را دریافت کن
3. عدد اول و دوم را با هم جمع کن
4. نتیجه را نمایش بده
بعد میتوانی این الگوریتم را با پایتون به برنامه واقعی تبدیل کنی:
a = int(input("عدد اول: "))
b = int(input("عدد دوم: "))
result = a + b
print(result)
پس کدی که بالا دیدی یک پیادهسازی از الگوریتم است. الگوریتم میتواند روی کاغذ هم نوشته شود، اما برنامه باید به شکلی نوشته شود که کامپیوتر بتواند آن را اجرا کند.
الگوریتمهای جستجو
یکی از مهمترین کارهایی که کامپیوترها انجام میدهند، پیدا کردن اطلاعات است. وقتی یک مقدار را از بین تعداد زیادی داده پیدا میکنیم، در واقع داریم یک مسئله جستجو را حل میکنیم.
سادهترین روش این است که دادهها را یکییکی بررسی کنیم تا به چیزی که میخواهیم برسیم.
فرض کن یک لیست شامل هزار عدد داریم و میخواهیم عدد ۷۵ را پیدا کنیم. در سادهترین حالت، برنامه از اولین عدد شروع میکند و یکییکی جلو میرود.
numbers = [12, 4, 81, 23, 75, 9]
target = 75
for number in numbers:
if number == target:
print("پیدا شد!")
break
این روش ساده است، اما اگر تعداد دادهها خیلی زیاد شود، ممکن است بررسی آنها زمان بیشتری ببرد.
اینجاست که انتخاب الگوریتم مناسب اهمیت پیدا میکند. گاهی میتوان با استفاده از ساختار داده مناسب یا الگوریتم بهتر، تعداد عملیات لازم را کاهش داد.
چرا سرعت الگوریتم مهم است؟
فرض کن یک الگوریتم روی ۱۰۰ داده در یک لحظه اجرا میشود. احتمالاً حتی اگر روش خیلی خوبی نباشد، متوجه تفاوت زیادی نمیشوی.
اما اگر همان الگوریتم را روی چند میلیون یا چند میلیارد داده اجرا کنی، شرایط کاملاً فرق میکند.
در پروژههای بزرگ، حتی یک تفاوت کوچک در روش حل مسئله میتواند باعث شود یک برنامه بسیار سریعتر یا بسیار کندتر اجرا شود.
به همین دلیل برنامهنویسها فقط به این فکر نمیکنند که «آیا جواب درست است؟» بلکه سؤال مهم دیگری هم دارند:
آیا میتوانم این مسئله را با مصرف زمان و منابع کمتر حل کنم؟
پیچیدگی زمانی یعنی چه؟
یکی از مفاهیمی که برای بررسی عملکرد الگوریتمها استفاده میشود، پیچیدگی زمانی است.
اگر بخواهیم خیلی ساده توضیح دهیم، پیچیدگی زمانی به ما کمک میکند بفهمیم با افزایش حجم ورودی، تعداد عملیات الگوریتم تقریباً چطور افزایش پیدا میکند.
مثلاً اگر برای بررسی ۱۰ داده تقریباً ۱۰ عملیات لازم باشد، برای ۱۰۰ داده هم ممکن است حدود ۱۰۰ عملیات لازم شود. چنین الگوریتمی با افزایش دادهها به شکل خطی رشد میکند.
در علوم کامپیوتر برای بیان این رفتار معمولاً از نمادهایی مثل O(n) استفاده میشود.
هدف از این علامتها این نیست که برنامهنویسها کد را سختتر کنند! 😄 بلکه کمک میکنند بتوانیم الگوریتمهای مختلف را از نظر رشد تعداد عملیات با هم مقایسه کنیم.
پیچیدگی فضایی؛ حافظه هم مهم است
فقط سرعت اجرای برنامه مهم نیست. مقدار حافظهای که برنامه استفاده میکند هم اهمیت دارد.
فرض کن دو الگوریتم داریم. الگوریتم اول خیلی سریع است، اما برای انجام کار خود به مقدار زیادی حافظه نیاز دارد. الگوریتم دوم کمی کندتر است، اما حافظه بسیار کمتری مصرف میکند.
در این شرایط نمیتوان گفت همیشه الگوریتم اول بهتر است. انتخاب مناسب به شرایط پروژه بستگی دارد.
به مقدار حافظهای که یک الگوریتم در زمان اجرا نیاز دارد، پیچیدگی فضایی گفته میشود.
در پروژههای کوچک ممکن است این موضوع چندان مهم نباشد، اما در سیستمهایی که منابع محدودی دارند یا با حجم عظیمی از داده کار میکنند، مدیریت حافظه بسیار مهم میشود.
الگوریتمهای پیشنهاددهنده
حالا برسیم به بخشی که احتمالاً هر روز با آن سروکار داری: سیستمهای پیشنهاددهنده.
وقتی وارد یک سرویس ویدیویی میشوی، معمولاً تعداد بسیار زیادی محتوا برای نمایش وجود دارد. اما برنامه نمیتواند همه آنها را همزمان جلوی تو قرار دهد. بنابراین باید تصمیم بگیرد چه چیزهایی را بیشتر نمایش دهد.
اینجا الگوریتمهای پیشنهاددهنده وارد عمل میشوند.
این الگوریتمها میتوانند اطلاعات مختلفی را بررسی کنند؛ مثلاً چه محتوایی را مشاهده کردهای، روی چه چیزهایی کلیک کردهای، چه چیزهایی را بیشتر دنبال کردهای یا چه موضوعاتی معمولاً توجه ت را جلب کردهاند.
بعد از بررسی این اطلاعات، سیستم تلاش میکند حدس بزند چه محتوایی احتمالاً برای تو جذابتر است.
به همین دلیل ممکن است بعد از تماشای چند ویدیوی مربوط به یک موضوع، ناگهان تعداد زیادی محتوای مشابه در پیشنهادهای تو ظاهر شود.
مشکل سیستمهای پیشنهاددهنده
این سیستمها بسیار کاربردیاند، اما همیشه هم بینقص نیستند.
گاهی اگر یک نوع محتوا را زیاد ببینی، الگوریتم ممکن است مرتب محتوای مشابه بیشتری نشان دهد. در نتیجه ممکن است کمکم با موضوعات محدودتری روبهرو شوی و کمتر چیزهای متفاوت را ببینی.
از طرف دیگر، اگر هدف یک سیستم فقط افزایش تعامل کاربر باشد، ممکن است محتوایی که واکنش بیشتری ایجاد میکند بیشتر نمایش داده شود؛ حتی اگر آن محتوا لزوماً مفیدترین یا بهترین محتوا نباشد.
پس طراحی یک الگوریتم فقط مسئله «بیشترین عدد» نیست. باید مشخص شود این عدد دقیقاً چه چیزی را اندازه میگیرد و رسیدن به آن هدف چه پیامدهایی دارد.
الگوریتم و هوش مصنوعی
وقتی اسم الگوریتم میآید، خیلیها سریع یاد هوش مصنوعی میافتند. دلیلش هم این است که الگوریتمها بخش بسیار مهمی از سیستمهای هوش مصنوعی هستند.
در یک الگوریتم سنتی، معمولاً برنامهنویس قوانین مشخصی برای سیستم تعریف میکند.
مثلاً میتوانیم به یک برنامه بگوییم:
if password_is_correct:
allow_login()
else:
deny_login()
اینجا قانون کاملاً مشخص است. اگر رمز درست باشد، ورود مجاز است و اگر اشتباه باشد، ورود رد میشود.
اما در یادگیری ماشین، روش کار میتواند متفاوت باشد. در اینجا سیستم میتواند با استفاده از دادهها الگوهایی را یاد بگیرد و بعد از آن الگوها برای پیشبینی یا دستهبندی استفاده کند.
از الگوریتمهای قانونمحور تا الگوریتمهای مبتنی بر الگو
فرض کن میخواهی سیستمی بسازی که بتواند تصاویر گربه را تشخیص دهد.
یک روش ساده این است که بخواهی تمام ویژگیهای گربه را دستی به سیستم توضیح دهی: گوشها، چشمها، شکل بدن و موارد دیگر.
اما تصاویر گربهها بسیار متنوعاند. رنگ، اندازه، زاویه تصویر و حتی حالت بدن میتواند تغییر کند.
در یادگیری ماشین، میتوان تعداد زیادی نمونه در اختیار سیستم قرار داد تا مدل بتواند الگوهای موجود در دادهها را یاد بگیرد.
این تغییر نگاه بسیار مهم است: به جای اینکه برای تکتک شرایط یک قانون دستی بنویسیم، تلاش میکنیم سیستمی داشته باشیم که بتواند الگوهای موجود در دادهها را پیدا کند.
سوگیری الگوریتمی چیست؟
قدرت الگوریتمهای هوشمند یک طرف ماجراست و مشکلاتشان طرف دیگر.
یکی از مهمترین مشکلات، سوگیری الگوریتمی یا Algorithmic Bias است.
الگوریتمهای یادگیری ماشین از دادههایی که در اختیارشان قرار میگیرد یاد میگیرند. اگر این دادهها ناقص یا دارای سوگیری باشند، ممکن است مدل هم تحت تأثیر همان مشکل قرار بگیرد.
برای مثال فرض کن یک سیستم برای بررسی رزومههای کاری ساخته شده باشد، اما دادههایی که برای آموزش آن استفاده شدهاند نماینده مناسبی از همه افراد نباشند. ممکن است مدل به مرور ارتباطهایی یاد بگیرد که واقعاً نشاندهنده توانایی افراد نیستند.
در چنین شرایطی، مشکل لزوماً از این نیست که الگوریتم «قصد» تبعیض داشته باشد. مشکل میتواند از دادهها، روش طراحی، معیار ارزیابی یا نحوه استفاده از خروجی سیستم ایجاد شده باشد.
الگوریتمها در امنیت
الگوریتمها فقط برای پیشنهاد ویدیو یا مرتب کردن اطلاعات استفاده نمیشوند. بخش بزرگی از امنیت دنیای دیجیتال هم به الگوریتمها وابسته است.
هر بار که اطلاعاتی را به صورت امن منتقل میکنیم یا از یک سرویس آنلاین استفاده میکنیم، ممکن است در پشت صحنه عملیاتهای مختلف رمزنگاری انجام شود.
رمزنگاری یا Cryptography به روشهایی مربوط میشود که برای محافظت از اطلاعات و ارتباطات استفاده میشوند.
ایده کلی این است که اطلاعات به شکلی پردازش شوند که افراد غیرمجاز نتوانند به راحتی از آنها استفاده کنند.
در سیستمهای مدرن، این کار با استفاده از الگوریتمهای ریاضی و روشهای رمزنگاری مختلف انجام میشود. امنیت سرویسهای دیجیتال تا حد زیادی به درست بودن پیادهسازی همین روشها وابسته است.
وقتی یک الگوریتم اشتباه میکند
یک اشتباه کوچک در یک برنامه ساده ممکن است فقط باعث شود برنامه ما درست کار نکند. اما در سیستمهای بزرگ، یک خطای الگوریتمی میتواند پیامدهای بسیار جدیتری داشته باشد.
فرض کن الگوریتمی وظیفه پردازش اطلاعات مالی را دارد. اگر منطق آن اشتباه باشد، ممکن است نتیجه محاسبات نادرست شود و خسارت زیادی ایجاد کند.
به همین دلیل در پروژههای حساس، آزمایش، بررسی و ارزیابی الگوریتم اهمیت بسیار زیادی دارد.
برنامهنویس نباید فقط یک ورودی معمولی را آزمایش کند. باید ببیند اگر ورودی خالی باشد چه میشود، اگر مقدار خیلی بزرگ باشد چه اتفاقی میافتد و اگر کاربر اطلاعات نامعتبر وارد کند، برنامه چگونه رفتار میکند.
حالتهای مرزی یا Edge Case
یکی از چیزهایی که یک الگوریتم خوب را از یک الگوریتم ضعیف جدا میکند، توجه به شرایط غیرعادی است.
فرض کن برنامهای داری که میانگین اعداد یک لیست را حساب میکند.
اگر لیست شامل ۱۰ عدد باشد، همهچیز درست است. اما اگر لیست خالی باشد چه؟
یا اگر کاربر به جای عدد، یک متن وارد کند؟
یا اگر عددی بسیار بزرگ وارد شود؟
این شرایط را میتوان حالتهای مرزی یا Edge Case در نظر گرفت.
یک الگوریتم خوب فقط برای شرایط ایدهآل نوشته نمیشود. باید تا حد ممکن مشخص کند در شرایط غیرمنتظره چه رفتاری داشته باشد.
چطور مثل یک الگوریتمنویس فکر کنیم؟
یکی از مهمترین مهارتهایی که یک برنامهنویس میتواند یاد بگیرد، حل مسئله است.
گاهی یک نفر ممکن است سینتکس یک زبان برنامهنویسی را خیلی خوب بلد باشد، اما وقتی با یک مسئله جدید روبهرو میشود نداند از کجا شروع کند.
دلیلش این است که برنامهنویسی فقط حفظ کردن دستورات نیست.
قبل از اینکه کد بنویسی، مسئله را به قسمتهای کوچکتر تقسیم کن.
اول از خودت بپرس:
- ورودی برنامه چیست؟
- خروجی دقیقاً باید چه باشد؟
- چه مراحلی برای رسیدن به جواب لازم است؟
- چه حالتهای خاصی ممکن است اتفاق بیفتد؟
- آیا روش سادهتر یا سریعتری وجود دارد؟
بعد از جواب دادن به این سؤالها، تازه میتوانی سراغ پیادهسازی بروی.
این روش باعث میشود وقتی با یک پروژه بزرگ مواجه میشوی، آن را یک مشکل غولپیکر نبینی. میتوانی آن را به چند مسئله کوچکتر تقسیم کنی و هرکدام را جداگانه حل کنی.
الگوریتم و تفکر منطقی
یادگیری الگوریتم فقط برای حل مسائل برنامهنویسی مفید نیست. الگوریتم به ما یاد میدهد مسائل را مرحلهبهمرحله بررسی کنیم.
مثلاً اگر یک برنامه کار نمیکند، به جای اینکه تصادفی بخشهای مختلف کد را تغییر دهیم، میتوانیم مسیر اجرای برنامه را بررسی کنیم و ببینیم مشکل دقیقاً از کجا شروع شده است.
همین طرز فکر در پروژههای بزرگتر هم کاربرد دارد.
در واقع میتوان گفت یادگیری الگوریتم تا حدی یادگیری یک نوع طرز فکر است، نه فقط یادگیری چند دستور برنامهنویسی.
الگوریتمها در طبیعت
یکی از بخشهای جالب درباره الگوریتم این است که بعضی ایدههای الگوریتمی را میتوان در رفتارهای طبیعی هم مشاهده کرد.
مثلاً به رفتار مورچهها فکر کن. یک مورچه به تنهایی ممکن است مسیر مشخصی را امتحان کند، اما وقتی تعداد زیادی مورچه در یک محیط حرکت میکنند، رفتار جمعی آنها میتواند باعث شود مسیرهای مناسبتر بیشتر مورد استفاده قرار بگیرند.
دانشمندان از چنین رفتارهایی برای الهام گرفتن در طراحی روشهای محاسباتی استفاده کردهاند.
در اینجا یک نکته جالب وجود دارد: برای طراحی یک الگوریتم همیشه لازم نیست ایده را از یک برنامه کامپیوتری دیگر بگیریم. گاهی طبیعت خودش پر از نمونههای جالب حل مسئله است.
الگوریتمهای الهامگرفته از طبیعت
طبیعت طی میلیونها سال با مسئلههای مختلفی مثل بقا، پیدا کردن غذا، حرکت و سازگاری روبهرو شده است.
به همین دلیل دانشمندان گاهی به رفتار موجودات زنده نگاه میکنند تا از آنها برای حل مسائل محاسباتی الهام بگیرند.
این موضوع نشان میدهد الگوریتم فقط مجموعهای خشک از دستورها نیست. گاهی یک الگوریتم میتواند از یک ایده ساده در دنیای واقعی الهام بگیرد و آن ایده را برای حل یک مسئله کامپیوتری به کار ببرد.
آیا الگوریتمها همیشه بیطرف هستند؟
در نگاه اول ممکن است فکر کنیم یک الگوریتم فقط چند دستور ریاضی است و بنابراین نمیتواند خوب یا بد باشد.
اما وقتی الگوریتم در دنیای واقعی برای تصمیمگیری استفاده میشود، موضوع پیچیدهتر میشود.
یک الگوریتم بر اساس هدفی که برایش تعریف شده و دادههایی که دریافت میکند، نتیجه تولید میکند. بنابراین اگر هدف اشتباه انتخاب شود یا دادهها مشکل داشته باشند، نتیجه هم میتواند مشکلدار شود.
مثلاً اگر هدف یک سیستم فقط افزایش تعداد کلیکها باشد، ممکن است محتوایی را بیشتر نمایش دهد که کاربران را بیشتر به کلیک کردن تشویق میکند؛ اما این موضوع لزوماً به معنی مفیدتر بودن آن محتوا نیست.
به همین دلیل در طراحی سیستمهای بزرگ، فقط سؤال «آیا الگوریتم کار میکند؟» کافی نیست. باید پرسید:
- الگوریتم برای چه هدفی ساخته شده؟
- با چه دادههایی کار میکند؟
- نتیجه آن روی چه کسانی تأثیر میگذارد؟
- اگر اشتباه کند، چه اتفاقی میافتد؟
وقتی الگوریتم از هدف خودش جلو میزند
یکی از نکات مهم درباره سیستمهای الگوریتمی این است که «بهینه بودن» همیشه به معنی «درست بودن» نیست.
فرض کن یک الگوریتم وظیفه دارد میزان تعامل کاربران را افزایش دهد. اگر فقط همین معیار را در نظر بگیریم، سیستم تلاش میکند هر کاری انجام دهد تا کاربر بیشتر کلیک کند، بیشتر بماند یا بیشتر واکنش نشان دهد.
اما این سؤال باقی میماند که آیا هر نوع تعامل واقعاً ارزشمند است؟
ممکن است یک محتوای جنجالی واکنش زیادی ایجاد کند، اما مفید نباشد. بنابراین انتخاب معیار مناسب برای یک الگوریتم به اندازه خود الگوریتم اهمیت دارد.
الگوریتمهای مالی و سیستمهای بزرگ
الگوریتمها در سیستمهای مالی هم استفاده میشوند. وقتی حجم زیادی از اطلاعات باید در مدت بسیار کوتاهی پردازش شود، انسان به تنهایی نمیتواند همه محاسبات را انجام دهد.
در چنین سیستمهایی الگوریتمها میتوانند دادهها را پردازش کنند، شرایط مشخصی را بررسی کنند و بر اساس قوانین تعریفشده عملیات مختلفی انجام دهند.
این موضوع دوباره اهمیت طراحی صحیح الگوریتم را نشان میدهد. در یک سیستم بزرگ، اشتباه یک بخش کوچک ممکن است روی بخشهای دیگر هم اثر بگذارد.
پس هرچه یک الگوریتم به تصمیمهای مهمتر نزدیک شود، آزمایش و کنترل آن هم اهمیت بیشتری پیدا میکند.
آینده الگوریتمها
امروز الگوریتمها تقریباً در همه جای دنیای دیجیتال حضور دارند، اما این حضور در آینده احتمالاً بیشتر هم خواهد شد.
هوش مصنوعی، خودروهای خودران، سیستمهای پیشنهاددهنده، پردازش زبان، تشخیص تصویر و بسیاری از فناوریهای جدید، همگی به الگوریتمها و روشهای محاسباتی وابستهاند.
همزمان با پیشرفت سختافزار و نرمافزار، مسئلههای جدیدی هم به وجود میآیند و برای حل آنها به الگوریتمهای جدید یا نسخههای بهینهتر الگوریتمهای قبلی نیاز داریم.
الگوریتمهای کوانتومی؛ یک قدم به آینده
یکی از موضوعات جذاب در آینده محاسبات، رایانش کوانتومی است.
کامپیوترهای کوانتومی از اصول متفاوتی نسبت به کامپیوترهای معمولی استفاده میکنند و هدفشان این نیست که فقط همان کارهای کامپیوترهای فعلی را کمی سریعتر انجام دهند. در برخی مسائل، رایانش کوانتومی میتواند روشهای کاملاً متفاوتی برای پردازش اطلاعات ارائه کند.
این موضوع میتواند روی طراحی الگوریتمها هم تأثیر بگذارد. الگوریتمی که برای یک کامپیوتر معمولی مناسب است، لزوماً بهترین انتخاب برای یک معماری محاسباتی کاملاً متفاوت نیست.
البته نباید تصور کنیم که کامپیوترهای کوانتومی قرار است خیلی زود جای همه کامپیوترهای معمولی را بگیرند. هر فناوری برای مسائل خاص خودش مناسب است و مسیر پیشرفت آن هم به عوامل مختلفی بستگی دارد.
آیا هوش مصنوعی جای برنامهنویسها را میگیرد؟
با پیشرفت هوش مصنوعی، این سؤال زیاد مطرح میشود که آیا الگوریتمها و سیستمهای هوشمند در نهایت میتوانند تمام کارهای برنامهنویسها را انجام دهند یا نه.
واقعیت این است که ابزارهای هوش مصنوعی میتوانند در نوشتن، توضیح دادن و بررسی کد کمک زیادی کنند. اما ساخت یک نرمافزار فقط نوشتن چند خط کد نیست.
قبل از کدنویسی باید مسئله را فهمید، نیازها را مشخص کرد، معماری مناسب را انتخاب کرد، خطاها را بررسی کرد و تصمیم گرفت که چه چیزی اصلاً باید ساخته شود.
حتی اگر یک ابزار بتواند بخشی از کد را تولید کند، هنوز کسی باید مشخص کند که آن کد چه مشکلی را حل میکند و آیا راهحل مناسبی است یا نه.
در نهایت، الگوریتمها در پاسخ دادن به سؤال «چگونه؟» بسیار قدرتمندند، اما سؤال «چرا؟» همچنان بخش مهمی از تصمیمگیری انسانی است.
آیا الگوریتمها میتوانند خودشان را تغییر دهند؟
یکی از بحثهایی که با پیشرفت هوش مصنوعی بیشتر مطرح شده، سیستمهایی است که میتوانند بخشی از رفتار یا کد خود را بر اساس شرایط تغییر دهند.
این موضوع با الگوریتمهای سادهای که در ابتدای مقاله دیدیم تفاوت زیادی دارد. یک الگوریتم ساده دقیقاً همان دستورهایی را اجرا میکند که برایش نوشتهایم، اما سیستمهای یادگیرنده میتوانند بر اساس دادهها رفتار متفاوتی پیدا کنند.
با این حال، نباید هر سیستم یادگیرنده را موجودی مستقل و دارای اراده تصور کنیم. اینکه یک مدل بتواند الگو پیدا کند یا رفتار خود را در محدودهای تغییر دهد، به معنی داشتن هدف انسانی یا آگاهی انسانی نیست.
بهتر است این موضوع را فنی و دقیق بررسی کنیم و بین «یادگیری»، «خودکار بودن» و «آگاهی» تفاوت قائل شویم.
چند ویژگی یک الگوریتم خوب
حالا که با بخشهای مختلف الگوریتم آشنا شدیم، بیایید ببینیم یک الگوریتم خوب چه ویژگیهایی دارد.
۱. واضح باشد
مراحل الگوریتم باید قابل فهم و مشخص باشند. اگر معلوم نباشد یک مرحله دقیقاً چه کاری انجام میدهد، پیادهسازی و بررسی آن سخت میشود.
۲. به نتیجه مشخص برسد
الگوریتم باید برای مسئله موردنظر یک خروجی مشخص داشته باشد و در شرایط مناسب بتواند به پایان برسد.
۳. حالتهای خاص را در نظر بگیرد
یک الگوریتم حرفهای فقط برای ورودیهای ایدهآل نوشته نمیشود. باید تا حد امکان ورودیهای نامعتبر، دادههای خالی و شرایط غیرمنتظره را هم مدیریت کند.
۴. کارآمد باشد
اگر دو روش بتوانند یک مسئله را حل کنند، معمولاً روشی که زمان یا حافظه کمتری مصرف میکند انتخاب بهتری است؛ البته این موضوع همیشه به نیاز پروژه بستگی دارد.
۵. قابل آزمایش باشد
باید بتوانی الگوریتم را با ورودیهای مختلف امتحان کنی و مطمئن شوی در شرایط گوناگون رفتار مناسبی دارد.
یک تمرین ساده برای یادگیری الگوریتم
اگر میخواهی مهارت الگوریتمی خودت را تقویت کنی، لازم نیست از مسئلههای خیلی سخت شروع کنی.
مثلاً یک برنامه طراحی کن که چند عدد از کاربر بگیرد و بزرگترین عدد را پیدا کند.
اول بدون کدنویسی فکر کن. اگر سه عدد داشته باشی، چطور بزرگترین را پیدا میکنی؟
میتوانی ابتدا عدد اول را به عنوان بزرگترین عدد در نظر بگیری. بعد عدد دوم را با آن مقایسه کنی. اگر عدد دوم بزرگتر بود، آن را جایگزین کنی. سپس همین کار را با عدد سوم انجام دهی.
حالا همین منطق را میتوانی به کد تبدیل کنی.
numbers = [12, 45, 8, 91, 34]
largest = numbers[0]
for number in numbers:
if number > largest:
largest = number
print(largest)
نکته مهم این مثال خود کد نیست. چیزی که باید یاد بگیری، مراحل فکر کردن برای رسیدن به راهحل است.
چرا یادگیری الگوریتم برای برنامهنویس مهم است؟
ممکن است یک زبان برنامهنویسی را خیلی خوب بلد باشی، اما اگر نتوانی مسئله را به مراحل منطقی تقسیم کنی، در پروژههای واقعی خیلی زود به مشکل میخوری.
الگوریتم کمک میکند قبل از اینکه درگیر سینتکس زبان شوی، روی اصل مسئله تمرکز کنی.
وقتی الگوریتم را فهمیدی، تبدیل آن به پایتون، جاوا، ++C یا زبانهای دیگر معمولاً خیلی سادهتر میشود.
به همین دلیل است که در مسابقات برنامهنویسی هم حل مسئله و الگوریتم اهمیت بسیار زیادی دارد. شرکتکننده باید بتواند برای یک مسئله، راهحلی پیدا کند که هم درست باشد و هم در محدودیتهای زمانی و حافظهای تعیینشده اجرا شود.
جمعبندی
الگوریتم در ظاهر فقط یک مفهوم ساده است: مراحل مشخص برای حل یک مسئله. اما اگر کمی عمیقتر نگاه کنیم، میبینیم که تقریباً تمام دنیای دیجیتال به آن وابسته است.
وقتی یک برنامه اطلاعاتی را مرتب میکند، وقتی موتور جستجو نتیجه مناسب را پیدا میکند، وقتی یک سرویس ویدیویی محتوایی را پیشنهاد میدهد، وقتی یک سیستم هوش مصنوعی تصویر را بررسی میکند یا وقتی اطلاعاتی به صورت امن منتقل میشود، در پشت صحنه الگوریتمهایی در حال کار هستند.
در عین حال، هرچه الگوریتمها قدرتمندتر میشوند، مسئولیت طراحی و استفاده درست از آنها هم بیشتر میشود. یک الگوریتم میتواند بسیار سریع باشد، اما سرعت به تنهایی کافی نیست. باید بدانیم چه دادهای دریافت میکند، چه هدفی دارد، چه نتیجهای تولید میکند و اگر اشتباه کند چه اتفاقی میافتد.
برای کسی که تازه وارد برنامهنویسی شده، شاید اسمهایی مثل پیچیدگی زمانی، یادگیری ماشین، رمزنگاری یا رایانش کوانتومی در ابتدا کمی ترسناک باشند. اما همه این مفاهیم از یک ایده ساده شروع میشوند: برای حل یک مسئله باید یک روش منطقی پیدا کنیم.
پس اگر میخواهی برنامهنویس بهتری شوی، فقط روی حفظ کردن دستورات زبان برنامهنویسی تمرکز نکن. سعی کن مسئلهها را تحلیل کنی، آنها را به قسمتهای کوچکتر تقسیم کنی، راهحلهای مختلف را مقایسه کنی و بعد بهترین روش را به کد تبدیل کنی.
در نهایت، الگوریتم فقط چیزی نیست که داخل کدهای ما قرار گرفته باشد. الگوریتم نوعی روش فکر کردن برای حل مسئله است؛ روشی که از سادهترین برنامهها شروع میشود و تا پیچیدهترین سیستمهای هوش مصنوعی و فناوریهای آینده ادامه پیدا میکند.
گفتگو درباره این پست
برای ثبت پیام ابتدا وارد حساب خود شوید.
هنوز پیامی ثبت نشده است.