Kaynak tahsisi
Harika iş, şimdi tanıtılan bir sonraki problemi çözme zamanı.
Bir yönetici 120 görevi bir kıdemli (S), bir orta düzey (J) ve bir stajyer (I) yazılım mühendisine dağıtıyor ve maliyetleri en aza indirmek istiyor.
Stajyer, görevlere başlamadan önce 500 $ tutarında eğitim gerektiriyor. Her bir görevi çözme maliyeti sırasıyla c = [30, 40, 5].
\(x\) atanan görev sayısını, \(o\) ise stajyerin eğitim alıp almadığını gösteren ikili değişkeni tutar. Toplam maliyet
\(TC = 30x_S+40x_J+(5x_I+500)o\)
Bu problemi yeni değişken \(z\) kullanarak BigM yöntemiyle doğrusal hale getir:
\(z = (5x_I+500)o\)
\(-oM\leq z \leq oM\)
\(-(1-o)M \leq z- (5x_I+500)o \leq (1-o)M\)
pulp, bir model, parametreler c, M ve names, ayrıca değişkenler x, z, o senin için zaten içe aktarıldı.
Bu egzersiz
Python ile Optimizasyona Giriş
kursunun bir parçasıdırEgzersiz talimatları
- Amaç fonksiyonunu, formülün bir kısmını
zile değiştirerek tanımla. - Kısıtları, stajyerin indeksini doldurarak tanımla.
Uygulamalı interaktif egzersiz
Bu örnek kodu tamamlayarak bu egzersizi bitirin.
# Define the objective
model += c[0]*x[0] + c[1]*x[1] + ____
# Define the constraints
model += -o * M <= z
model += z <= o * M
model += -(1-o) * M <= z - (c[___]*x[____] + 500)
model += z - (c[____]*x[____] + 500) <= (1-o) * M
model += lpSum(x) >= 120
status = model.solve()
print(f"{'Optimal found' if status == 1 else 'Ignore solution'}")
for i in range(len(c)):
print(f"{names[i]} was assigned {x[i].varValue:.0f}")