بهینه سازی با پایتون (چند هدفه) و حل مسئله بهینه سازی
در زمینه بهینهسازی، مشکلات اغلب نه از یافتن بهترین راهحل برای یک مسئله منفرد، بلکه از مدیریت محیط پیچیدهای از مسائل با اهداف متعدد و گاه متناقض ناشی میشود. اینجاست که بهینهسازی چندهدفه (MOO) وارد عمل میشود و چارچوبی را برای حل چنین مسائل چندوجهی ارائه میدهد. این مقاله در ابتدا به بررسی تفاوت بین بهینه سازی تک هدفه و چندهدفه و سپس به بررسی اصول اساسی MOO، مبانی ریاضی آن، و ارائه یک مثال عملی در پایتون برای توضیح مفاهیم میپردازد.
اصطلاحات کلیدی
- x1, x2, xj … xn: فضای جستجوی مختصات مسئله بهینهسازی.
- x(x1, x2, xj … xn): یک راهحل کاندید یا یک نقطه در فضای جستجو.
- Fi: مقدار تابع هدف در نقطه
حتما دانلود کنید: فیلم های صفر تا صد پایتون
بهینهسازی تکهدفه در مقابل چندهدفه
در بهینهسازی تکهدفه، تعیین برتری یک راهحل نسبت به دیگر راهحلها با مقایسه مقادیر تابع هدف آنها بهراحتی انجام میشود. اما در بهینهسازی چندهدفه، نمیتوان بهطور مستقیم مقادیر یک تابع هدف را با تابع هدف دیگر مقایسه کرد. در این حالت، کیفیت یک راهحل با استفاده از مفهوم تسلط (dominance) تعیین میشود.
یک راهحل x1 بر راهحل x2 تسلط دارد اگر:
- x1 در همه اهداف حداقل به خوبی x2 باشد.
- x1 در حداقل یکی از اهداف بهطور خاص بهتر از x2 باشد.
بر اساس این تعریف، هر مجموعهای از راهحلها را میتوان به زیرمجموعههای مسلط و غیرمسلط تقسیم کرد. مجموعه غیرمسلط از کل فضای تصمیمگیری ممکن، به نام مجموعه پارتو-بهینه یا مجموعه پارتو-کارا شناخته میشود. پارتو کارایی وضعیتی است که در آن نمیتوان راهحل x را نسبت به یک تابع هدف Fi بهبود بخشید بدون آنکه برای تابع هدف دیگر Fj آن را بدتر کرد و بالعکس. در این مجموعه هیچ "بهترین راهحل" منفردی وجود ندارد، بنابراین کاربر میتواند با توجه به نیازهای تجاری خود، یک راهحل را انتخاب کند. معمولاً راهحلهای پارتو-بهینه را میتوان بهصورت یک خط یا سطح متصل کرد که به آن جبهه پارتو-بهینه میگویند.
هدف از بهینهسازی چندهدفه، یافتن مجموعهای از راهحلها است که تا حد ممکن به جبهه پارتو نزدیک باشند.
درک بهینهسازی چندهدفه
بهینهسازی چندهدفه یکی از حوزههای مهم در مدلسازی ریاضی و هوش محاسباتی است که بر مسائلی تمرکز دارد که شامل بیش از یک تابع هدف برای بهینهسازی همزمان هستند. این اهداف معمولاً با یکدیگر در تضاد هستند، به این معنا که بهبود یکی ممکن است باعث بدتر شدن دیگری شود. هدف در MOO یافتن یک راهحل بهینه منفرد نیست، بلکه شناسایی مجموعهای از راهحلهای بهینه با در نظر گرفتن توازن بین اهداف رقابتی است.
مفاهیم اصلی:
- اهداف: اهداف مختلفی که فرآیند بهینهسازی به دنبال دستیابی به آنهاست. در MOO همیشه دو یا چند هدف وجود دارد.
- بهینگی پارتو: یک راهحل بهینه پارتو است اگر هیچ هدفی نتواند بدون بدتر شدن حداقل یکی از دیگر اهداف بهبود یابد. مجموعه این راهحلها، جبهه پارتو را تشکیل میدهد.
- توازنها: لزوم مصالحه بین اهداف، زیرا بهبود یکی معمولاً به بهای دیگری تمام میشود.
دانلود کنید: ۴ جزوه عالی pdf آموزش پایتون
مدلسازی ریاضی در بهینهسازی چندهدفه
یک مسئله بهینهسازی چندهدفه میتواند به صورت زیر بهطور ریاضی فرمولبندی شود:
آمادهسازی محیط
مطمئن شوید که DEAP در محیط پایتون شما نصب شده است:
pip install deap
ساخت راهحل
بیایید نگاهی به کد بیندازیم و هر مرحله را به طور کامل بررسی کنیم تا ببینیم چگونه میتوانیم با DEAP به MOO بپردازیم.
مرحله ۱: تعریف مسئله
ابتدا باید مسئله خود را از نظر چارچوب DEAP تعریف کنیم و نوع اهداف و ساختار افراد (راهحلها) را مشخص کنیم.
from deap import base, creator, tools, algorithms
import random
# تعریف مسئله
creator.create("FitnessMin", base.Fitness, weights=(-1.0, -1.0)) # کمینهسازی هر دو هدف
creator.create("Individual", list, fitness=creator.FitnessMin) # تعریف ساختار افراد
تمرین های برنامه نویسی پایتون+ مثال برنامه نویسی پایتون
مرحله ۲: مقداردهی اولیه به جعبهابزار
جعبهابزار در DEAP جایی است که ما روشهایی برای عملیات ژنتیکی مانند جهش، ترکیب و انتخاب، و همچنین تنظیمات خاص مسئله خود را ثبت میکنیم.
toolbox = base.Toolbox()
toolbox.register("attr_float", random.uniform, -10, 10) # محدوده متغیر تصمیم
toolbox.register("individual", tools.initRepeat, creator.Individual,
toolbox.attr_float, n=1) # ایجاد فرد
toolbox.register("population", tools.initRepeat, list, toolbox.individual) # ایجاد جمعیت
مرحله ۳: تعریف تابع ارزیابی
تابع ارزیابی ما اهداف را برای یک راهحل خاص محاسبه میکند. این تابع مهم است زیرا فرآیند تکاملی را هدایت میکند.
def evaluate(individual):
x = individual[0]
return x**2, (x-2)**2 # دو هدف
toolbox.register("evaluate", evaluate)
مرحله ۴: تعریف اپراتورهای ژنتیکی
ما اپراتورهای ژنتیکی را برای آمیزش (ترکیب)، جهش و انتخاب تعریف میکنیم. این اپراتورها امکان تکامل راهحلها به سمت جبهه پارتو را فراهم میکنند.
toolbox.register("mate", tools.cxBlend, alpha=0.5)
toolbox.register("mutate", tools.mutGaussian, mu=0, sigma=1, indpb=0.2)
toolbox.register("select", tools.selNSGA2) # الگوریتم انتخاب NSGA-II
بلد باشید: Functools در پایتون و تابع def در پایتون (آموزش به زبان ساده)
مرحله ۵: الگوریتم تکاملی
در نهایت، ما حلقه اصلی تکاملی را پیادهسازی میکنیم که جمعیت خود را به سمت جبهه پارتو طی نسلها تکامل میدهد.
def main():
random.seed(1)
population = toolbox.population(n=100) # جمعیت اولیه
NGEN = 50 # تعداد نسلها
# حلقه تکاملی
for gen in range(NGEN):
offspring = algorithms.varAnd(population, toolbox, cxpb=0.5, mutpb=0.2)
fits = toolbox.map(toolbox.evaluate, offspring)
for fit, ind in zip(fits, offspring):
ind.fitness.values = fit
population = toolbox.select(offspring, k=len(population))
return population
if __name__ == "__main__":
pop = main()
front = tools.emo.sortNondominated(pop, len(pop), first_front_only=True)[0]
# نمایش جبهه پارتو
print("جبهه پارتو:")
for ind in front:
print(ind.fitness.values)
دیدگاهها و نتیجهگیری
این مثال در پایتون قدرت DEAP را در حل مسائل بهینهسازی چندهدفه با استفاده از الگوریتمهای تکاملی نشان میدهد. با توسعه یک جمعیت از راهحلها طی نسلها، میتوانیم جبهه پارتو را تقریبی کنیم و به تصمیمگیرندگان طیفی از توازنهای بهینه بین اهداف رقابتی ارائه دهیم.
بهینهسازی چندهدفه یک حوزه وسیع و فعال است که کاربردهایی از طراحی مهندسی گرفته تا مدیریت پورتفولیوهای مالی را در بر میگیرد. اصول و تکنیکهای مطرح شده در اینجا پایهای برای ورود به این حوزه هستند، اما کاوش در MOO بسیار گسترده و پربار است و با چالشهای واقعی بسیاری قابل اعمال است.