<jupyter_start><jupyter_text>Industrial Distributors, Inc. Como director de compras de Industrial Distributors, <NAME> debía planear las cantidades de compra para los productos de más alto valor que Industrial Distributors compraba y revendía a sus clientes industriales bajo un ciclo de pedido corto. Uno de estos productos era un motor de remplazo utilizado en transportadores. Las ventas de reemplazo se recibían de clientes localizados en América del Norte y eran aproximadamente constantes durante el año. Los motores se fabricaban en Alemania occidental y se importaban a través del puerto de Baltimore. Se transportaban por camión a un almacén privado en Chicago. Aunque el fabricante en Alemania tenía una política de precios que incluían transportación a Baltimore, Industrial incurría en los gastos de transporte desde Baltimore hasta Chicago. Para ayudarle a determinar las cantidades de adquisición, Walter reunió la siguiente información:  | Descripción de la información                         | Cantidades/Costos         | Fuente de información ||-------------------------------------------------------|---------------------------|-----------------------|| Ventas anuales promedio                               | 1,500 unidades            | Ventas                || Tiempo de entrega de reabastecimiento                 | 1 mes (0.083 año)         | Compras               || Costo administrativo por requisición                  | \\$20.00                  | Contabilidad          || Costo auxiliar por requisición                        | \\$5.00                   | Tráfico               || Costo de manejo de inventario                         | 30% por año               | Finanzas              || Peso empacado por unidad                              | 250 lb                    | Tráfico               || Costo de descarga en el almacén                       | \\$0.25 por cwt           | Contabilidad          || Capacidad de almacenamianto en el almacéna | 300 unidades              | Gerente de almacén    || Tarifas de almacenaje en almacén público              | \\$200 por unidad por año | Almacén público       |aSólo existe suficiente espacio en el almacén de la compañía para almacenar 300 unidades. Si se recibe un tamaño de un pedido de reabastecimiento mayor a 300 unidades, el excedente deberá almacenarse en un almacén público. El fabricante acaba de anunciar su nuevo programa de precios para los motores puestos en el puerto de Baltimore.| Unidades por pedido | Precio unitario  ||---------------------|:----------------:|| Primeros 100        | \\$700           || Siguientes 100      | \\$680           || Por encima de 200   | \\$670           | Al verificar con su compañía de transporte por camión, para desplazar los motores desde Baltimore, Walter observó que era práctico contratar envíos de carga de camión completo a \\$12/cwt. (cwt = 100 lbs) para cantidades de carga completa (TL) de 40,000 lbs o más, o para cantidades menores a carga completa (LTL) a \\$18/cwt.  &nbsp; 1. ¿Qué tamaño de pedido de reabastecimiento, aproximado a las siguientes 50 unidades, deberá Walter solicitar, dada la política de precios no incluyente del fabricante? &nbsp; 2. ¿Debería Walter cambiar su tamaño de pedido de reabastecimiento si la política de precios del fabricante fuera una donde el precio en cada intervalo de precio según cantidad incluyera a todas las unidades adquiridas? --- **Respuesta 1** Para poder determinar el tamaño de pedido es necesario contemplar la totalidad de los costos:- Compra (CC)- Ordenar (CO)- Transporte (CT)- Descarga (CD)- Mantenimiento de inventario  (CI)- Almacén público (CA)$Costo\ Total = (CC + CO + CT + CD + CI + CA)\cdot N$  $CC=C\cdot Q$  $CO=S$  $CI=CAMI$ ---$A = 1500$ unidades  $H = C\cdot i$  $CAMI = \frac{Q}{2}\cdot H$$S = 20 + 5 = 25$ pesos  $N = \frac{A}{Q}$$Q = ?; Q \in \mathbb{N}; Q \equiv 0 \mod{50}$$i = 30\%$$C =?$Donde:  $A$ es uso anual  $H$ es el costo de mantener el inventario por unidad al año  $CAMI$ es el costo anual de mantenimiento de inventario  $S$ es el costo por ordenar  $N$ es la cantidad de órdenes de reposición al año  $Q$ es el tamaño del lote  $i$ es costo de manejo de inventario  $C$ es el costo unitario<jupyter_code>%matplotlib inline
import matplotlib.pyplot as plt
from tabulate import tabulate

def precio1(lote):
    if lote <= 100:
        return lote * 700
    elif 100 < lote <= 200:
        return precio1(100) + (lote - 100) * 680
    else:
        return precio1(200) + (lote - 200) * 670


def precio2(lote):
    if lote <= 100:
        return lote * 700
    elif 100 < lote <= 200:
        return lote * 680
    else:
        return lote * 670


def peso(lote):
    return lote * 250


def transporte(peso):
    if peso >= 40_000:
        return peso / 100 * 12
    else:
        return peso / 100 * 18


def descarga(peso):
    return peso / 100 * 0.25


