walopy 0.2.5__tar.gz → 0.2.7__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {walopy-0.2.5/src/walopy.egg-info → walopy-0.2.7}/PKG-INFO +317 -20
- {walopy-0.2.5 → walopy-0.2.7}/README.md +316 -19
- {walopy-0.2.5 → walopy-0.2.7}/pyproject.toml +1 -1
- {walopy-0.2.5 → walopy-0.2.7}/src/walopy/__init__.py +53 -0
- {walopy-0.2.5 → walopy-0.2.7}/src/walopy/inventory.py +722 -0
- walopy-0.2.7/src/walopy/reliability.py +298 -0
- walopy-0.2.7/src/walopy/scheduling.py +315 -0
- {walopy-0.2.5 → walopy-0.2.7/src/walopy.egg-info}/PKG-INFO +317 -20
- {walopy-0.2.5 → walopy-0.2.7}/src/walopy.egg-info/SOURCES.txt +6 -1
- walopy-0.2.7/tests/test_exchange_curve.py +147 -0
- walopy-0.2.7/tests/test_safety_stock_curve.py +172 -0
- walopy-0.2.7/tests/test_v026.py +276 -0
- {walopy-0.2.5 → walopy-0.2.7}/LICENSE +0 -0
- {walopy-0.2.5 → walopy-0.2.7}/setup.cfg +0 -0
- {walopy-0.2.5 → walopy-0.2.7}/src/walopy/__main__.py +0 -0
- {walopy-0.2.5 → walopy-0.2.7}/src/walopy/_utils.py +0 -0
- {walopy-0.2.5 → walopy-0.2.7}/src/walopy/advanced.py +0 -0
- {walopy-0.2.5 → walopy-0.2.7}/src/walopy/bottleneck.py +0 -0
- {walopy-0.2.5 → walopy-0.2.7}/src/walopy/fitting.py +0 -0
- {walopy-0.2.5 → walopy-0.2.7}/src/walopy/kpi.py +0 -0
- {walopy-0.2.5 → walopy-0.2.7}/src/walopy/network.py +0 -0
- {walopy-0.2.5 → walopy-0.2.7}/src/walopy/operations.py +0 -0
- {walopy-0.2.5 → walopy-0.2.7}/src/walopy/plotting.py +0 -0
- {walopy-0.2.5 → walopy-0.2.7}/src/walopy/queuing.py +0 -0
- {walopy-0.2.5 → walopy-0.2.7}/src/walopy/solver.py +0 -0
- {walopy-0.2.5 → walopy-0.2.7}/src/walopy.egg-info/dependency_links.txt +0 -0
- {walopy-0.2.5 → walopy-0.2.7}/src/walopy.egg-info/requires.txt +0 -0
- {walopy-0.2.5 → walopy-0.2.7}/src/walopy.egg-info/top_level.txt +0 -0
- {walopy-0.2.5 → walopy-0.2.7}/tests/test_advanced.py +0 -0
- {walopy-0.2.5 → walopy-0.2.7}/tests/test_bottleneck.py +0 -0
- {walopy-0.2.5 → walopy-0.2.7}/tests/test_fitting.py +0 -0
- {walopy-0.2.5 → walopy-0.2.7}/tests/test_inventory.py +0 -0
- {walopy-0.2.5 → walopy-0.2.7}/tests/test_inventory_new.py +0 -0
- {walopy-0.2.5 → walopy-0.2.7}/tests/test_kpi.py +0 -0
- {walopy-0.2.5 → walopy-0.2.7}/tests/test_mg1.py +0 -0
- {walopy-0.2.5 → walopy-0.2.7}/tests/test_network.py +0 -0
- {walopy-0.2.5 → walopy-0.2.7}/tests/test_new_models.py +0 -0
- {walopy-0.2.5 → walopy-0.2.7}/tests/test_operations.py +0 -0
- {walopy-0.2.5 → walopy-0.2.7}/tests/test_queuing.py +0 -0
- {walopy-0.2.5 → walopy-0.2.7}/tests/test_solver.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: walopy
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.7
|
|
4
4
|
Summary: Queuing theory, operations analysis, OEE, bottleneck analysis and KPI trees for Python
|
|
5
5
|
Author-email: LeoSanta15 <angelsanta1@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -63,15 +63,18 @@ pip install walopy
|
|
|
63
63
|
9. [Análisis de cuellos de botella](#9-análisis-de-cuellos-de-botella)
|
|
64
64
|
10. [Balance de línea y tiempo takt](#10-balance-de-línea-y-tiempo-takt)
|
|
65
65
|
11. [Análisis de punto de equilibrio](#11-análisis-de-punto-de-equilibrio)
|
|
66
|
-
12. [
|
|
67
|
-
13. [
|
|
68
|
-
14. [
|
|
69
|
-
15. [
|
|
70
|
-
16. [
|
|
71
|
-
17. [
|
|
72
|
-
18. [
|
|
73
|
-
19. [
|
|
74
|
-
20. [
|
|
66
|
+
12. [Curvas de intercambio](#12-curvas-de-intercambio)
|
|
67
|
+
13. [Programación de producción (scheduling)](#13-programación-de-producción-scheduling)
|
|
68
|
+
14. [Confiabilidad](#14-confiabilidad--reliability)
|
|
69
|
+
15. [Árboles de KPI](#15-árboles-de-kpi)
|
|
70
|
+
16. [Solvers y optimización](#16-solvers-y-optimización)
|
|
71
|
+
17. [Análisis de sensibilidad](#17-análisis-de-sensibilidad)
|
|
72
|
+
18. [Escenarios en lote (batch_model)](#18-escenarios-en-lote-batch_model)
|
|
73
|
+
19. [Comparar múltiples resultados](#19-comparar-múltiples-resultados)
|
|
74
|
+
20. [Gráficas](#20-gráficas)
|
|
75
|
+
21. [CLI](#21-cli)
|
|
76
|
+
22. [Referencia de módulos](#22-referencia-de-módulos)
|
|
77
|
+
23. [Requisitos](#23-requisitos)
|
|
75
78
|
|
|
76
79
|
---
|
|
77
80
|
|
|
@@ -1055,7 +1058,7 @@ print(r.margin_of_safety_pct) # 0.375 — porcentaje del margen de seguridad
|
|
|
1055
1058
|
|
|
1056
1059
|
---
|
|
1057
1060
|
|
|
1058
|
-
##
|
|
1061
|
+
## 15. Árboles de KPI
|
|
1059
1062
|
|
|
1060
1063
|
Los árboles de KPI crean jerarquías interactivas visualizadas como **treemap** o **sunburst** con Plotly.
|
|
1061
1064
|
|
|
@@ -1108,7 +1111,7 @@ fig.show()
|
|
|
1108
1111
|
|
|
1109
1112
|
---
|
|
1110
1113
|
|
|
1111
|
-
##
|
|
1114
|
+
## 16. Solvers y optimización
|
|
1112
1115
|
|
|
1113
1116
|
### `solve_lam(metric, target, *, mu, model)` — Máxima tasa de llegada
|
|
1114
1117
|
|
|
@@ -1155,7 +1158,7 @@ r.plot() # gráfica de costo vs número de servidores
|
|
|
1155
1158
|
|
|
1156
1159
|
---
|
|
1157
1160
|
|
|
1158
|
-
##
|
|
1161
|
+
## 17. Análisis de sensibilidad
|
|
1159
1162
|
|
|
1160
1163
|
### `sensitivity(model_fn, param, values, **fixed_kwargs)` — Barrido paramétrico
|
|
1161
1164
|
|
|
@@ -1186,7 +1189,7 @@ fig.show()
|
|
|
1186
1189
|
|
|
1187
1190
|
---
|
|
1188
1191
|
|
|
1189
|
-
##
|
|
1192
|
+
## 18. Escenarios en lote (batch_model)
|
|
1190
1193
|
|
|
1191
1194
|
### `batch_model(model_fn, df, **fixed_kwargs)` — Aplicar modelo a un DataFrame
|
|
1192
1195
|
|
|
@@ -1221,7 +1224,7 @@ print(resultado[resultado["_error"].notna()]) # filas fallidas
|
|
|
1221
1224
|
|
|
1222
1225
|
---
|
|
1223
1226
|
|
|
1224
|
-
##
|
|
1227
|
+
## 19. Comparar múltiples resultados
|
|
1225
1228
|
|
|
1226
1229
|
### `compare(*results, labels)` — DataFrame comparativo
|
|
1227
1230
|
|
|
@@ -1246,7 +1249,7 @@ df2 = wl.compare(wl.mm1(1, 5), wl.mm1(2, 5), wl.mm1(3, 5))
|
|
|
1246
1249
|
|
|
1247
1250
|
---
|
|
1248
1251
|
|
|
1249
|
-
##
|
|
1252
|
+
## 20. Gráficas
|
|
1250
1253
|
|
|
1251
1254
|
Todos los resultados exponen `.plot()` que devuelve una figura de Matplotlib o Plotly. También se pueden llamar directamente desde `walopy.plotting`.
|
|
1252
1255
|
|
|
@@ -1282,7 +1285,7 @@ fig.show()
|
|
|
1282
1285
|
|
|
1283
1286
|
---
|
|
1284
1287
|
|
|
1285
|
-
##
|
|
1288
|
+
## 21. CLI
|
|
1286
1289
|
|
|
1287
1290
|
walopy incluye una interfaz de línea de comandos para uso rápido sin escribir código.
|
|
1288
1291
|
|
|
@@ -1324,14 +1327,308 @@ Wq : 0.3 (avg wait time in queue)
|
|
|
1324
1327
|
|
|
1325
1328
|
---
|
|
1326
1329
|
|
|
1327
|
-
##
|
|
1330
|
+
## 12. Curvas de intercambio
|
|
1331
|
+
|
|
1332
|
+
Herramientas para tomar decisiones de política agregada en familias de artículos.
|
|
1333
|
+
|
|
1334
|
+
### Tipo 1 — ciclo: `exchange_curve`
|
|
1335
|
+
|
|
1336
|
+
Traza la hipérbola entre número de pedidos por año (N) e inversión promedio en inventario de ciclo (I):
|
|
1337
|
+
|
|
1338
|
+
```
|
|
1339
|
+
N(k) = N* / k I(k) = k · I* → N · I = N* · I* (constante)
|
|
1340
|
+
```
|
|
1341
|
+
|
|
1342
|
+
Dado un target de N o de I, resuelve el multiplicador k óptimo y recalcula Q para cada artículo.
|
|
1343
|
+
|
|
1344
|
+
```python
|
|
1345
|
+
import walopy as wl
|
|
1346
|
+
|
|
1347
|
+
items = [
|
|
1348
|
+
{"name": "A", "demand": 1000, "ordering_cost": 50, "holding_cost": 2, "unit_value": 10},
|
|
1349
|
+
{"name": "B", "demand": 500, "ordering_cost": 30, "holding_cost": 1, "unit_value": 5},
|
|
1350
|
+
{"name": "C", "demand": 2000, "ordering_cost": 100, "holding_cost": 4, "unit_value": 8},
|
|
1351
|
+
]
|
|
1352
|
+
|
|
1353
|
+
# Sin target → punto EOQ (k = 1)
|
|
1354
|
+
r = wl.exchange_curve(items)
|
|
1355
|
+
print(r)
|
|
1356
|
+
```
|
|
1357
|
+
|
|
1358
|
+
```
|
|
1359
|
+
Target : eoq
|
|
1360
|
+
Multiplier k : 1.0000
|
|
1361
|
+
N orders/yr (EOQ) : 87.27
|
|
1362
|
+
N orders/yr (optimal) : 87.27
|
|
1363
|
+
Investment (EOQ) : 5430
|
|
1364
|
+
Investment (optimal) : 5430
|
|
1365
|
+
```
|
|
1366
|
+
|
|
1367
|
+
```python
|
|
1368
|
+
# Reducir a 20 pedidos/año (k > 1 → Q más grandes → más inversión)
|
|
1369
|
+
r = wl.exchange_curve(items, target_orders=20)
|
|
1370
|
+
|
|
1371
|
+
# Limitar inversión a 3 000 (k < 1 → Q más pequeños → más pedidos)
|
|
1372
|
+
r = wl.exchange_curve(items, target_investment=3000)
|
|
1373
|
+
|
|
1374
|
+
# Tabla por artículo
|
|
1375
|
+
df = r.to_frame()
|
|
1376
|
+
# columnas: name | Q_eoq | Q_optimal | n_orders | investment
|
|
1377
|
+
|
|
1378
|
+
# Hipérbola para graficar
|
|
1379
|
+
curve = r.curve_to_frame()
|
|
1380
|
+
# columnas: N | I
|
|
1381
|
+
```
|
|
1382
|
+
|
|
1383
|
+
**Parámetros de cada artículo**
|
|
1384
|
+
|
|
1385
|
+
| Clave | Requerido | Descripción |
|
|
1386
|
+
|-------|-----------|-------------|
|
|
1387
|
+
| `demand` | ✓ | Demanda anual Di |
|
|
1388
|
+
| `ordering_cost` | ✓ | Costo de pedido Ki |
|
|
1389
|
+
| `holding_cost` | ✓ | Costo de mantenimiento hi |
|
|
1390
|
+
| `unit_value` | — | Valor unitario vi (default 1) |
|
|
1391
|
+
| `name` | — | Etiqueta (default I1, I2, …) |
|
|
1392
|
+
|
|
1393
|
+
---
|
|
1394
|
+
|
|
1395
|
+
### Tipo 2 — seguridad: `safety_stock_curve`
|
|
1396
|
+
|
|
1397
|
+
Traza la curva entre inversión en stock de seguridad e nivel de servicio por ciclo usando una **política z común** para toda la familia:
|
|
1398
|
+
|
|
1399
|
+
```
|
|
1400
|
+
SS_i(z) = z · σᵢ_DLT · vᵢ σᵢ_DLT = √(Lᵢ·σ²_Di + D²ᵢ·σ²_Li)
|
|
1401
|
+
SS_total(z) = z · Σ σᵢ_DLT · vᵢ SL(z) = Φ(z)
|
|
1402
|
+
```
|
|
1403
|
+
|
|
1404
|
+
```python
|
|
1405
|
+
items = [
|
|
1406
|
+
{"name": "A", "demand_rate": 100, "demand_std": 10, "lead_time": 2, "unit_value": 10},
|
|
1407
|
+
{"name": "B", "demand_rate": 50, "demand_std": 5, "lead_time": 1, "unit_value": 5},
|
|
1408
|
+
{"name": "C", "demand_rate": 200, "demand_std": 20, "lead_time": 3, "unit_value": 8},
|
|
1409
|
+
]
|
|
1410
|
+
|
|
1411
|
+
# Target: nivel de servicio 95%
|
|
1412
|
+
r = wl.safety_stock_curve(items, target_service_level=0.95)
|
|
1413
|
+
print(r)
|
|
1414
|
+
```
|
|
1415
|
+
|
|
1416
|
+
```
|
|
1417
|
+
Target : service_level=95.0000%
|
|
1418
|
+
z : 1.6449
|
|
1419
|
+
Service level : 95.0000%
|
|
1420
|
+
SS investment : 1 847
|
|
1421
|
+
```
|
|
1422
|
+
|
|
1423
|
+
```python
|
|
1424
|
+
# Target: presupuesto máximo de SS
|
|
1425
|
+
r = wl.safety_stock_curve(items, target_ss_investment=1000)
|
|
1426
|
+
|
|
1427
|
+
# Tabla por artículo (incluye punto de reorden cuando se da demand_rate)
|
|
1428
|
+
df = r.to_frame()
|
|
1429
|
+
# columnas: name | sigma_dlt | safety_stock | investment | reorder_point
|
|
1430
|
+
|
|
1431
|
+
# Curva completa (z de −2 a 4)
|
|
1432
|
+
curve = r.curve_to_frame()
|
|
1433
|
+
# columnas: z | service_level | ss_investment
|
|
1434
|
+
```
|
|
1435
|
+
|
|
1436
|
+
**Parámetros de cada artículo**
|
|
1437
|
+
|
|
1438
|
+
| Clave | Requerido | Descripción |
|
|
1439
|
+
|-------|-----------|-------------|
|
|
1440
|
+
| `demand_std` | ✓ | Desviación estándar de la demanda |
|
|
1441
|
+
| `lead_time` | ✓ | Lead time medio |
|
|
1442
|
+
| `demand_rate` | — | Demanda media; activa columna `reorder_point` |
|
|
1443
|
+
| `lead_time_std` | — | Desviación estándar del lead time (default 0) |
|
|
1444
|
+
| `unit_value` | — | Valor unitario (default 1) |
|
|
1445
|
+
| `name` | — | Etiqueta (default I1, I2, …) |
|
|
1446
|
+
|
|
1447
|
+
---
|
|
1448
|
+
|
|
1449
|
+
### Relación entre ambas curvas
|
|
1450
|
+
|
|
1451
|
+
| | Tipo 1 (ciclo) | Tipo 2 (seguridad) |
|
|
1452
|
+
|---|---|---|
|
|
1453
|
+
| **Función** | `exchange_curve` | `safety_stock_curve` |
|
|
1454
|
+
| **Decide** | Tamaño de lote Q | Punto de reorden r |
|
|
1455
|
+
| **Tradeoff** | N pedidos/año ↔ Inversión ciclo | Nivel de servicio ↔ SS |
|
|
1456
|
+
| **Resultado** | `ExchangeCurveResult` | `SafetyStockCurveResult` |
|
|
1457
|
+
| **Parámetro** | Multiplicador k | Factor z |
|
|
1458
|
+
|
|
1459
|
+
Usadas juntas cubren la política completa `(Q, r)` para toda la familia.
|
|
1460
|
+
|
|
1461
|
+
---
|
|
1462
|
+
|
|
1463
|
+
## 13. Programación de producción (scheduling)
|
|
1464
|
+
|
|
1465
|
+
### Máquina única — `schedule_single`
|
|
1466
|
+
|
|
1467
|
+
Asigna *n* trabajos a una sola máquina según una regla de prioridad.
|
|
1468
|
+
|
|
1469
|
+
```python
|
|
1470
|
+
import walopy as wl
|
|
1471
|
+
|
|
1472
|
+
p = [3, 1, 4, 1, 5] # tiempos de proceso
|
|
1473
|
+
d = [8, 3, 10, 4, 12] # fechas de entrega
|
|
1474
|
+
w = [2, 5, 1, 4, 1] # pesos de importancia
|
|
1475
|
+
|
|
1476
|
+
r = wl.schedule_single(p, rule="SPT", due_dates=d, weights=w,
|
|
1477
|
+
names=["A","B","C","D","E"])
|
|
1478
|
+
print(r)
|
|
1479
|
+
```
|
|
1480
|
+
|
|
1481
|
+
```
|
|
1482
|
+
Rule : SPT
|
|
1483
|
+
Sequence : B → D → A → C → E
|
|
1484
|
+
Makespan (Cmax) : 14
|
|
1485
|
+
Total completion ΣCj : 37
|
|
1486
|
+
Weighted completion ΣwCj: 89
|
|
1487
|
+
Max lateness : 2
|
|
1488
|
+
Total tardiness ΣTj : 2
|
|
1489
|
+
Tardy jobs : 1
|
|
1490
|
+
```
|
|
1491
|
+
|
|
1492
|
+
**Reglas disponibles**
|
|
1493
|
+
|
|
1494
|
+
| `rule` | Criterio minimizado | Datos requeridos |
|
|
1495
|
+
|--------|---------------------|-----------------|
|
|
1496
|
+
| `'SPT'` | ΣCj (tiempo total de completación) | — |
|
|
1497
|
+
| `'EDD'` | Lmax (máxima tardanza) | `due_dates` |
|
|
1498
|
+
| `'WSPT'` | ΣwjCj (completación ponderada) | `weights` |
|
|
1499
|
+
| `'CR'` | Ratio crítico dj/pj | `due_dates` |
|
|
1500
|
+
| `'FIFO'` | Orden de llegada (línea base) | — |
|
|
1501
|
+
|
|
1502
|
+
**Atributos de `ScheduleResult`**
|
|
1503
|
+
|
|
1504
|
+
| Atributo | Descripción |
|
|
1505
|
+
|----------|-------------|
|
|
1506
|
+
| `rule` | Regla utilizada |
|
|
1507
|
+
| `sequence` | Lista de nombres en orden de procesamiento |
|
|
1508
|
+
| `jobs` | Lista de `JobSchedule` (por trabajo) |
|
|
1509
|
+
| `makespan` | Cmax = suma de tiempos de proceso |
|
|
1510
|
+
| `total_completion_time` | ΣCj |
|
|
1511
|
+
| `total_weighted_completion_time` | ΣwjCj |
|
|
1512
|
+
| `max_lateness` | max(Lj) |
|
|
1513
|
+
| `total_tardiness` | ΣTj |
|
|
1514
|
+
| `n_tardy` | Número de trabajos tarde |
|
|
1515
|
+
|
|
1516
|
+
```python
|
|
1517
|
+
df = r.to_frame() # columnas: Name, p, d, w, Start, C, L, T, Tardy
|
|
1518
|
+
```
|
|
1519
|
+
|
|
1520
|
+
---
|
|
1521
|
+
|
|
1522
|
+
### Flow-shop de 2 máquinas — `johnson_flowshop`
|
|
1523
|
+
|
|
1524
|
+
El algoritmo de Johnson encuentra la secuencia óptima que minimiza el makespan cuando todos los trabajos pasan primero por M1 y luego por M2.
|
|
1525
|
+
|
|
1526
|
+
```python
|
|
1527
|
+
m1 = [3, 8, 5, 7, 2] # tiempos en máquina 1
|
|
1528
|
+
m2 = [5, 2, 8, 4, 6] # tiempos en máquina 2
|
|
1529
|
+
|
|
1530
|
+
r = wl.johnson_flowshop(m1, m2)
|
|
1531
|
+
print(r)
|
|
1532
|
+
```
|
|
1533
|
+
|
|
1534
|
+
```
|
|
1535
|
+
Sequence : J1 → J5 → J4 → J3 → J2
|
|
1536
|
+
Makespan : 34
|
|
1537
|
+
```
|
|
1538
|
+
|
|
1539
|
+
```python
|
|
1540
|
+
df = r.to_frame()
|
|
1541
|
+
# columnas: Job | M1 start | M1 end | M2 start | M2 end
|
|
1542
|
+
```
|
|
1543
|
+
|
|
1544
|
+
---
|
|
1545
|
+
|
|
1546
|
+
## 14. Confiabilidad — `reliability`
|
|
1547
|
+
|
|
1548
|
+
Modelos de confiabilidad con distribución exponencial (tasa de falla constante).
|
|
1549
|
+
|
|
1550
|
+
### Componente individual — `mtbf_analysis`
|
|
1551
|
+
|
|
1552
|
+
```python
|
|
1553
|
+
r = wl.mtbf_analysis(failure_rate=0.01, mttr=5.0, t=100)
|
|
1554
|
+
print(r)
|
|
1555
|
+
```
|
|
1556
|
+
|
|
1557
|
+
```
|
|
1558
|
+
Topology : component
|
|
1559
|
+
Components : 1
|
|
1560
|
+
Failure rates λ : ['0.01']
|
|
1561
|
+
MTBF : 100
|
|
1562
|
+
R(t=100) : 0.367879
|
|
1563
|
+
Availability : 95.2381%
|
|
1564
|
+
```
|
|
1565
|
+
|
|
1566
|
+
### Sistema en serie — `series_system`
|
|
1567
|
+
|
|
1568
|
+
El sistema falla si **cualquier** componente falla. λ_sys = Σλi.
|
|
1569
|
+
|
|
1570
|
+
```python
|
|
1571
|
+
r = wl.series_system([0.01, 0.02, 0.03], t=10)
|
|
1572
|
+
print(r.mtbf) # 1/0.06 ≈ 16.67
|
|
1573
|
+
print(r.R_t) # e^{-0.06·10} ≈ 0.549
|
|
1574
|
+
```
|
|
1575
|
+
|
|
1576
|
+
### Sistema en paralelo — `parallel_system`
|
|
1577
|
+
|
|
1578
|
+
El sistema opera si **al menos uno** de los componentes opera.
|
|
1579
|
+
R_sys(t) = 1 − ∏(1 − e^{−λi·t}). MTBF calculado numéricamente.
|
|
1580
|
+
|
|
1581
|
+
```python
|
|
1582
|
+
r = wl.parallel_system([0.01, 0.02], t=50)
|
|
1583
|
+
print(r.R_t) # mayor que el sistema en serie
|
|
1584
|
+
print(r.mtbf) # mayor que cualquier componente individual
|
|
1585
|
+
```
|
|
1586
|
+
|
|
1587
|
+
### Sistema k-de-n — `koon_system`
|
|
1588
|
+
|
|
1589
|
+
Opera si al menos **k** de **n** componentes idénticos están en servicio.
|
|
1590
|
+
MTBF exacto = (1/λ) · Σ_{j=k}^{n} (1/j).
|
|
1591
|
+
|
|
1592
|
+
```python
|
|
1593
|
+
# 2-de-3: requiere al menos 2 de 3 componentes idénticos
|
|
1594
|
+
r = wl.koon_system(n=3, k=2, failure_rate=0.01, t=50)
|
|
1595
|
+
print(r.mtbf) # (1/0.01) * (1/2 + 1/3) ≈ 83.33
|
|
1596
|
+
print(r.R_t)
|
|
1597
|
+
```
|
|
1598
|
+
|
|
1599
|
+
**Casos especiales**
|
|
1600
|
+
- `k=1` → equivale a `parallel_system` con n componentes idénticos.
|
|
1601
|
+
- `k=n` → equivale a `series_system` con n componentes idénticos.
|
|
1602
|
+
|
|
1603
|
+
**Atributos de `ReliabilityResult`**
|
|
1604
|
+
|
|
1605
|
+
| Atributo | Descripción |
|
|
1606
|
+
|----------|-------------|
|
|
1607
|
+
| `topology` | `'component'`, `'series'`, `'parallel'`, `'k-of-n'` |
|
|
1608
|
+
| `n_components` | Número de componentes |
|
|
1609
|
+
| `failure_rates` | Lista de λi |
|
|
1610
|
+
| `mtbf` | MTBF del sistema |
|
|
1611
|
+
| `R_t` | Confiabilidad R(t) si se proporcionó `t` |
|
|
1612
|
+
| `availability` | Disponibilidad estacionaria A si se proporcionó `mttr` |
|
|
1613
|
+
| `mttr` | Tiempo medio de reparación (si se proporcionó) |
|
|
1614
|
+
|
|
1615
|
+
```python
|
|
1616
|
+
df = r.to_frame() # columnas: Topology, Components, MTBF[, R(t), Availability]
|
|
1617
|
+
r.R(t=200) # evalúa R(t) en cualquier tiempo posterior
|
|
1618
|
+
```
|
|
1619
|
+
|
|
1620
|
+
---
|
|
1621
|
+
|
|
1622
|
+
## 22. Referencia de módulos
|
|
1328
1623
|
|
|
1329
1624
|
| Módulo | Funciones y clases principales |
|
|
1330
1625
|
|---|---|
|
|
1331
1626
|
| `queuing` | `mm1`, `mmc`, `md1`, `kingman`, `mg1`, `littles_law`, `QueueResult`, `cv2_normal`, `cv2_triangular`, `cv2_uniform`, `cv2_erlang`, `cv2_gamma`, `cv2_lognormal`, `cv2_weibull` |
|
|
1332
1627
|
| `advanced` | `mm1k`, `mmck`, `erlang_b`, `mm1_priority`, `monte_carlo_gg1`, `takt_time`, `line_balance`, `break_even`, `break_even_multi`, `break_even_sales`, `queue_length_pmf`, `sojourn_cdf`, `PriorityQueueResult`, `SimulationResult`, `LineBalanceResult`, `BreakEvenResult`, `BreakEvenMultiResult` |
|
|
1333
1628
|
| `fitting` | `fit_from_data`, `FitResult` |
|
|
1334
|
-
| `inventory` | `eoq`, `ebq`, `eoq_multi`, `ebq_multi`, `eoq_multi_constrained`, `lot_for_lot`, `silver_meal`, `eoq_quantity_discount`, `reorder_point`, `newsvendor`, `EOQResult`, `EBQResult`, `MultiItemResult`, `ConstrainedMultiEOQResult`, `LotSizingResult`, `QuantityDiscountResult`, `ReorderResult`, `NewsvendorResult` |
|
|
1629
|
+
| `inventory` | `eoq`, `ebq`, `eoq_multi`, `ebq_multi`, `eoq_multi_constrained`, `lot_for_lot`, `silver_meal`, `eoq_quantity_discount`, `wagner_whitin`, `rq_policy`, `rs_policy`, `exchange_curve`, `safety_stock_curve`, `reorder_point`, `newsvendor`, `EOQResult`, `EBQResult`, `MultiItemResult`, `ConstrainedMultiEOQResult`, `LotSizingResult`, `QuantityDiscountResult`, `ReorderResult`, `NewsvendorResult`, `RQPolicyResult`, `RSPolicyResult`, `ExchangeCurveResult`, `SafetyStockCurveResult` |
|
|
1630
|
+
| `scheduling` | `schedule_single`, `johnson_flowshop`, `ScheduleResult`, `JobSchedule`, `FlowShopResult` |
|
|
1631
|
+
| `reliability` | `mtbf_analysis`, `series_system`, `parallel_system`, `koon_system`, `ReliabilityResult` |
|
|
1335
1632
|
| `network` | `jackson_network`, `JacksonResult`, `StationMetrics` |
|
|
1336
1633
|
| `operations` | `oee`, `utilization_efficiency`, `unit_cost`, `OEEResult`, `UtilizationResult`, `UnitCostResult` |
|
|
1337
1634
|
| `bottleneck` | `bottleneck_analysis`, `BottleneckResult`, `StationResult` |
|
|
@@ -1341,7 +1638,7 @@ Wq : 0.3 (avg wait time in queue)
|
|
|
1341
1638
|
|
|
1342
1639
|
---
|
|
1343
1640
|
|
|
1344
|
-
##
|
|
1641
|
+
## 23. Requisitos
|
|
1345
1642
|
|
|
1346
1643
|
```
|
|
1347
1644
|
Python ≥ 3.9
|