Too many DCs, too few, or in the wrong place? Quantify the gap in minutes.¿Demasiados CEDIS, muy pocos o en el lugar equivocado? Cuantifica la brecha en minutos.

Place demand zones on a map, open or close candidate DCs to evaluate your current network, then let the optimizer propose how many DCs you need and where — with cost, coverage and distance side by side.Coloca zonas de demanda en un mapa, abre o cierra CEDIS candidatos para evaluar tu red actual y deja que el optimizador proponga cuántos CEDIS necesitas y dónde — con costo, cobertura y distancia lado a lado.

Greedy p-medianp-median vorazMX · LATAM · US presetsPresets MX · LATAM · EE.UU.100% in-browser · no upload100% en navegador · sin subir datos
📍
This is a transparent facility-location heuristic, not black-box AI. It uses straight-line distance, a greedy p-median search, and nearest-DC assignment — the right way to frame the trade-off and the baseline that commercial network-optimization suites (Blue Yonder, Coupa/LLamasoft, RELEX) improve on with real road networks, capacity limits, tariffs, and mixed-integer solvers. Concept reference: SC Architecture. Esta es una heurística transparente de localización de instalaciones, no IA de caja negra. Usa distancia en línea recta, una búsqueda p-median voraz (greedy) y asignación al CEDIS más cercano — la forma correcta de plantear el balance entre costo y servicio, y la línea base que las suites comerciales de optimización de red (Blue Yonder, Coupa/LLamasoft, RELEX) mejoran con redes carreteras reales, límites de capacidad, aranceles y solvers de programación entera mixta. Referencia conceptual: Arquitectura SC.
Network mapMapa de red
Demand zoneZona de demanda
Open DCCEDIS abierto
Closed DCCEDIS cerrado
Zone assignmentAsignación de zonas
About this tool. Runs entirely in your browser. Distances are Euclidean (straight-line) on an abstract plane scaled to kilometers — not road distances. The optimizer is a greedy p-median heuristic (fast, transparent, near-optimal for small instances) rather than an exact MILP solver, and it does not enforce DC capacity. Use it to frame the cost-vs-service trade-off and pressure-test a network shape, not to produce a final siting decision. Sobre esta herramienta. Corre completamente en tu navegador. Las distancias son euclidianas (línea recta) en un plano abstracto escalado a kilómetros — no distancias viales. El optimizador es una heurística p-median voraz (greedy) — rápida, transparente y casi óptima para instancias pequeñas — y no un solver MILP exacto; además, no considera la capacidad de los CEDIS. Úsala para plantear el balance entre costo y servicio y poner a prueba la forma de una red, no para producir una decisión final de ubicación.
💡How to use this toolCómo usar esta herramientaStart hereEmpieza aquí
1
Choose your regionElige tu región
Pick Mexico, LATAM, or US. Cities are sized by demand volume. Click any empty map area to add your own zone.Selecciona México, LATAM o EE.UU. Las ciudades se dimensionan por volumen de demanda. Haz clic en cualquier área vacía para agregar tu propia zona.
2
Evaluate your current networkEvalúa tu red actual
In Evaluate mode, click each DC square to open or close it. Grey lines = within service range. Red lines = zone too far from any DC.En modo Evaluar, haz clic en cada cuadro de CEDIS para abrirlo o cerrarlo. Líneas grises = dentro del rango de servicio. Líneas rojas = zona demasiado lejos de cualquier CEDIS.
3
Optimize & compareOptimiza y compara
Switch to Optimize, choose how many DCs to open (k), and press the button. The gap in coverage and cost between your network and the optimal one is your improvement opportunity.Cambia a Optimizar, elige cuántos CEDIS abrir (k) y presiona el botón. La brecha en cobertura y costo entre tu red y la óptima es tu oportunidad de mejora.
'; var w=window.open('','net_report','width=1180,height=820,scrollbars=yes,resizable=yes'); if(w){w.document.write(doc);w.document.close();w.focus();} } /* language + menu */ function interpNetwork(covPct,nOpen,totalCost){ if(!isFinite(covPct))return ''; var icon,cls,en,es; if(covPct>=95){ icon='✅';cls='green'; en='Strong coverage ('+covPct.toFixed(0)+'%). Nearly all demand is within your service-distance threshold. Shift focus to reducing transport cost — consolidate routes or fine-tune DC locations.'; es='Cobertura sólida ('+covPct.toFixed(0)+'%). Casi toda la demanda está dentro del umbral de distancia de servicio. Enfócate ahora en reducir el costo de transporte — consolida rutas o ajusta la ubicación de los CEDIS.'; }else if(covPct>=75){ icon='🟡';cls='amber'; en='Partial coverage ('+covPct.toFixed(0)+'%). Some demand zones are beyond your service threshold — customers there face longer lead times or higher freight cost. Open one more DC in the gap area, or extend your service-distance threshold if your SLA allows it.'; es='Cobertura parcial ('+covPct.toFixed(0)+'%). Algunas zonas de demanda están más allá de tu umbral de servicio — los clientes enfrentan lead times más largos o mayor costo de flete. Abre un CEDIS más en la zona sin cobertura, o amplía el umbral de distancia si tu SLA lo permite.'; }else{ icon='🟥';cls='red'; en='Low coverage ('+covPct.toFixed(0)+'%). A significant portion of demand is underserved. This translates to late deliveries, lost sales, and high spot-freight spend. Use the Optimize button to find where to open more DCs.'; es='Cobertura baja ('+covPct.toFixed(0)+'%). Una porción significativa de la demanda está mal atendida. Esto se traduce en entregas tardías, ventas perdidas y alto gasto en flete spot. Usa el botón Optimizar para encontrar dónde abrir más CEDIS.'; } return '
'+icon+'
'+en+''+es+'
'; } var HOWTO_SHOW='Show ▼Mostrar ▼'; var HOWTO_HIDE='Hide ▲Ocultar ▲'; function toggleHowTo(){ var h=document.getElementById('howTo'),b=document.getElementById('howToBtn'); var col=h.classList.toggle('collapsed'); b.innerHTML=col?HOWTO_SHOW:HOWTO_HIDE; try{localStorage.setItem('howto_hidden',col?'1':'');}catch(ex){} } (function(){ try{ if(localStorage.getItem('howto_hidden')==='1'){ var h=document.getElementById('howTo'); if(h){ h.classList.add('collapsed'); var b=document.getElementById('howToBtn'); if(b){b.innerHTML=HOWTO_SHOW;} } } }catch(ex){} })(); function toggleAddZone(){ var form=document.getElementById('addZoneForm'); var btn=document.getElementById('addZoneBtn'); var open=form.classList.toggle('open'); if(open){ document.getElementById('newZoneName').focus(); btn.innerHTML='−' +'CancelCancelar'; }else{ btn.innerHTML='+' +'Add demand zoneAgregar zona de demanda'; } } function submitAddZone(){ var name=(document.getElementById('newZoneName').value||'').trim(); var demand=parseFloat(document.getElementById('newZoneDemand').value)||1000; if(!name){document.getElementById('newZoneName').focus();return;} // place at center of map ZONES.push({name:name, x:VIEW_W/2 + (Math.random()-0.5)*80, y:VIEW_H/2 + (Math.random()-0.5)*60, demand:demand}); // close form and reset inputs document.getElementById('newZoneName').value=''; document.getElementById('newZoneDemand').value=''; var form=document.getElementById('addZoneForm'); form.classList.remove('open'); var btn=document.getElementById('addZoneBtn'); btn.innerHTML='+' +'Add demand zoneAgregar zona de demanda'; recompute(); } // allow Enter key in add-zone form document.addEventListener('keydown',function(e){ if(e.key==='Enter' && document.getElementById('addZoneForm').classList.contains('open')){ submitAddZone(); } }); var __lang="en"; /* Legacy nav only (hidden by site.js). The tool itself never writes localStorage 'lang' — only the site header does. */ function applyLegacyLang(l){ __lang=l; document.querySelectorAll('.li-en').forEach(function(e){e.style.display=l==='en'?(e.tagName==='SPAN'||e.tagName==='BUTTON'?'inline':'block'):'none';}); document.querySelectorAll('.li-es').forEach(function(e){e.style.display=l==='es'?(e.tagName==='SPAN'||e.tagName==='BUTTON'?'inline':'block'):'none';}); document.getElementById('btn-lang-en').classList.toggle('on',l==='en'); document.getElementById('btn-lang-es').classList.toggle('on',l==='es'); } function setLang(l){ applyLegacyLang(l); try{localStorage.setItem('lang',l);}catch(ex){} } function toggleMenu(){var b=document.getElementById('hamburger'),m=document.getElementById('mobileMenu');b.classList.toggle('open');m.classList.toggle('open');} function closeMenu(){var b=document.getElementById('hamburger'),m=document.getElementById('mobileMenu');if(b)b.classList.remove('open');if(m)m.classList.remove('open');} document.addEventListener('click',function(e){var m=document.getElementById('mobileMenu'),b=document.getElementById('hamburger');if(m&&m.classList.contains('open')&&!m.contains(e.target)&&b&&!b.contains(e.target))closeMenu();},false); /* ---------- i18n helpers (site language = html.msc-es) ---------- */ function isES(){return document.documentElement.classList.contains('msc-es');} function L(en,es){return isES()?es:en;} var ZONE_ES={'Pacific NW':'Noroeste del Pacífico','Southwest':'Suroeste','Midwest':'Medio Oeste','Southeast':'Sureste','Northeast':'Noreste'}; var DC_ES={'DC-West':'CEDIS-Oeste','DC-Mountain':'CEDIS-Montaña','DC-Texas':'CEDIS-Texas','DC-Midwest':'CEDIS-Medio Oeste','DC-Southeast':'CEDIS-Sureste','DC-East':'CEDIS-Este'}; /* display-only labels for preset names; underlying data is unchanged */ function zoneLabel(n){return isES()&&ZONE_ES[n]?ZONE_ES[n]:n;} function dcLabel(n){if(!isES())return n;if(DC_ES[n])return DC_ES[n];return /^DC-/.test(n)?'CEDIS-'+n.slice(3):n;} function refreshStaticI18n(){ function a(id,v){var e=document.getElementById(id);if(e)e.setAttribute('aria-label',v);} a('kSlider',L('DCs to open (k)','CEDIS a abrir (k)')); a('inRate',L('Freight rate ($ / unit / 100 km)','Tarifa de flete ($ / unidad / 100 km)')); a('inFixed',L('Fixed cost per DC ($ / year, thousands)','Costo fijo por CEDIS ($ / año, miles)')); a('inSvc',L('Service distance (km)','Distancia de servicio (km)')); a('newZoneName',L('New zone name','Nombre de la nueva zona')); a('newZoneDemand',L('New zone demand','Demanda de la nueva zona')); var nz=document.getElementById('newZoneName');if(nz)nz.setAttribute('placeholder',L('e.g. North Region','p. ej. Región Norte')); } /* init */ refreshStaticI18n(); loadGeo('mx'); /* Re-render on site language change (html.msc-es); zones, DCs, mode and inputs are kept. */ (function(){ var lastES=isES(); new MutationObserver(function(){ var nowES=isES(); if(nowES===lastES)return; lastES=nowES; refreshStaticI18n(); recompute(); }).observe(document.documentElement,{attributes:true,attributeFilter:['class']}); })(); /* Legacy nav sync: read-only, never writes localStorage 'lang'. */ applyLegacyLang(isES()?'es':'en');