dersblog



Lineer Programlar, Örnekler

Bir lineer program (LP),

$$ \min_x c^Tx \quad \textrm{öyle ki} $$ $$ Dx \le d $$ $$ Ax = b $$

formundaki problemlerdir. Atama problemleri, nakliyat (transportation) problemleri hep LP olarak çözülebilir.

Örnekler

Bir atama problemi gorelim. Ufak [1, sf. 29] örneğinden hareket edelim, elimizde üç tane işçi A, B, C var, ve üç tane iş 1,2,3 var. Her işçinin her işi ne kadar sürede yaptığı alttaki tabloda. Satırlar işçi, kolonlar iş,

C = [[17,10,12],[9,8,10], [14,4,7]]
C = np.array(C)
print (C)
[[17 10 12]
 [ 9  8 10]
 [14  4  7]]

Problemin yapısı alttaki ağ ile gösterilebilir,

Karar değişkenleri $x_{A1}$, $x_{A2}$, .. şeklinde olacak. o zaman bedel

$$ 17 x_{A1} + 10 x_{A2} + 12 x_{A3} + 9 x_{B1} + 8 x_{B2} + 10 x_{B3} + 14 x_{C1} + 4 x_{C2} + 7 x_{C3} $$

Önemli bir nokta her işin sadece bir kişiye verilmesi. Bunu mesela A için

$$ x_{A1} + x_{A2} + x_{A3} = 1 $$

kısıtlaması ile hallederiz, B,C için benzer durum.

Her isin tek kisiye verilmesi icin, mesela 1 icin

$$ x_{A1} + x_{B1} + x_{C1} = 1 $$

kısıtlaması, 2,3 için benzer şekilde halledilir. Tüm bu kısıtlamaları matris formunda vermek için, alttaki gibi bir matris yaratılabilir,

Notasyon $x_{11}$ diyor bizim örnek için $x_{A1}$ diye düşünülebilir. Bu matrisi LP çözümüne $Ax = b$ kısıtlaması olarak verebiliriz, $Ax$ çarpımını takip edersek bu çarpımın belli $x$'ler üzerinde toplama yaptığını görüyoruz, mesela ilk satır sol üst blok $x_{A1} + x_{B1} + x_{C1} $ toplamını yapıyor ve ona tekabül eden kısma $b$ içinde 1 verirsek, LP mekanizması bu kısıtlamaya göre gerisini halleder.

Kodda yapalım,

n = 3
X = np.zeros((2*n,n**2))
X[0,0:n] = np.ones((1,n))
X[1,n:n+n] = np.ones((1,n))
X[2,2*n:2*n+n] = np.ones((1,n))
X[3:6,0:3] = np.eye(n,n)
X[3:6,3:6] = np.eye(n,n)
X[3:6,6:9] = np.eye(n,n)
print (X)
[[1. 1. 1. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 1. 1. 1. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 1. 1. 1.]
 [1. 0. 0. 1. 0. 0. 1. 0. 0.]
 [0. 1. 0. 0. 1. 0. 0. 1. 0.]
 [0. 0. 1. 0. 0. 1. 0. 0. 1.]]
print (C.flatten())
[17 10 12  9  8 10 14  4  7]

Şimdi LP çağrısı,

b = [1, 1, 1, 1, 1, 1]

from scipy.optimize import linprog
res = linprog(C.flatten(), A_eq=X, b_eq=b)
res = np.round(res.x)
print (res)
[0. 0. 1. 1. 0. 0. 0. 1. 0.]

Yani $x_{A3}$, $x_{B1}$, $x_{C2}$ ataması yapıldı. Doğrulamasını yapalım,

row_ind, col_ind = linear_sum_assignment(C)
print (col_ind)
print (row_ind)
print (C[row_ind, col_ind].sum())
[2 0 1]
[0 1 2]
25

Aynı sonucu aldık.

Kaynaklar

[1] Hebborn, Decision Mathematics, https://www.pearsonschoolsandfecolleges.co.uk/Secondary/Mathematics/16plus/HeinemannModularMathematicsForEdexcelASAndALevel/Samples/Samplematerial/Chapter2.pdf

[2] Burkard, Assignment Problems


Yukarı