def almacen(lote):
    if lote > 300:
        return (lote - 300) * 200 / 2
    else:
        return 0


A = 1500
S = 25
i = 0.3
resultados1 = []
for q in range(50, 500, 50):
    escenario = []
    escenario.append(q)  # Q
    escenario.append(A / q)  # N
    escenario.append(precio1(q) / q)  # C
    escenario.append(precio1(q) * escenario[1])  # CC
    escenario.append(escenario[1] * S)  # CO
    escenario.append(escenario[1] * transporte(peso(q)))  # CT
    escenario.append(escenario[1] * descarga(peso(q)))  # CD
    escenario.append(q / 2 * escenario[2] * i)  # CI
    escenario.append(escenario[1] * almacen(q))  # CA
    escenario.append(sum(escenario[3:])) #TOTAL
    resultados1.append(escenario)

headers = ["Q", "N", "C", "CC", "CO", "CT", "CD", "CI", "CA", "TOTAL"]
print(tabulate(resultados1, headers, tablefmt="github", floatfmt=",.2f"))
plot1x = []
plot1y = []
for q in range(50, 500, 1):
    escenario = []
    escenario.append(q)  # Q
    escenario.append(A / q)  # N
    escenario.append(precio1(q) / q)  # C
    escenario.append(precio1(q) * escenario[1])  # CC
    escenario.append(escenario[1] * S)  # CO
    escenario.append(escenario[1] * transporte(peso(q)))  # CT
    escenario.append(escenario[1] * descarga(peso(q)))  # CD
    escenario.append(q / 2 * escenario[2] * i)  # CI
    escenario.append(escenario[1] * almacen(q))  # CA
    escenario.append(sum(escenario[3:])) #TOTAL
    plot1x.append(q)
    plot1y.append(escenario[-1])
    
plt.rcParams['figure.figsize'] = [20,15]
plt.plot(plot1x,plot1y)
plt.ylabel('Costo Total')
plt.xlabel('Tamaño de la orden')
plt.show()

idx1 = plot1y.index(min(plot1y))
print('Mínimo:\nQ: {} \tTotal: {:,.2f}'.format(plot1x[idx1],plot1y[idx1]))<jupyter_output><empty_output><jupyter_text>--- **Respuesta 2** Se puede usar como base el mismo modelo que se usó previamente, solo es necesario cambiar la manera en que se calcula el costo de los motores.<jupyter_code>resultados2 = []
for q in range(50, 500, 50):
    escenario = []
    escenario.append(q)  # Q
    escenario.append(A / q)  # N
    escenario.append(precio2(q) / q)  # C
    escenario.append(precio2(q) * escenario[1])  # CC
    escenario.append(escenario[1] * S)  # CO
    escenario.append(escenario[1] * transporte(peso(q)))  # CT
    escenario.append(escenario[1] * descarga(peso(q)))  # CD
    escenario.append(q / 2 * escenario[2] * i)  # CI
    escenario.append(escenario[1] * almacen(q))  # CA
    escenario.append(sum(escenario[3:])) #TOTAL
    resultados2.append(escenario)

print(tabulate(resultados2, headers, tablefmt="github", floatfmt=",.2f"))
plot2x = []
plot2y = []
for q in range(50, 500, 1):
    escenario = []
    escenario.append(q)  # Q
    escenario.append(A / q)  # N
    escenario.append(precio2(q) / q)  # C
    escenario.append(precio2(q) * escenario[1])  # CC
    escenario.append(escenario[1] * S)  # CO
    escenario.append(escenario[1] * transporte(peso(q)))  # CT
    escenario.append(escenario[1] * descarga(peso(q)))  # CD
    escenario.append(q / 2 * escenario[2] * i)  # CI
    escenario.append(escenario[1] * almacen(q))  # CA
    escenario.append(sum(escenario[3:])) #TOTAL
    plot2x.append(q)
    plot2y.append(escenario[-1])

plt.rcParams['figure.figsize'] = [20,15]
plt.plot(plot2x,plot2y)
plt.ylabel('Costo Total')
plt.xlabel('Tamaño de la orden')
plt.show()

idx2 = plot2y.index(min(plot2y))
print('Mínimo:\nQ: {} \tTotal: {:,.2f}'.format(plot2x[idx2],plot2y[idx2]))<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.12974266906044285, 'fraction_numerical': 0.03518850987432675, 'mean_word_length': 2.7588843904633378, 'pattern_counts': {'":': 0, '<': 16, '<?xml version=': 0, '>': 12, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 3, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '2', 'dir': 'jupyter-structured-clean-dedup', 'id': '376466', 'license': 'MIT', 'n_tokens_mistral': 3064, 'n_tokens_neox': 2857, 'n_words': 868, 'path': 'industrial.ipynb', 'repo_name': 'mxbsrt/notebooks', 'size': '8362'}