دوشنبه، فروردین ۰۶، ۱۳۸۶

حل مشکل نیم‌فاصله

اگر نمی‌دانید نیم‌فاصله چیست و چه نیازی در متون فارسی به آن‌ها داریم، به مطلبی که پاسپارتو در این‌باره نوشته مراجعه کنید. همچنین این‌جا توضیح مفصلی در این مورد داده شده (این لینک را نیز از پانوشت پست پاسپارتو کش رفتم). به طور خلاصه در مورد رفع مشکل نیم فاصله به نکات زیر توجه کنید:

 

۱.
هرگز از ترکیب
Ctrl+Dash برای ایجاد نیم‌فاصله استفاده نکنید. این ترکیب کاراکتر غیرمجازی را به عنوان نیم‌فاصله درج می‌کند. همچنین برخی مرورگرها در نمایش آن مشکل دارند (اشاره به مرورگر خاصی نمی‌کنم).

 

۲.
کاراکتری که نیم‌فاصله را به درستی اینجاد می‌کند
Zero-Width Non Jointer یا به اختصار ZWNJ نام دارد. این کاراکتر را می‌توانید در جدول Symbols پیدا کنید. خانه مربوط به آن خالی است و کلید میانبر آن Alt+0157 است. در محیط Word می‌توانید برای این Symbol کلید میانبری، خودتان تعریف کنید (مثلا Ctrl+Space). اما من موفق نشدم کاری کنم که این کلید میانبر با هر بار اجرای Word نیز load شود.

 

۳.
به نظر می‌رسد ترکیب
Ctrl+Shift+2 نیز همین کاراکتر را ایجاد کند. اما این ترکیب زیاد راه دست نیست.

 

۴.
گزینه دیگر استفاده از نرم‌افزاری به نام
TrayLayout است. این نرم‌افزار در حافظه می‌نشیند و کلیدهایی را که هنگام فعال بودن زبان فارسی فشرده می‌شوند را hook می‌کند (بدین معنی که کاراکترهای مورد انتظار را با کاراکترهای دیگر جایگزین می‌کند). با این برنامه می‌توانید با ترکیب Shift+Space نیم فاصله را ایجاد کنید. استفاده از این نرم‌افزار مزایای زیادی دارد. مثلا این‌که می‌توانید کارکرد دیگر کلیدها را نیز تغییر دهید. به عنوان نمونه می‌توان ارقام را با کاراکترهای فارسی معادل جایگزین کرد، در این حالت حتی اگر محیطی که صفحه را load می‌کند به طور پیش‌فرض ارقام را انگلیسی نمایش دهد، ارقام صفحه شما فارسی خواهد بود. تنها عیب این نرم‌افزار که به نظرم می‌رسد این است که مکان اولیه کلیدها با آنچه در Keyboard فارسی بدان عادت کردیم متفاوت است. مثل مکان کاما، پ، ژ و ... که این مشکل با صرف کمی وقت و تنظیم مجدد کلیدها برطرف می‌شود.

 

پ.ن.

مشکل نیم‌فاصله این وبلاگ برطرف شد. زین‌پس با هر مرورگری که دوست دارید آن را بخوانید. بی‌خیال جو رایج ...

 

شنبه، اسفند ۲۶، ۱۳۸۵

سیستم‌های خبره: توصیف غیر رسمی

همان طور که گفته می‌شود:

 

Program = Algorithm + Data

 

در مورد سیستم‌های خبره نیز گفته می‌شود:

 

Expert System = Knowledge Base + Inference Engine

 

Knowledge-Base یا پایگاه دانش (KB) مجموعه جملات و قوانین منطقی است که به نحوی نگه‌داری می‌شود. این عبارات محیط یک عامل و مشاهدات وی را با جملات منطق توصیف می‌کنند. Inference Engine نیز مکانیزم استنتاج از جملات و قوانین داخل KB و رسیدن به جملات جدید است.

