O código que desenvolvi resolve o problema da seguinte maneira:
- Começando pelo último período, para cada período \(k\), calcular o
custo total de se produzir a demanda total de todos os períodos \(k\)
até \(N\).
- Em seguida, calcular o custo de se produzir as demandas de \(k\)
até \(N-1\) somado ao custo de se utilizar a solução ótima de
produção para \(N-1\) até \(N\).
- Fazer isso sucessivamente até o momento em que se produz apenas
\(D[k]\) e utiliza-se a solução ótima de produção para \(k+1\) até
\(N\)
Obtida uma lista com esses valores, o algoritmo pega o menor deles e guarda numa tabela, sendo esse o custo da solução ótima para o período \(k\)
Segue abaixo o código utilizado:
Parâmetros do problema:
N = 5
Dk = [220, 280, 360, 140, 270]
x = Dk
Funções para calcular o custo de produção e o custo de estoque:
def custo_est(k, p):
custo = 0
i = 1
while k < p:
custo += (i)*Dk[k]
i += 1
k += 1
return (custo)
def custo_uni(x):
if x > 0:
return 250 + 2*x
else:
return 0
Função que soluciona o problema de programação dinâmica:
def lot(k):
lista = []
s = [0]
policy = []
resultado = 0
i = N + 1
while i > 0:
if i > N:
resultado = 0
lista.append(resultado)
i -= 1
else:
f_x = []
Q_x = []
counter = 0
for x in range(i, N + 1):
resultado = custo_uni(sum(Dk[i - 1:N - counter])) + custo_est(x - counter, N - counter) + lista[counter]
f_x.append(resultado)
Q_x.append(sum(Dk[i - 1:N - counter]))
counter += 1
custo_x = min(f_x)
lista.append(custo_x)
ind_x = f_x.index(custo_x)
s.insert(0, Q_x[ind_x] - Dk[i - 1])
policy.insert(0, Q_x[ind_x])
i -= 1
iter = 0
for p in policy:
policy[iter] -= s[iter - 1]
iter += 1
return [lista[-k], policy]
Utilizando o código apresentado, podemos então responder o pedido, com:
lot(1)
Cuja saída é:
[3680, [220, 280, 500, 0, 270]]
De modo que o menor custo possível para a solução do problema é de $3680 e as decisões de produção são:
\(x_1=220\)
\(x_2=280\)
\(x_3=500\)
\(x_4=0\)
\(x_5=270\)