هر سیستم پیچیدهای که کار میکند همیشه از یک سیستم ساده که کار میکرده تکامل یافته. یک سیستم پیچیده که از ابتدا طراحی شده باشد هرگز کار نمیکند و نمیتوان آن را اصلاح کرد تا کار کند. شما باید با یک سیستم ساده کار را دوباره شروع کنید
مارپیچ الگویی است که «رشد» و «تکرار» را همزمان در خود دارد. مارپیچ شایعترین مدل رشد در طبیعت است. در گیاهان، صدفها، اثر انگشت، گردبادها، کهکشانها و بسیاری دیگر از مخلوقات الگوی مارپیچ دیده میشود. بازهای شکاری در مسیری مارپیچ طعمهٔ خودشان را شکار میکنند. حشرات با الگویی مارپیچ به منابع نور نزدیک میشوند. در توجیه تکرار این الگو گفتهاند و میگویند که رشد مارپیچی، کمترین انرژی ممکن را میبرد. پس برای عناصر طبیعی صرف میکند که حول مرکزیت خودشان توسعه پیدا کنند.
رشد مارپیچی از یک نقطه شروع میشود و همان نقطه مدام خودش را تکرار میکند. اما این تکرار به معنی درجازدن نیست. تفاوت مارپیچ با دایره در همین است. دایره مدام درجا میزند ولی مارپیچ فعال است و مدام خودش را بزرگتر میکند. در الگوی مارپیچی نقشهٔ از پیش تعیینشدهای وجود ندارد. وضعیت فعلی، گام بعدی را تعیین میکند. به همین خاطر است که ساختارهای مارپیچی پایداری بسیار بالایی دارند.
نگاه مارپیچی دوای درد ایدئالگراهاست. کسی که میخواهد جامعه را درست کند، بهتر است اول از خودش و بعداً اطرافیانش شروع کند. کسی که میخواهد پروژهای در مقیاس ملی و جهانی تعریف کند، بهتر از پروژههای محلی شروع کند. یکی از خلاقیتهای دولت چین در تربیت رهبران آینده، فرستادن این افراد به روستاهای دورافتاده است. شرط ترفیع و جدی گرفته شدن برای این افراد، افزایش ۵۰٪ درآمد اهالی آن روستاست. اگر در این مرحله موفق بودند، همین کار را در مقیاس، شهر، استان و در نهایت کشور عهدهدار خواهند شد.
The good life for man is the life spent in seeking for the good life for man.
رفتار مارپیچی در آثار هنرمندها هم دیده میشود. اکثر هنرمندها فقط یک اثر دارند و باقی آثار تکرار همان یک اثر است. کسی که کارهای آلفرد هیچکاک، اندرو دامنیک، چارلی کافمن، مارتین اسکورسیزی یا فدریکو فلینی را دیده باشد، با لحظهای تأمل متوجه یکسان بودن آثار متوالی این افراد میشود. گابریل گارسیا مارکز در کتاب «بوی درخت گویاو» میگوید: «معتقدم غالباً هر نویسنده فقط یک کتاب مینویسد، حتی اگر این کتاب در مجلدهای مختلف و یا نامهای متفاوت منتشر شود. این مسأله در مورد بالزاک، کنراد، ملویل، کافکا و فاکنر، بهخصوص فاکنر، صدق میکند». البته که این الگو استثناهایی هم دارد. استثناها مختص هنرمندانی است که مدام در حرکت داخلی و خارجی هستند و جای پایشان را سفت نمیکنند. مثل استنلی کوبریک؛ مثل دیوید لینچ.
کاری که شکل مارپیچی به خودش میگیرد، مثل بچه زنده است؛ به مرور رشد میکند و تربیت میشود. در ابتدای کار یک موجود ضعیف و ناکارآمد است؛ اما مدام در حال کاملتر شدن است. متن هنر تا امروز ۳۷ بار اصلاح شده است و بعد از این باز هم اصلاح خواهد شد.
The path isn’t a straight line; it’s a spiral. You continually come back to things you thought you understood and see deeper truths.
رفتار مارپیچی یعنی مدام تازه شروع کردن. شروعهای جدید به ما اجازه میدهند که الگوهای تکرارشوندهٔ بد یا قدیمی را کنار بگذاریم و هر چه در دور قبل یاد گرفتهایم از نو به کار بگیریم. ورود به مدرسهٔ جدید یا دانشگاه، ازدواج، تغییر شغل، مهاجرت و امثال اینها، همه فرصتهای تازهای برای شروع هستند. البته برای کسی که اهلش باشد، هر روز فرصت تازهای است؛ اما گاهی فشار محیط به قدری زیاد است که تنها با تغییر فضا شروع تازه میسر میشود.
رسیدن به جواب با مارپیچ
در خیلی از مسئلهها، برای رسیدن به کیفیت خوب، باید اول روی کمیت تمرکز کنیم. انگار که با چند بار امتحان کردن، راههای بهتری پیدا میکنیم. «الگوریتمهای تکرارشونده» در ریاضی هم همین کار را میکنند. مثلاً در طبیعت، «تکامل» یک نمونه از این الگوریتمهاست؛ موجودات زنده با تغییرات تصادفی (جهش) مدام امتحان میکنند که آیا میتوانند بهتر از قبل با محیط سازگار شوند یا نه. در فیزیک و شیمی هم فرآیندی به نام «آنیلینگ» (یا بازپخت)1 شبیه به همین است؛ ماده را آرامآرام سرد میکنند تا به پایدارترین و بهترین حالت خودش برسد. حتی در مذاکره، دو طرف بعد از یک توافق اولیه، آنقدر پیشنهادهای مختلف به هم میدهند تا به بهترین حالت ممکن برای هر دو برسند.
این جور مسئلهها مثل یک ظرف پر از چیزهای مختلف، مثلاً یک ظرف آجیل، هستند. هدف این است که این چیزها را تا جایی که میشود، فشرده کنیم. این آجیلها میتوانند به هزاران شکل مختلف در ظرف قرار بگیرند. راهحل تکراری و سادهاش این است که ظرف را آرام و پیوسته تکان بدهیم. چرا؟ چون بعد از هر تکان، آجیلها فرصت پیدا میکنند کمی جابجا شوند و چون نیرویی مثل جاذبه آنها را به سمت پایین میکشد، معمولاً حالت بعدیشان کمی بهتر و فشردهتر از حالت قبلی میشود.
منطق مشترک همه این مثالها این است: با یک جواب یا وضعیت اولیه شروع میکنیم و بعد، قدم به قدم تلاش میکنیم تا به حالتی بهتر از وضعیت فعلی برسیم. شاید همیشه نتوانیم به «بهترین جواب ممکن» در کل دنیا برسیم، اما حداقل به جوابی میرسیم که خیلی از جواب اولیهمان بهتر است.
در جبر خطی، مسائلی به اسم برنامهریزی خطی2 را با الگوریتمهای تکرارشونده حل میکنند. برای یک مثال واقعی ، مسألهٔ زیر را در نظر بگیرید:
یک کارگاه دو نوع محصول A و B تولید میکند.
- برای تولید هر واحد از محصول A به ۱ ساعت کار ماشینکاری و ۲ ساعت کار مونتاژ نیاز است.
- برای تولید هر واحد از محصول B به ۲ ساعت کار ماشینکاری و ۱ ساعت کار مونتاژ نیاز است.
- سود حاصل از فروش هر واحد محصول A برابر ۳ واحد پولی و برای محصول B برابر ۵ واحد پولی است.
- کارگاه در هفته حداکثر ۸ ساعت ماشینکاری و ۷ ساعت مونتاژ در اختیار دارد.
کارگاه میخواهد بداند از هر محصول چه تعداد تولید کند تا سودش بیشینه شود.
۱. تعریف متغیرهای تصمیم:
- متغیر : تعداد محصول A که باید تولید شود.
- متغیر : تعداد محصول B که باید تولید شود.
۲. تابع هدف:
هدف، بیشینهسازی سود کل است:
۳. محدودیتها:
محدودیت ماشینکاری:
محدودیت مونتاژ:
محدودیتهای عدم منفی بودن (تعداد تولید نمیتواند منفی باشد):
قبل اینکه بخواهیم مسأله را حل کنیم، اول جوابش را ببینیم.
صفحهٔ آبی رنگ، مقدار سود ما از تولید به ازای و های مختلف است. محدودیتهای برای این دو متغیر هم در فضای سبز نشان داده شدهاند. از روی نمودار مشخص است که بالاترین نقطه در صفحهٔ آبی که حداکثر سود ماست مقادیر متغیرها به این شرح هستند:
- متغیر پایهای مقدار ۲ را دارد.
- متغیر پایهای مقدار ۳ را دارد.
اما در ابتدای کار، نمیتوان چنین جوابی را حدس زد. همانطور که جلوتر میبینید، ما از روشی به نام سیمپلکس3 استفاده میکنیم که به طور تکرارشونده مسأله را حل میکند. ما جواب اولیهای در نظر میگیریم که در آن هر دوی متغیرها ۰ هستند. و به بعد مرور روی صفحهٔ سبزرنگ حرکت میکنیم تا در نهایت به نقطهٔ قرمز رنگ برسیم که نقطهٔ بهینهٔ ماست.
روش سیمپلکس بر این اصل استوار است که اگر جواب بهینهای برای یک مسئله برنامهریزی خطی وجود داشته باشد، حداقل یکی از گوشههای ناحیه شدنی (مثل گوشههای صفحهٔ سبز رنگ) جواب بهینه خواهد بود. این روش به ما اجازه میدهد تا از یک گوشه شروع کنیم و به صورت هوشمندانه به گوشههای مجاور که جواب بهتری ارائه میدهند حرکت کنیم، تا زمانی که به گوشهای برسیم که هیچ حرکت دیگری نتواند جواب را بهبود بخشد.
حل مسأله با روش Simplex
۴. تبدیل به فرم استاندارد (برای روش سیمپلکس):
برای تبدیل نامساویها به مساوی، متغیرهای کمکی (slack variables) و را اضافه میکنیم:
تابع هدف:
محدودیتها:
۵. جدول اولیه سیمپلکس: پنجرهای به یک راهحل اولیه
پس از اینکه مسئله را به فرم استاندارد درآوردیم، یعنی تمام محدودیتها را به صورت معادلات با استفاده از متغیرهای کمکی نوشتیم و شرط غیرمنفی بودن را برای تمام متغیرها در نظر گرفتیم، آمادهایم تا اولین جدول سیمپلکس را تشکیل دهیم. جدول سیمپلکس در حقیقت یک نمایش ماتریسی سازمانیافته از سیستم معادلات خطی ما (محدودیتها و تابع هدف) است. این جدول به ما کمک میکند تا به طور سیستماتیک از یک جواب شدنی (feasible) به سمت جواب بهینه حرکت کنیم.
در ابتدا، ما یک جواب شدنی اولیه بسیار ساده را در نظر میگیریم. این جواب معمولاً با صفر قرار دادن تمام متغیرهای تصمیم اصلی () و در نتیجه، اختصاص دادن مقادیر سمت راست محدودیتها به متغیرهای کمکی () به دست میآید. این نقطه، یک گوشه (vertex) از ناحیه شدنی (feasible region) مسئله ماست. در این مثال، اگر و باشند، آنگاه و خواهد بود و مقدار تابع هدف است.
جدول اولیه سیمپلکس به این صورت شکل میگیرد:
ستون “Basis” (پایه) نشان میدهد که کدام متغیرها در حال حاضر جواب ما را تشکیل میدهند (متغیرهای پایهای). در ابتدا، اینها متغیرهای کمکی و هستند. مقادیر آنها در ستون “RHS” (Right Hand Side یا سمت راست) آمده است. ردیف Z ضرایب تابع هدف را نشان میدهد، اما با علامتی که برای بیشینهسازی مناسب باشد (). ضرایب منفی در ردیف Z برای متغیرهای غیرپایهای (اینجا و ) به ما میگویند که اگر مقدار آن متغیر را افزایش دهیم، مقدار تابع هدف افزایش خواهد یافت. به عبارت دیگر، این ضرایب نشاندهنده پتانسیل بهبود جواب هستند.
۶. مرحله اول سیمپلکس (Iteration 1): اولین گام به سوی بهینگی
انتخاب متغیر ورودی (Entering Variable): کدام مسیر بیشترین بهبود را دارد؟
برای بهبود جواب فعلی (که است)، باید یکی از متغیرهای غیرپایهای (که در حال حاضر و هستند و مقدارشان صفر است) را وارد پایه کنیم، یعنی مقدارش را از صفر افزایش دهیم. برای انتخاب اینکه کدام متغیر وارد شود، به ردیف Z نگاه میکنیم. ضریب برابر و ضریب برابر است. این یعنی به ازای هر واحد افزایش (در حالی که سایر غیرپایهایها صفر بمانند)، به اندازه ۳ واحد افزایش مییابد و به ازای هر واحد افزایش , به اندازه ۵ واحد افزایش مییابد. ما مسیری را انتخاب میکنیم که بیشترین نرخ بهبود را دارد، بنابراین را به عنوان متغیر ورودی انتخاب میکنیم. ستونی که در آن قرار دارد، ستون لولا (Pivot Column) نامیده میشود (در جدول بالا با فونت برجسته مشخص شده).
انتخاب متغیر خروجی (Leaving Variable): تا کجا میتوانیم پیش برویم؟
حالا که تصمیم گرفتیم را افزایش دهیم، باید ببینیم تا چه حد میتوانیم این کار را انجام دهیم بدون اینکه از ناحیه شدنی خارج شویم، یعنی بدون اینکه هیچ متغیر پایهای منفی شود (چون ). برای این کار، “آزمون نسبت” (Ratio Test) را انجام میدهیم. برای هر ردیف محدودیت (به جز ردیف Z)، مقدار RHS را بر ضریب مثبت متغیر ورودی () در آن ردیف تقسیم میکنیم:
- برای سطر : . این یعنی اگر به ۴ برسد، صفر میشود.
- برای سطر : . این یعنی اگر به ۷ برسد، صفر میشود.
ما باید کوچکترین نسبت مثبت را انتخاب کنیم، که در اینجا ۴ است. اگر از ۴ بیشتر شود، منفی خواهد شد که مجاز نیست. این بدان معناست که متغیر اولین متغیری خواهد بود که با افزایش به صفر میرسد. بنابراین، متغیری است که باید از پایه خارج شود تا جا برای باز شود. سطری که در آن قرار دارد، سطر لولا (Pivot Row) نامیده میشود. عددی که در تقاطع ستون لولا و سطر لولا قرار دارد (اینجا عدد ۲)، عنصر لولا (Pivot Element) است.
عملیات لولازنی (Pivoting): بهروزرسانی جدول برای انعکاس گوشه جدید
اکنون باید جدول را با استفاده از عملیات سطری مقدماتی (مشابه روش حذفی گاوس در حل دستگاه معادلات) بهروز کنیم تا وارد پایه شده و از آن خارج شود. هدف این است که ستون متغیر ورودی () در جدول جدید، یک ستون واحد (یک ۱ در سطر لولا و صفر در سایر سطرها) شود.
ابتدا سطر لولا () را بر عنصر لولا (۲) تقسیم میکنیم تا ضریب در این سطر ۱ شود. این سطر، سطر جدید در جدول بعدی خواهد بود.
سپس، برای سایر سطرها (شامل ردیف Z و سطر )، مضرب مناسبی از سطر لولای جدید را از آنها کم یا به آنها اضافه میکنیم تا ضریب در آن سطرها صفر شود.
این عملیات، معادل حل سیستم معادلات برای متغیرهای پایهای جدید () بر حسب متغیرهای غیرپایهای جدید () است.
جدول پس از این عملیات به شکل زیر در میآید:
در این جدول جدید، متغیرهای پایهای و هستند. مقادیر آنها و است (متغیرهای غیرپایهای و صفر هستند). مقدار تابع هدف به ۲۰ افزایش یافته است. ما از گوشه به گوشه حرکت کردهایم.
۷. مرحله دوم سیمپلکس (Iteration 2): ادامه جستجو برای بهینگی
اکنون دوباره به ردیف Z در جدول جدید نگاه میکنیم. ضریب برابر است که هنوز منفی است. این یعنی با وارد کردن به پایه، هنوز میتوانیم را افزایش دهیم. پس متغیر ورودی جدید و ستون آن ستون لولا است. برای انتخاب متغیر خروجی، دوباره آزمون نسبت را انجام میدهیم:
- برای سطر : .
- برای سطر : .
کوچکترین نسبت مثبت ۲ است، که مربوط به سطر میباشد. پس متغیر خروجی و سطر آن سطر لولا است. عنصر لولا میباشد.
دوباره عملیات لولازنی را انجام میدهیم تا وارد پایه شده و خارج شود.
جدول پس از مرحله دوم (جدول نهایی و بهینه):
۸. تفسیر جواب بهینه: رسیدن به قله
حالا به ردیف Z در این جدول نهایی نگاه میکنیم. ضرایب متغیرهای غیرپایهای ( و ) به ترتیب و هستند. هر دو مثبت هستند (یا صفر). این بدان معناست که اگر بخواهیم یا را وارد پایه کنیم (یعنی مقادیرشان را از صفر افزایش دهیم)، مقدار تابع هدف کاهش خواهد یافت (چون در فرمول اصلی ، اگر مثبت باشد، برای ثابت ماندن تساوی با افزایش باید هم افزایش یابد، اما اینجا ضرایب در ردیف Z نشاندهنده یا مشتق نسبت به متغیر غیرپایهای هستند). بنابراین، هیچ حرکت دیگری وجود ندارد که بتواند مقدار را بهبود بخشد. ما به جواب بهینه رسیدهایم.
از ستون “Basis” و “RHS” میخوانیم:
- متغیر پایهای مقدار ۲ را دارد.
- متغیر پایهای مقدار ۳ را دارد.
- مقدار تابع هدف برابر ۲۱ است.
متغیرهای و چون در پایه نیستند، مقدارشان صفر است. این یعنی هر دو محدودیت ماشینکاری و مونتاژ به طور کامل استفاده شدهاند و هیچ ظرفیت بلااستفادهای باقی نمانده است (محدودیتهای فعال یا تنگاتنگ).
بنابراین، روش سیمپلکس با شروع از یک جواب اولیه شدنی و حرکت گام به گام به سمت جوابهای بهتر از طریق عملیات جبری سازمانیافته در قالب جدول، ما را به جواب بهینه میرساند. هر جدول نمایانگر یک گوشه از ناحیه شدنی است و هر مرحله (iteration) ما را به گوشهای بهتر (یا حداقل مساوی) منتقل میکند تا زمانی که بهینگی محقق شود.
دربارهٔ مارپیچ بیشتر بخوانید:
- Ant Mill: مارپیچ درونگرای میرا
- Why Do Spirals Exist Everywhere in Nature
- دیزاین ماژولار و دیزاین کلنگر