همچنین نویسندگان متون مرتبط اشاره می‌کنند به این که اغلب دو عبارت Expert System (ES) و Knowledge-Based System (KBS) به صورت تعویض پذیر و هم‌معنا استفاده می‌شوند.

توصیف غیر رسمی فوق از سیستم‌های خبره هیچ قیدی در رابطه با بزرگی سیستم و دامنه مربوط به عملکرد سیستم را شامل نمی‌شود. با توصیف فوق حتی عاملی که در محیط Wumpus در جستجوی طلاست نیز نوعی سیستم خبره است، چرا که هم پایگاه دانش دارد و هم بر اساس قوانین منطقی بازی و واقعیت‌ها در هر وضعیت استنتاج انجام می‌دهد و تصمیم‌گیری می‌کند.

اما در عمل به نظر می‌رسد، به هر سیستمی که دارای دو بخش فوق باشد سیستم خبره نمی‌گویند. در واقع ES را KBS نیز می‌نامند اما هر KBS ای را ES نمی‌نامند. اول این‌که سیستم‌های خبره معمولا محدود به یک حوزه خاص هستند. مثل سیستم معروف MYCIN که یک سیستم پزشکی است. سیستم MYCIN یک سیستم تشخیص بیماری­ است که به عنوان ورودی علائم بیمار را دریافت می‌کند. ES ها معمولا سیستم‌هایی هستند که از آن‌ها برای پرس و جو و مراجعه استفاده می‌شود، بنابراین در طراحی این سیستم‌ها مراحلی به طراحی واسط دریافت سوال کاربر، و همچنین واسطی برای نمایش خروجی و گاها خلاصه‌ای از روند استنتاج اختصاص می‌یابد. در حالی که چنین مراحلی برای دیگر KBS ها (مثلا عامل محیط Wumpus) در نظر گرفته نمی‌شود. ES ها معمولا حجیم هستند در حالی که دیگر KBS ها لزوما چندان حجیم نیستند. همچنین در چرخه حیات ES ها مرحله پرهزینه‌ای به نام Knowledge Engineering وجود دارد که در آن افرادی با دانش بالا (و متعاقبا دست‌مزد بالا) موظف به جمع‌آوری، ثبت و نگه‌داری دانش برای ES ها هستند. چنین مرحله‌ای برای دیگر KBS ها وجود ندارد.

 

یکشنبه، اسفند ۲۰، ۱۳۸۵

صداها

همیشه اون صدایی که در درون، او را به راهی هدایت می کرد، وجدانش نبود؛ و او این را نمی دانست. فکر می کرد چون به این صدا عمل می کند، پس کاری که انجام می دهد صحیح است. فکر می کرد چون حرفهای این صدا ظاهری خدایی و اخلاقی دارند، پس حتما این صدا فرشته ایست که آمده او را از گمراهی نجات دهد. مغرورانه فریاد میزد: «با او حرف نزن، به او نگاه نکن، بپوشان، از آن ننوش، روزی سیصد بار این را بگو، این بازی حرام است...» و در تمام این مدت فکر می کرد شده است آلت حق. اما نمی دانست، درونش دو نفر صحبت می کردند، نه یکی. صدای این دو، درست مانند هم بود؛ غیر قابل تشخیص از یکدیگر. تنها یکی از آن دو وجدان یا همان فرشته درون بود ..... دیگری خود شیطان بود.

شنبه، اسفند ۱۹، ۱۳۸۵

الگوریتم واقعا چیست؟ *

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

در کتاب ساختمان داده‌ها در C++ هوروویتس و دیگران، آمده یک الگوریتم باید ورودی و خروجی داشته باشد، معین و بی‌ابهام باشد و محدود باشد. تاکید وی بیشتر بر معین و بی‌ابهام بودن الگوریتم است. مثلا دستور زیر برای مرتب کردن یک دنباله از اعداد را در نظر بگیرید:

 

 

از اعداد صحیحی که مرتب نیستند کوچکترین عدد را پیدا کنید و آن را در مکان مربوطه‌اش در لیست مرتب شده قرار دهید.

 

 

