معرفی دوره
دوره مدلسازی مسائل بهینهسازی نقطه شروع ورود به دنیای بهینهسازی است و بر مهمترین بخش هر پروژه، یعنی مدلسازی صحیح مسئله تمرکز دارد. در این دوره، پیش از هرگونه برنامهنویسی یا استفاده از نرمافزارهای حلکننده، یاد میگیرید چگونه یک مسئله واقعی را به یک مدل ریاضی دقیق و قابل حل تبدیل کنید.
تجربه نشان میدهد بیشترِ شکستها در پروژههای بهینهسازی نه در کدنویسی، بلکه در مدلسازی نادرست ریشه دارند؛ این دوره دقیقاً همین شکاف را پر میکند. برای مرور مفهومی مکمل، یادداشت مدلسازی ریاضی و اهمیت آن را هم ببینید.
چرا مدلسازی مهمتر از کدنویسی است؟
یک solver قدرتمند مانند Gurobi تنها زمانی مفید است که مسئله بهدرستی فرموله شده باشد. اگر متغیر تصمیم، تابع هدف یا قیود اشتباه تعریف شوند، هیچ سالورای جواب درست نمیدهد. در این دوره ابتدا زبان مدلسازی را میآموزید و سپس با ذهنیت درست وارد کدنویسی میشوید.
پیش از آنکه کارگر و بتون و آجر بیاید، نقشه روی کاغذ میآید. هیچ معمار عاقلی سراغ خرید مصالح یا ساختوساز نمیرود پیش از آنکه بداند دقیقاً چه چیزی میسازد، ابعادش چیست و در برابر چه بارهایی باید مقاوم باشد. بهینهسازی هم دقیقاً همین ترتیب را دارد؛ سه گام پشتِسرِ هم:

