مقدمه: دروازهای به دنیای بهینهسازی و تصمیمگیری هوشمندانه
آیا تا به حال به این فکر کردهاید که چگونه شرکتهای بزرگ، سازمانهای پیچیده و حتی دولتها، تصمیمات استراتژیک خود را به گونهای اتخاذ میکنند که منابع محدود را به بهترین شکل ممکن تخصیص دهند و به حداکثر سود یا حداقل هزینه دست یابند؟ پاسخ اغلب در دل علمی قدرتمند و کاربردی به نام "تحقیق در عملیات" (Operations Research - OR) نهفته است. تحقیق در عملیات، رویکردی علمی برای حل مسائل پیچیده تصمیمگیری است که با استفاده از مدلهای ریاضی، الگوریتمها و ابزارهای تحلیلی، به مدیران و تصمیمگیرندگان کمک میکند تا انتخابهای بهینه و منطقی داشته باشند.
در میان انبوهی از تکنیکها و روشهای تحقیق در عملیات، "برنامهریزی خطی" (Linear Programming - LP) جایگاه ویژهای دارد. این روش، ستون فقرات بسیاری از مسائل بهینهسازی در دنیای واقعی است و به ما امکان میدهد تا با مجموعهای از محدودیتهای خطی، تابع هدف خطی را بهینه کنیم. اما چگونه میتوانیم این مفاهیم انتزاعی ریاضی را به شکلی ملموس و قابل درک تجسم کنیم؟ اینجا است که "روشهای ترسیمی" (Graphical Methods) وارد عمل میشوند.
روش ترسیمی در تحقیق در عملیات، نه تنها یک ابزار حل مسئله است، بلکه یک پنجره بصری به درک عمیقتر مفاهیم برنامهریزی خطی را برای ما میگشاید. این روش، به ویژه برای مسائل با دو متغیر تصمیم، قدرت فوقالعادهای در ارائه بینشهای شهودی و درک هندسی از فضای راهحل و نقاط بهینه دارد. در این مقاله جامع و بینظیر، ما قصد داریم تا شما را در سفری عمیق و پربار به دنیای روشهای ترسیمی در تحقیق در عملیات همراهی کنیم. از مبانی نظری تا کاربردهای عملی، از چالشها تا راهحلها، و از نکات کلیدی برای تسلط بر این روش تا بررسی موارد خاص و پیچیده، همه و همه را با جزئیات بیسابقه و رویکردی کاملاً منحصر به فرد مورد بررسی قرار خواهیم داد.
هدف ما این است که این مقاله نه تنها یک منبع آموزشی کامل و مرجع برای دانشجویان و علاقهمندان به تحقیق در عملیات باشد، بلکه به عنوان یک راهنمای کاربردی برای متخصصان و تصمیمگیرندگان نیز عمل کند. ما با رویکردی گام به گام و با استفاده از مثالهای متعدد و تشریح دقیق هر مرحله، اطمینان حاصل میکنیم که شما نه تنها مفاهیم را درک کنید، بلکه قادر به پیادهسازی و تحلیل آنها در سناریوهای واقعی نیز باشید. آمادهاید تا رمز و رازهای بهینهسازی را از طریق قدرت تجسم کشف کنید؟ پس با ما همراه باشید تا این سفر هیجانانگیز را آغاز کنیم.
بخش اول: تحقیق در عملیات – ستون فقرات تصمیمگیری مدرن
پیش از آنکه به عمق روشهای ترسیمی بپردازیم، ضروری است که درک جامعی از بستر اصلی آن، یعنی تحقیق در عملیات (OR)، داشته باشیم. تحقیق در عملیات، فراتر از یک درس دانشگاهی، یک رویکرد فلسفی و علمی برای حل مسائل پیچیده در دنیای واقعی است.
1.1. تحقیق در عملیات چیست؟ تعریفی جامع و کاربردی
تحقیق در عملیات (OR) که گاهی به آن علم مدیریت (Management Science) نیز گفته میشود، رشتهای میانرشتهای است که از روشهای علمی، ریاضی و تحلیلی برای بهبود فرآیندهای تصمیمگیری استفاده میکند. هدف اصلی OR، یافتن بهترین یا بهینهترین راهحل برای مسائل پیچیده است که معمولاً شامل تخصیص منابع محدود، برنامهریزی فعالیتها، مدیریت موجودی، بهینهسازی شبکهها و بسیاری دیگر میشود.
OR با استفاده از مدلهای ریاضی، پدیدههای دنیای واقعی را به صورت انتزاعی نمایش میدهد. این مدلها به تصمیمگیرندگان اجازه میدهند تا سناریوهای مختلف را شبیهسازی کرده، پیامدهای احتمالی هر تصمیم را ارزیابی کنند و در نهایت، تصمیمی را اتخاذ کنند که منجر به بهترین نتیجه ممکن (مانند حداکثر سود، حداقل هزینه، حداکثر کارایی) شود.
1.2. تاریخچه و تکامل: از جنگ جهانی تا عصر دادههای بزرگ
ریشههای تحقیق در عملیات به جنگ جهانی دوم بازمیگردد. در آن زمان، ارتشهای متفقین با چالشهای پیچیدهای مانند تخصیص منابع نظامی، برنامهریزی عملیات بمباران، و بهینهسازی رادارهای دفاعی مواجه بودند. تیمهایی از دانشمندان، ریاضیدانان و مهندسان گرد هم آمدند تا با استفاده از رویکردهای علمی، این مسائل را حل کنند. موفقیت این تیمها در بهبود کارایی عملیات نظامی، اهمیت رویکرد "تحقیق در عملیات" را به سرعت نمایان ساخت.
پس از جنگ، این روشها به سرعت به صنایع و کسبوکارهای غیرنظامی راه یافتند. با توسعه کامپیوترها و الگوریتمهای پیچیدهتر، OR توانست مسائل بزرگتر و پیچیدهتری را حل کند. امروزه، تحقیق در عملیات در حوزههایی مانند لجستیک و زنجیره تأمین، مالی، بازاریابی، بهداشت و درمان، تولید، مخابرات و حتی ورزش کاربرد گستردهای دارد. در عصر دادههای بزرگ (Big Data) و هوش مصنوعی، OR نقش حیاتیتری در استخراج بینشهای عملی از دادهها و اتخاذ تصمیمات مبتنی بر شواهد ایفا میکند.
1.3. اهمیت و کاربردها در دنیای واقعی: چرا OR حیاتی است؟
در دنیای پررقابت امروز، تصمیمگیریهای هوشمندانه و بهینه، مزیت رقابتی بیبدیلی را برای سازمانها ایجاد میکند. OR دقیقاً همین کار را انجام میدهد. برخی از کاربردهای کلیدی OR عبارتند از:
مدیریت زنجیره تأمین: بهینهسازی مسیرهای حمل و نقل، مکانیابی انبارها، مدیریت موجودی و برنامهریزی تولید.
مالی: بهینهسازی سبد سهام، مدیریت ریسک، برنامهریزی مالی و قیمتگذاری اوراق بهادار.
تولید: برنامهریزی تولید، زمانبندی ماشینآلات، کنترل کیفیت و طراحی خطوط مونتاژ.
بهداشت و درمان: برنامهریزی شیفت پرستاران و پزشکان، تخصیص تختهای بیمارستانی، بهینهسازی جریان بیماران و مدیریت منابع دارویی.
بازاریابی: بهینهسازی کمپینهای تبلیغاتی، قیمتگذاری محصولات و تحلیل رفتار مشتری.
انرژی: بهینهسازی تولید و توزیع برق، برنامهریزی نگهداری نیروگاهها.
اینها تنها نمونههایی از کاربردهای بیشمار OR هستند. در هر حوزهای که منابع محدود و تصمیمات پیچیده وجود دارد، OR میتواند به یافتن راهحلهای بهینه کمک کند.
1.4. مراحل رویکرد تحقیق در عملیات: یک چارچوب حل مسئله
فرآیند حل مسئله در تحقیق در عملیات معمولاً شامل مراحل زیر است:
تعریف مسئله: شفافسازی اهداف، شناسایی متغیرهای تصمیم، محدودیتها و دادههای مرتبط. این مرحله حیاتیترین گام است، زیرا یک تعریف نادرست از مسئله میتواند به راهحلهای بیفایده منجر شود.
ساخت مدل: ترجمه مسئله واقعی به یک مدل ریاضی. این مدل شامل تابع هدف (آنچه میخواهیم بهینه کنیم) و مجموعهای از محدودیتها (محدودیتهای منابع، قوانین عملیاتی و غیره) است.
حل مدل: استفاده از تکنیکهای ریاضی و الگوریتمها (مانند روش ترسیمی، سیمپلکس، شبیهسازی) برای یافتن راهحل بهینه برای مدل.
اعتبارسنجی مدل: بررسی اینکه آیا مدل ساخته شده، واقعیت را به درستی منعکس میکند و آیا راهحلهای پیشنهادی آن منطقی و قابل اجرا هستند.
اجرای راهحل: پیادهسازی راهحل بهینه در دنیای واقعی. این مرحله ممکن است شامل آموزش کارکنان، تغییر فرآیندها و نظارت بر نتایج باشد.
نظارت و بهروزرسانی: پیگیری عملکرد راهحل و بهروزرسانی مدل در صورت تغییر شرایط.
با این درک از تحقیق در عملیات، اکنون آمادهایم تا به یکی از قدرتمندترین و در عین حال بصریترین ابزارهای آن، یعنی برنامهریزی خطی و روشهای ترسیمی، بپردازیم.
بخش دوم: برنامهریزی خطی – الفبای بهینهسازی
برنامهریزی خطی (Linear Programming - LP) قلب بسیاری از مسائل تحقیق در عملیات است. این تکنیک، چارچوبی ریاضی برای بهینهسازی یک تابع هدف خطی، تحت مجموعهای از محدودیتهای خطی فراهم میکند.
2.1. برنامهریزی خطی چیست؟ تعاریف و اجزا
برنامهریزی خطی یک روش ریاضی برای تعیین بهترین خروجی در یک مدل ریاضی است که الزامات آن توسط روابط خطی نشان داده شدهاند. به عبارت سادهتر، LP به ما کمک میکند تا با توجه به منابع محدود و اهداف مشخص، بهترین تصمیم را بگیریم.
یک مدل برنامهریزی خطی از اجزای اصلی زیر تشکیل شده است:
متغیرهای تصمیم (Decision Variables): اینها مقادیری هستند که ما باید برای آنها تصمیم بگیریم. مثلاً، تعداد واحدهای تولیدی از هر محصول، مقدار سرمایهگذاری در هر پروژه، یا تعداد ساعت کار هر کارگر. متغیرهای تصمیم معمولاً با x1, x2, ..., xn نمایش داده میشوند.
تابع هدف (Objective Function): این تابع، کمیتی را نشان میدهد که ما میخواهیم آن را بهینه کنیم (حداکثر کنیم یا حداقل کنیم). تابع هدف همیشه یک رابطه خطی از متغیرهای تصمیم است. مثلاً، حداکثر کردن سود کل، حداقل کردن هزینه تولید، یا حداکثر کردن بهرهوری.
مثال: Max Z = 3x1 + 5x2 (حداکثر کردن سود)
مثال: Min C = 2x1 + 4x2 (حداقل کردن هزینه)
محدودیتها (Constraints): اینها محدودیتهایی هستند که بر متغیرهای تصمیم اعمال میشوند. این محدودیتها میتوانند ناشی از محدودیت منابع (مانند مواد اولیه، نیروی کار، زمان)، ظرفیت تولید، تقاضای بازار، یا قوانین و مقررات باشند. محدودیتها نیز باید به صورت روابط خطی (نامساوی یا مساوی) بیان شوند.
مثال: x1 + x2 ≤ 100 (محدودیت مواد اولیه)
مثال: 2x1 + x2 ≥ 50 (محدودیت حداقل تولید)
شرط عدم منفی بودن (Non-negativity Restriction): متغیرهای تصمیم معمولاً نمیتوانند مقادیر منفی داشته باشند. به عنوان مثال، نمیتوانید تعداد منفی از یک محصول را تولید کنید. بنابراین، این شرط به صورت x1 ≥ 0, x2 ≥ 0 و ... بیان میشود.
2.2. فرمولبندی مسائل برنامهریزی خطی: از مسئله کلامی تا مدل ریاضی
یکی از مهمترین گامها در حل مسائل LP، فرمولبندی صحیح آنهاست. این فرآیند شامل ترجمه یک مسئله کلامی و توصیفی به یک مدل ریاضی ساختاریافته است. بیایید با یک مثال ساده این فرآیند را بررسی کنیم:
مثال 2.2.1: مسئله تولید مبلمان
یک کارگاه تولید مبلمان دو نوع صندلی (نوع A و نوع B) تولید میکند. برای تولید هر صندلی نوع A، 2 ساعت کار نجاری و 1 ساعت کار رنگآمیزی لازم است. برای تولید هر صندلی نوع B، 1 ساعت کار نجاری و 3 ساعت کار رنگآمیزی لازم است. کارگاه در هفته حداکثر 100 ساعت کار نجاری و 120 ساعت کار رنگآمیزی در دسترس دارد. سود حاصل از فروش هر صندلی نوع A، 300 هزار تومان و از هر صندلی نوع B، 500 هزار تومان است. هدف کارگاه، حداکثر کردن سود هفتگی است.
گامهای فرمولبندی:
تعریف متغیرهای تصمیم:
x1: تعداد صندلیهای نوع A که در هفته تولید میشود.
x2: تعداد صندلیهای نوع B که در هفته تولید میشود.
تعریف تابع هدف: هدف حداکثر کردن سود است.
سود از نوع A: 300x1
سود از نوع B: 500x2
Max Z = 300x1 + 500x2
تعریف محدودیتها:
محدودیت کار نجاری: (ساعت نجاری برای A) + (ساعت نجاری برای B) ≤ (حداکثر ساعت نجاری موجود)
2x1 + 1x2 ≤ 100
محدودیت کار رنگآمیزی: (ساعت رنگآمیزی برای A) + (ساعت رنگآمیزی برای B) ≤ (حداکثر ساعت رنگآمیزی موجود)
1x1 + 3x2 ≤ 120
شرط عدم منفی بودن:
x1 ≥ 0, x2 ≥ 0 (تعداد صندلیها نمیتواند منفی باشد)
مدل LP کامل:
Max Z = 300x1 + 500x2
Subject to:
2x1 + x2 ≤ 100
x1 + 3x2 ≤ 120
x1, x2 ≥ 0
این مدل ریاضی، اکنون آماده حل است. برای مسائل با دو متغیر تصمیم، روش ترسیمی ابزاری قدرتمند برای یافتن راهحل بهینه و درک بصری آن است.
2.3. فرضهای برنامهریزی خطی: محدودیتها و واقعیت
مهم است که بدانیم برنامهریزی خطی بر اساس چند فرض کلیدی بنا شده است. درک این فرضها به ما کمک میکند تا محدودیتهای LP را بشناسیم و بدانیم چه زمانی استفاده از آن مناسب است:
خطی بودن (Linearity): تمام روابط در مدل (تابع هدف و محدودیتها) باید خطی باشند. این بدان معناست که هیچ توان، ریشه، ضرب یا تقسیم متغیرها وجود ندارد.
افزودنی بودن (Additivity): مجموع فعالیتها برابر با مجموع فعالیتهای جداگانه است. به عنوان مثال، سود کل برابر با مجموع سود حاصل از هر محصول است.
تقسیمپذیری (Divisibility): متغیرهای تصمیم میتوانند مقادیر کسری یا اعشاری داشته باشند. مثلاً، میتوان 2.5 واحد از یک محصول را تولید کرد. اگر متغیرها باید حتماً عدد صحیح باشند، به برنامهریزی عدد صحیح (Integer Programming) نیاز داریم.
قطعیت (Certainty): تمام پارامترهای مدل (ضرایب تابع هدف، ضرایب محدودیتها و مقادیر سمت راست محدودیتها) به طور دقیق و با قطعیت مشخص هستند و در طول زمان ثابت میمانند. در دنیای واقعی، این فرض همیشه برقرار نیست و عدم قطعیت میتواند با روشهای دیگری مانند برنامهریزی تصادفی (Stochastic Programming) مدیریت شود.
با درک این مفاهیم بنیادی، اکنون آمادهایم تا به قلب بحث خود، یعنی روشهای ترسیمی، بپردازیم.
بخش سوم: روشهای ترسیمی – تجسم بهینهسازی
روش ترسیمی، ابزاری قدرتمند و بصری برای حل مسائل برنامهریزی خطی با دو متغیر تصمیم است. این روش به ما امکان میدهد تا فضای راهحلهای ممکن و نقطه بهینه را به صورت هندسی درک کنیم.
3.1. چرا روش ترسیمی؟ مزایای بصری و شهودی
در حالی که روش سیمپلکس (Simplex Method) برای حل مسائل LP با تعداد متغیرهای بیشتر استفاده میشود، روش ترسیمی مزایای منحصر به فردی دارد:
بینش شهودی: به دانشجویان و تحلیلگران کمک میکند تا مفاهیم اساسی برنامهریزی خطی مانند ناحیه موجه، نقاط گوشهای و خطوط همسود/همهزینه را به صورت بصری درک کنند.
سادگی: برای مسائل کوچک (دو متغیر)، روشی نسبتاً ساده و سریع است.
درک موارد خاص: به راحتی میتوان موارد خاص مانند راهحلهای نامحدود، راهحلهای نشدنی و راهحلهای چندگانه را به صورت گرافیکی تشخیص داد.
مقدمهای بر سیمپلکس: درک روش ترسیمی، پایهای قوی برای درک الگوریتم سیمپلکس فراهم میکند.
3.2. گام به گام: فرآیند حل با روش ترسیمی
برای حل یک مسئله برنامهریزی خطی با دو متغیر تصمیم (x1 و x2) با استفاده از روش ترسیمی، مراحل زیر را دنبال میکنیم:
گام 1: رسم محورهای مختصات
یک دستگاه مختصات دکارتی رسم کنید. محور افقی را به x1 و محور عمودی را به x2 اختصاص دهید. از آنجا که متغیرها غیرمنفی هستند (x1 ≥ 0, x2 ≥ 0)، تنها ربع اول (Quadrant I) مورد نظر ماست.
گام 2: رسم خطوط محدودیت
هر نامساوی محدودیت را به یک معادله خطی تبدیل کنید. برای هر خط، دو نقطه را پیدا کنید (معمولاً با قرار دادن x1=0 و یافتن x2، و سپس قرار دادن x2=0 و یافتن x1). این دو نقطه را به هم وصل کنید تا خط مربوط به محدودیت رسم شود.
گام 3: تعیین ناحیه موجه (Feasible Region)
پس از رسم هر خط محدودیت، باید ناحیه مجاز مربوط به آن نامساوی را تعیین کنید.
برای نامساویهای "≤" (کوچکتر یا مساوی)، ناحیه مجاز زیر یا سمت چپ خط قرار دارد (ناحیهای که شامل مبدأ (0,0) میشود، اگر مبدأ در نامساوی صدق کند).
برای نامساویهای "≥" (بزرگتر یا مساوی)، ناحیه مجاز بالای یا سمت راست خط قرار دارد (ناحیهای که شامل مبدأ (0,0) نمیشود، اگر مبدأ در نامساوی صدق نکند).
برای محدودیتهای مساوی (=)، راهحلها فقط روی خود خط قرار دارند.
ناحیه موجه، اشتراک تمام نواحی مجاز برای همه محدودیتها است. این ناحیه معمولاً یک چندضلعی محدب (Convex Polygon) است. هر نقطه درون یا روی مرز این ناحیه، یک راهحل موجه (Feasible Solution) است.
گام 4: تعیین نقاط گوشهای (Corner Points / Extreme Points)
نقاط گوشهای ناحیه موجه را شناسایی کنید. این نقاط، محل تلاقی خطوط محدودیت هستند. برای یافتن مختصات دقیق هر نقطه گوشهای، معادلات خطوطی که در آن نقطه تلاقی دارند را به صورت همزمان حل کنید.
گام 5: ارزیابی تابع هدف در نقاط گوشهای
بر اساس قضیه اساسی برنامهریزی خطی، راهحل بهینه (اگر وجود داشته باشد) همیشه در یکی از نقاط گوشهای ناحیه موجه رخ میدهد. بنابراین، مقدار تابع هدف را در هر یک از نقاط گوشهای محاسبه کنید.
گام 6: انتخاب راهحل بهینه
برای مسائل حداکثرسازی (Maximization)، نقطهای که بیشترین مقدار تابع هدف را تولید میکند، راهحل بهینه است.
برای مسائل حداقلسازی (Minimization)، نقطهای که کمترین مقدار تابع هدف را تولید میکند، راهحل بهینه است.
گام 7: تفسیر نتایج
راهحل بهینه (مقادیر x1 و x2) و مقدار بهینه تابع هدف (Z یا C) را در قالب مسئله اصلی تفسیر کنید.
3.3. مثال کاربردی: حل مسئله تولید مبلمان (حداکثرسازی)
بیایید مسئله تولید مبلمان را که قبلاً فرمولبندی کردیم، با روش ترسیمی حل کنیم:
مدل LP:
Max Z = 300x1 + 500x2
Subject to:
(1) 2x1 + x2 ≤ 100
(2) x1 + 3x2 ≤ 120
(3) x1, x2 ≥ 0
گام 1: رسم محورها
محور x1 و x2 را در ربع اول رسم میکنیم.
گام 2: رسم خطوط محدودیت
محدودیت (1): 2x1 + x2 ≤ 100
معادله خط: 2x1 + x2 = 100
اگر x1 = 0 => x2 = 100. نقطه (0, 100)
اگر x2 = 0 => 2x1 = 100 => x1 = 50. نقطه (50, 0)
این دو نقطه را وصل میکنیم. از آنجا که نامساوی "≤" است، ناحیه مجاز زیر این خط قرار دارد.
محدودیت (2): x1 + 3x2 ≤ 120
معادله خط: x1 + 3x2 = 120
اگر x1 = 0 => 3x2 = 120 => x2 = 40. نقطه (0, 40)
اگر x2 = 0 => x1 = 120. نقطه (120, 0)
این دو نقطه را وصل میکنیم. از آنجا که نامساوی "≤" است، ناحیه مجاز زیر این خط قرار دارد.
محدودیتهای عدم منفی بودن: x1 ≥ 0, x2 ≥ 0
اینها به ما میگویند که راهحل باید در ربع اول باشد.
گام 3: تعیین ناحیه موجه
ناحیه موجه، ناحیهای است که توسط هر دو خط محدودیت و محورهای مختصات احاطه شده است. این ناحیه شامل مبدأ (0,0) است و به سمت داخل و پایین خطوط محدودیت گسترش مییابد. (تصور کنید ناحیهای که از تلاقی خطوط و محورها در ربع اول تشکیل شده است).
گام 4: تعیین نقاط گوشهای
نقاط گوشهای ناحیه موجه عبارتند از:
A: (0, 0) (مبدأ)
B: (50, 0) (تلاقی خط (1) با محور x1)
C: (0, 40) (تلاقی خط (2) با محور x2)
D: تلاقی خطوط (1) و (2)
2x1 + x2 = 100 (معادله 1)
x1 + 3x2 = 120 (معادله 2)
از معادله (1)، x2 = 100 - 2x1. این را در معادله (2) جایگزین میکنیم:
x1 + 3(100 - 2x1) = 120
x1 + 300 - 6x1 = 120
-5x1 = 120 - 300
-5x1 = -180
x1 = 36
اکنون x1=36 را در x2 = 100 - 2x1 جایگزین میکنیم:
x2 = 100 - 2(36) = 100 - 72 = 28
نقطه D: (36, 28)
گام 5: ارزیابی تابع هدف در نقاط گوشهای
Max Z = 300x1 + 500x2
نقطه A (0, 0): Z = 300(0) + 500(0) = 0
نقطه B (50, 0): Z = 300(50) + 500(0) = 15000
نقطه C (0, 40): Z = 300(0) + 500(40) = 20000
نقطه D (36, 28): Z = 300(36) + 500(28) = 10800 + 14000 = 24800
گام 6: انتخاب راهحل بهینه
بالاترین مقدار Z، برابر با 24800 در نقطه D (36, 28) است.
برای تهیه آموزش درس تحقیق در عملیات به سایت آکادمی نیک درس مراجعه کنید.
گام 7: تفسیر نتایج
برای حداکثر کردن سود، کارگاه باید 36 صندلی نوع A و 28 صندلی نوع B تولید کند. حداکثر سود هفتگی حاصل از این تصمیم، 24,800 هزار تومان (24 میلیون و 800 هزار تومان) خواهد بود.
3.4. مثال کاربردی: حل مسئله حداقلسازی (Minimization)
روش ترسیمی برای مسائل حداقلسازی نیز به همین ترتیب عمل میکند، با این تفاوت که در گام آخر، کمترین مقدار تابع هدف را انتخاب میکنیم.