در نگاه اول این عبارت به نظر Selection-Sort می‌آید، اما معلوم نیست که درجا (in-place) هست یا نه، چون عبارت قرار دادن ابهام دارد. همچنین این اعداد کجا هستند و به چه شکلی ذخیره شده‌اند؟ برای تبدیل این عبارت به الگوریتم باید عنوان شود که فرض کنید a آرایه‌ای از اعداد صحیح نامرتب است که در آن مکان iامین عدد به صورت a[i-1] و 1in است و الی آخر.

در ماشین‌های تورینگ تمامی خصیصه‌های الگوریتم بودن به وضوح قابل مشاهده‌اند، به‌جز محدود بودن. ورودی ماشین تورینگ داخل نوار وجود دارد، دستورالعمل‌هایش بدون ابهام تعریف شده‌اند و کاملا مشخص است پس از اجرای هر دستور­العمل ماشین به چه وضعیتی خواهد رفت. خروجی آن هم وضعیت متوقف شدن آن است. ولی آیا یک ماشین تورینگ محدود است؟ به عبارت بهتر آیا یک ماشین تورینگ همیشه متوقف می‌شود؟ پاسخ این است که ماشین‌های تورینگ به ازای برخی ورودی‌ها و دستورالعمل‌ها ممکن است در حلقه بی‌پایان قرار گیرند. در این حالت گفته می‌شود این ماشین تورینگ الگوریتمی برای پذیرش ورودی مورد نظر ارائه نمی‌دهد. به عنوان مثال عبارت: برای گرامرهای بدون محدودیت الگوریتم عضویت وجود ندارد؛ بدین معنی است که ماشین تورینگ پذیرنده این زبان لزوما متوقف نمی‌شود و ممکن است در حلقه بی‌پایان قرار بگیرد.

Steve McConnell در قسمتی از کتاب Code Complete الگوریتم را با heuristic به شکل زیبایی مقایسه می‌کند.

«الگوریتم مجموعه‌ای از دستورالعمل‌های واضح و خوش‌تعریف به منظور انجام کاری‌ست. یک الگوریتم، قابل پیش‌بینی و معین است و در معرض شانس قرار ندارد. یک الگوریتم به شما می‌گوید که چگونه از نقطه الف به نقطه ب بروید، بدون این‌که دور خود بچرخید، یا بی‌دلیل به نقاط ج، د، یا ه بروید. هیچ توقفی برای بوییدن گلها یا نوشیدن فنجانی قهوه هم در کار نیست.

یک heuristic روشی است که به شما کمک می‌کند به دنبال پاسخ بگردید. نتایجش گاها شانسی است، چرا که heuristic تنها به شما می‌گوید چگونه ببینید، نه که چه را پیدا کنید. او به طور مستقیم نمی‌گوید چگونه از نقطه الف به ب بروید، حتی ممکن است نداند که اصلا نقاط الف و ب کجا هستند. در عمل heuristic همان الگوریتم است که لباس دلقک­ها رو پوشیده. کمتر قابل پیش‌بینی است، بیشتر با آن خوش می‌گذرد و بدون تضمین برگشت سرمایه در 30 روز عرضه می­شود.»

در مثال یافتن آدرس، الگوریتم می‌گوید برو فلان شهر، فلان خیابان و الی آخر. اما heuristic می­گوید: اسم شهرو از روی نامه بردار، اونجا همه منو می‌شناسن، از هر کی بپرسی آدرس رو بلده، اما اگر احیانا کسی نبود یه زنگ بزن خودم میام دنبالت.

 

پ.ن.

1. پس تکلیف الگوریتم‌های تصادفی چه می‌شود؟ ر.ک. کتاب طراحی الگوریتم‌ها نوشته هوروویتس و دیگران. بخش 2-4-1 الگوریتم‌های تصادفی: توصیف غیر رسمی

* این پست نسبت به پست اولیه تغییر کرده است.