۱. نقشه (مدل ریاضی): متغیر تصمیم، تابع هدف و قیود را روی کاغذ مینویسید. این همان نقشهٔ معماری است؛ اگر اینجا اشتباه کنید، تا آخر پروژه اشتباه میمانید.
۲. انتخاب ساختمان (سالور): بسته به اینکه مدل شما LP است یا MILP یا NLP، سالورِ مناسب را انتخاب میکنید — همانطور که برای یک ویلای یکطبقه سازهٔ فلزی سنگین نمیسازید و برای برج، دیوار خشتی نمیچینید.
۳. ساخت (کدنویسی): حالا نوبت اجراست. کد فقط ترجمهٔ نقشه به زبانی است که سالور میفهمد؛ نه بیشتر، نه کمتر.
بیشترِ پروژههای شکستخوردهٔ بهینهسازی، پروژههایی هستند که مستقیم از گام سوم شروع شدهاند: کد زدهاند بدون اینکه نقشهای در کار باشد. این دوره دقیقاً همان گام اول را به شما یاد میدهد.
سرفصلهای دوره
۱ — مفاهیم پایه مدلسازی
تعریف دقیق سه رکن اصلی هر مدل بهینهسازی: متغیر تصمیم (چه چیزی را کنترل میکنیم؟)، تابع هدف (چه چیزی را کمینه یا بیشینه میکنیم؟) و قیود (چه محدودیتهایی باید رعایت شوند؟). این سهگانه سنگبنای تمام مسائل بعدی است.
۲ — انواع مسائل بهینهسازی
آشنایی با دستهبندی مسائل و تأثیر آن بر انتخاب solver: برنامهریزی خطی (LP)، برنامهریزی عدد صحیح-مخلوط (MILP)، برنامهریزی غیرخطی (NLP) و مسائل غیرخطیِ عددصحیح-مخلوط (MINLP). میفهمید هر خانواده چه سختی محاسباتی دارد و چرا انتخاب نوع مدل روی زمان حل اثر مستقیم میگذارد.
۳ — فرمولهسازی مسائل مهندسی و انرژی
بررسی مسائل واقعی حوزه مهندسی و انرژی و روش صحیح تبدیل آنها به مدل ریاضی؛ از تخصیص منابع و برنامهریزی تولید تا مسائل ساده سیستم قدرت. تمرین بر «ترجمه» بیان کلامی مسئله به رابطههای ریاضی. این پایه دقیقاً همان چیزی است که در دوره مقدماتی بهینهسازی سیستمهای قدرت و دوره پیشرفته بهینهسازی سیستم قدرت بهکار میآید؛ هر دو روی همین مهارت مدلسازی صحیح بنا شدهاند.
۴ — فرمولهسازی مسائل کسبوکار و لجستیک
مدلسازی مسائل تصمیمگیری در کسبوکار: تخصیص بودجه، برنامهریزی نیروی کار، مسائل حملونقل و تخصیص. تمرکز بر تشخیص متغیرهای باینری و شرطیسازی منطقی (big-M و متغیرهای کمکی). این مبانی مستقیماً در دوره مسیریابی و بهینهسازی با پایتون هم بهکار میروند.
۵ — تکنیکهای خطیسازی و مدلسازی هوشمند
روشهای تبدیل قیود و توابع غیرخطی به شکل خطی برای حل کارآمدتر: مدلسازی قدرمطلق، بیشینه/کمینه، شرطهای منطقی و متغیرهای صفر-و-یک. این مهارت مرز بین یک مدل «قابل حل» و یک مدل «غیرقابل حل در زمان معقول» است.
۶ — آمادگی برای کدنویسی
نگاشتِ مدل ریاضی به کد در ابزارهای استاندارد. یاد میگیرید ساختار مدل ریاضی چطور یکبهیک به مجموعهها، پارامترها، متغیرها و قیود در کد نگاشت میشود.
هدف دوره
- تبدیل مسائل واقعی به مدل ریاضی دقیق و قابل حل
- شناخت متغیرهای تصمیم، تابع هدف و قیود
- تشخیص نوع مسئله (LP، MILP، NLP) و انتخاب رویکرد مناسب
- آمادگی برای کدنویسی با ابزارهای بهینه سازی
یک نمونه ساده: از مسئله تا مدل
فرض کنید میخواهیم با کمترین هزینه، تقاضای یک شبکه را از چند منبع تأمین کنیم. سه رکن مدل چنین میشوند:
# نمونه مدلسازی یک مسئله تخصیص ساده با Pyomo
from pyomo.environ import (ConcreteModel, Set, Var, Objective, Constraint,
NonNegativeReals, minimize, SolverFactory, value)
sources = {'A': {'cost': 4, 'cap': 100},
'B': {'cost': 6, 'cap': 80},
'C': {'cost': 3, 'cap': 60}}
demand = 180
m = ConcreteModel()
m.S = Set(initialize=list(sources.keys()))
# متغیر تصمیم: مقدار تأمین از هر منبع
m.x = Var(m.S, domain=NonNegativeReals,
bounds=lambda m, s: (0, sources[s]['cap']))
# تابع هدف: کمینهکردن هزینه کل
m.cost = Objective(
rule=lambda m: sum(sources[s]['cost'] * m.x[s] for s in m.S),
sense=minimize)
# قید: تأمین کامل تقاضا
m.meet = Constraint(rule=lambda m: sum(m.x[s] for s in m.S) == demand)
SolverFactory('glpk').solve(m)
for s in m.S:
print(f"{s}: {value(m.x[s]):.1f}")
print(f"هزینه کل: {value(m.cost):.1f}")
همین ساختار سهبخشی (متغیر، هدف، قید) در تمام مسائل پیچیدهتر — از سیستم قدرت تا مسیریابی — تکرار و گسترش مییابد. برای اجرای این کد بدون نصب چیزی روی سیستم خودتان، راهنمای Google Colab کمک میکند؛ و برای مرور روشهای مختلف فراخوانی سالور در Pyomo، یادداشت سه روش عملی استفاده از سالورها را ببینید.
این دوره برای چه کسانی است؟
- دانشجویان و پژوهشگرانی که تازه وارد بهینهسازی میشوند
- مهندسان و تحلیلگرانی که مسئله واقعی دارند اما نمیدانند چطور فرمولهاش کنند
- کسانی که میخواهند پیش از دورههای تخصصی (سیستم قدرت، عدم قطعیت، VRP) پایه محکمی بسازند
سوالات متداول درباره دوره
پیشنیاز این دوره چیست؟
این دوره پایه است و پیشنیاز خاصی ندارد. آشنایی مقدماتی با ریاضیات دبیرستانی و کمی برنامهنویسی برای بخش عملی کافی است.
آیا این دوره کدنویسی هم دارد؟
تمرکز اصلی بر مدلسازی است تا آماده ورود به دورههای تخصصی کدنویسی شوید.
بعد از این دوره چه مسیری را ادامه دهم؟
بسته به علاقه، میتوانید وارد دوره مقدماتی و پیشرفته سیستمهای قدرت، دوره مدلسازی عدم قطعیت یا دوره VRP در Python شوید.