صفر تا صد مدل سازی گروبی gurobi در پایتون python (بخش دوم)

 

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

 

جهت خرید فایل تصویری کل مراحل (با کیفیت بالا) به انتهای پست مراجعه نمایید.

مدل زنجیره تامین زیر را در نظر بگیرید.

گام هفتم – بررسی پارامترها و متغیرها

در این مرحله اسامی پارامترها و متغیرهای مساله را جهت خوانایی بهتر عبارات در کدنویسی، به صورت زیر تغییر می دهیم.

# m ---> numFacility
# n ---> numCustomer

# ۱,...,m ---> setFacility
# ۱,...,n ---> setCustomer

# f ---> fixedCost
# a ---> unitCapCost
# d ---> demand
# c ---> unitTransportCost
# K ---> maxAllowCapacity

# y ---> _locate
# z ---> _allowCapacity
# x ---> _transport

گام هشتم – داده های ورودی مساله

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

# data
fixedCost = [120,150,135]
unitCapCost = [40,50,65]
unitTransportCost = [[10,20,15,16,17],[5,17,18,15,15],[13,15,18,15,16]]
demand = [220,150,175,190,240]
maxAllowCapacity = [540,510,600]

گام نهم – تعریف اسکالرها و مجموعه ها

در این مرحله کافی است به کمک داده های ورودی مرحله قبل و دستورهای len و range مقادیر ثابت (اسکالرها) و مجموعه ها را تعریف کنیم.

# constants
numFacility = len(fixedCost)
numCustomer = len(demand)
# sets
setFacility = range(numFacility)
setCustomer = range(numCustomer)

گام دهم – وارد کردن کلاس های گروبی و ساختن مثال

from gurobipy import GRB,Model
# instantiate the model
SCP = Model("Supply Chain Problem")

گام یازدهم – تعریف متغیرهای تصمیم

متغیرهای تصمیم به کمک متد addVar یا addVars از شی SCP ساخته می شوند.

# variables
_locate = SCP.addVars(numFacility, vtype=GRB.BINARY, name="y")
_allowCapacity = SCP.addVars(numFacility, name="z")
_transport = SCP.addVars(numFacility, setCustomer, name="x")

گام دوازدهم – تعریف محدودیت های مساله

محدودیت ها به کمک متد addConstr یا addConstrs از شی SCP ساخته می شوند.

# first constraint
for i in setFacility:
  SCP.addConstr(_allowCapacity[i] <= maxAllowCapacity[i] * _locate[i])
# second constraint
for i in setFacility:
  SCP.addConstr(sum(_transport[i,j] for j in setCustomer) <= _allowCapacity[i])
# third constraint
for j in setCustomer:
  SCP.addConstr(sum(_transport[i,j] for i in setFacility) >= demand[i])

گام سیزدهم – تعریف تابع هدف مساله

تابع هدف به کمک متد setObjective از شی SCP ساخته می شود. کمینه سازی یا بیشینه سازی مدل به کمک متد MINIMIZE یا MAXIMIZE کلاس GRB تعریف می شود.

# objective
SCP.setObjective(sum(fixedCost[i]*_locate[i] for i in setFacility) + 
                         sum(unitCapCost[i]*_allowCapacity[i] for i in setFacility) + 
                         sum(unitTransportCost[i][j]*_transport[i,j] for i in setFacility for j in setCustomer) ,
                         GRB.MINIMIZE)

گام چهاردهم – دستور حل مدل و گرفتن خروجی

دستور حل مدل به کمک متد optimize از شی SCP صورت می گیرد.

# solve!
SCP.optimize()

 

جهت حمایت از توسعه سایت،‌ فایل تصویری کل مراحل در این پست و پست بعدی (به مدت حدود ۵۰ دقیقه در فرمت اچ دی mp4) به همراه کد پایتون را خریداری نمایید.

2
دیدگاه بگذارید

1 Comment threads
1 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
2 Comment authors
soroush.safavi1991@gmail.com

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