{"id":188412,"date":"2026-03-02T10:56:30","date_gmt":"2026-03-02T03:56:30","guid":{"rendered":"https:\/\/www.hashmicro.com\/id\/blog\/?p=188412"},"modified":"2026-03-02T10:56:30","modified_gmt":"2026-03-02T03:56:30","slug":"vehicle-routing-problem","status":"publish","type":"post","link":"https:\/\/www.hashmicro.com\/id\/blog\/vehicle-routing-problem\/","title":{"rendered":"Panduan Vehicle Routing Problem untuk Optimasi Rute Logistik"},"content":{"rendered":"<p>Pengelola logistik, tim distribusi, dan pemilik bisnis pengiriman menghadapi tekanan besar untuk mengatur rute armada secara efisien. Artikel ini memperkenalkan konsep vehicle routing problem dan menjelaskan mengapa topik ini penting bagi operasional modern.<\/p>\n<p>Penentuan rute kendaraan sering terlihat sederhana, tetapi praktiknya melibatkan banyak variabel seperti jarak, waktu, kapasitas, dan prioritas pengiriman. Tanpa metode yang tepat, biaya mudah meningkat, jadwal terganggu, dan kinerja armada menurun.<\/p>\n<p>Pembahasan berikut mengulas pendekatan optimalisasi yang dapat diterapkan di berbagai skenario distribusi. Dengan memahami prinsipnya, pembaca dapat meningkatkan efisiensi pengiriman, menghemat biaya operasional, dan merencanakan perjalanan dengan lebih presisi.<\/p>\n<table style=\"border-collapse: collapse; background-color: #fffacd; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); border-radius: 25px 25px 25px 25px;\" width=\"100%\">\n<tbody>\n<tr>\n<td style=\"padding: 15px; border: none;\">\n<h3 style=\"margin-bottom: 10px;\"><span style=\"background-color: #8a0e19; color: #ffffff; padding: 5px;\"><b>Key Takeaways<\/b><\/span><\/h3>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><a href=\"#a\">Vehicle Routing Problem adalah<\/a> metode optimasi yang menentukan rute paling efisien bagi banyak kendaraan dari satu atau beberapa depot untuk melayani banyak pelanggan sekaligus.<\/li>\n<li aria-level=\"1\">VRP ditentukan oleh <a href=\"#b\">empat elemen utama<\/a> yaitu jaringan jalan, pelanggan, depot, dan kendaraan yang bersama-sama memengaruhi efisiensi rute.<\/li>\n<li aria-level=\"1\">Variasi VRP muncul karena <a href=\"#c\">batasan operasional nyata<\/a> seperti kapasitas kendaraan, jendela waktu layanan, kebutuhan pickup sekaligus delivery, serta target efisiensi energi dan emisi.<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div id=\"toc_group_article\" style=''>\r\n\t<p style='font-size:25px;font-weight:bold; margin-bottom:0px'>\r\n\t\tDaftar Isi:\r\n\t<\/p>\r\n\t<ul id=\"list_toc\" class='list_toc'><\/ul>\r\n<\/div>\r\n\r\n<div id=\"placeholder-toc\"><\/div>\r\n<div id=\"toc\">\r\n    <div class=\"header\">\r\n\t<span class=\"toc-title\" id=\"toc-title\">Daftar Isi<\/span>\t\r\n\t <i class=\"toc-icon\">\r\n        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"30\" height=\"30\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#000\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"header-icon\">\r\n          <path d=\"m6 9 6 6 6-6\" \/>\r\n        <\/svg>\r\n      <\/i>\r\n\t<\/div>\r\n    <div class=\"list\">\r\n      <ul id=\"toc-list\"><\/ul>\r\n    <\/div>\r\n <\/div>\r\n\r\n<style>\r\n\/* Simple styling for the TOC *\/\r\n\t\r\n\t#toc ul li:last-child {\r\n    padding-bottom: 16px; \/* Adjust the value as needed *\/\r\n}\r\n\r\n.td-fix-index {\r\n\t transform: unset !important;\r\n     -webkit-transform: unset !important; \r\n}\r\n.footer-contact .td-fix-index {\r\n\t transform: translateZ(0) !important;\r\n     -webkit-transform: translateZ(0) !important; \r\n}\r\n\t.tdb_single_content .tdb-block-inner.td-fix-index{\r\n\t\tposition: static;\r\n\t}\r\n\t\r\n\r\n\r\n\t\r\n#toc {\r\n  background-color: #FFF;\r\n\tpadding: 17px 24px 0px 24px !important;\r\n  margin-bottom: 20px;\r\n\/*   border: 1px solid #9C171E; *\/\r\n  border-radius: 6px;\r\n\tdisplay: none;\r\n  max-width: 100%;\r\n  transition: .4s ease height;\r\n\tmargin-left: 0;\r\n\toverflow: hidden;\r\n}\r\n\r\n#toc .header{\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: space-between;\r\n\tbackground-color: transparent;\r\n}\r\n\t\r\n\t#toc.sticky .header{\r\n\t\tpadding: 4px 0;\r\n\t}\r\n\t\r\n.header p{\r\n  font-size: 18px !important;\r\n  font-weight: 600 !important;\r\n  color: #393939;\r\n   margin-bottom: 0;\r\n  \/* margin-top: 20px; *\/\r\n}\r\n\r\n.toc-icon{\r\n  float: right;\r\n\/*   visibility: hidden; *\/\r\n}\r\n\r\n\t.toc-title{\r\n\t\tmargin-right: auto;\r\n\/* \t\tpadding-left: 20px; *\/\r\n\t\tfont-weight: 600;\r\n\t\talign-self: center;\t}\t\r\n\r\n#toc ul {\r\n  list-style-type: none;\r\n  padding-left: 0;\r\n}\r\n\t\r\n#toc.sticky ul{\r\n\toverflow-y: auto;\r\n\tmax-height: 250px;\r\n\tmargin-top: 0px;\r\n\tpadding-top: 20px;\r\n\/* \tborder-top: 1px solid #d3d3d3; *\/\r\n}\r\n\t\r\n#toc ul li {\r\n\/*   margin-bottom: 10px; *\/\r\n  margin-bottom: 10px;\r\n\tmargin-left: 0;\r\n\ttransition: .2s ease;\r\n\tcursor: pointer;\r\n}\r\n\t\r\n\t#toc.sticky ul li {\r\n\t  margin-right: 10px;\r\n\t}\r\n\t\r\n.td-post-content #toc-list li a:hover, .td-post-content #toc-list a.active{\r\n\tbackground-color: #FFF;\r\n\/* \tpadding: 8px 16px 8px 16px; *\/\r\n\tpadding: 4px 16px 4px 16px;\r\n\tborder-radius: 6px;\r\n\tcolor: #9c171e !important;\r\n\tfont-weight: 600 !important;\r\n}\r\n\t\r\n\t.td-post-content #toc-list li:hover a, .td-post-content #toc-list a.active{\r\n\t\tcolor: #9C171E !important;\r\n\t\tfont-weight: 600 !important;\r\n\t}\r\n\t\r\n.td-post-content #toc-list a.active{\r\n\tfont-weight: bold !important;\r\n\tcolor: #9C171E !important;\r\n}\r\n\t\r\n#toc a, .td-post-content #toc-list a {\r\n  text-decoration: none;\r\n  color: #ea1717 !important;\r\n  transition: .2s ease;\r\n\tfont-weight: 400 !important;\r\n\tdisplay: block;\r\n\t\r\n\tpadding: 4px 16px 4px 0;\r\n}\r\n\r\n#toc.sticky {\r\n  position: fixed;\r\n\/*   top: 73px; *\/\r\n\tbottom: 0;\r\n  z-index: 100; \r\n  box-shadow: 0 2px 5px rgba(0,0,0,0.1); \r\n\twidth: 100%; \r\n\tbackground-color: #FFF;\r\n\/* \tbackground-color: #FFF1F1; *\/\r\n\tborder-bottom: 1px solid #ea1717;\r\n\/*   border: 1px solid #393939; *\/\r\n  box-shadow: 0px 0px 14px 0px #00000040;\r\n  cursor: pointer;\r\n\tanimation: fadein .3s ease;\r\n\tpadding: 12px 16px !important;\r\n}\r\n\t\r\n\t.fadein{\r\n\t\tanimation: fadein .3s ease;\r\n\t}\r\n\t\r\n\t.fadeout{\r\n\t\tanimation: fadeout .3s ease;\r\n\t}\r\n\t\r\n\t\r\n\t@keyframes fadein{\r\n\t\t0% {\r\n\t\t\topacity: 0;\r\n\t\t}\r\n\t\t100%{\r\n\t\t\topacity: 1;\r\n\t\t}\r\n\t}\r\n\t\r\n\t@keyframes fadeout{\r\n\t\t0% {\r\n\t\t\topacity: 1;\r\n\t\t}\r\n\t\t100%{\r\n\t\t\topacity: 0;\r\n\t\t}\r\n\t}\r\n\r\n\t\r\n#toc.sticky .header p{\r\n\tmargin-bottom: 10px;\r\n\tmargin-top: 10px;\r\n}\r\n\r\n#toc.sticky .toc-icon{\r\n  visibility: visible;\r\n\/* \ttransition: 0.4s ease; *\/\r\n}\r\n\t\r\n\t.toc-icon{\r\n\t\talign-items: center;\r\n    \tdisplay: flex;\r\n\t}\r\n\t\r\n\tsvg.header-icon{\r\n\/* \t\tbackground-color: #9c171e; *\/\r\n\t\tbackground-color: #FFF;\r\n\t\tborder-radius: 30px;\r\n\t\tpadding: 5px;\r\n\t}\r\n\r\n#toc.sticky .list{\r\n\/*   max-height: 0; *\/\r\n  transition: height 0.4s ease;\r\n}\r\n\t\r\n\t#toc .list{\r\n\/*   max-height: 0; *\/\r\n  transition: height 0.4s ease;\r\n}\r\n\r\n#toc .header.active .toc-icon{\r\n\ttransform: rotate(0deg); \r\n\topacity: 1;\r\n}\r\n\r\n\t#toc .header.active + .list {\r\n\t  max-height: 200px; \/* Adjust this value as needed *\/\r\n\t  opacity: 1;\r\n\t}\r\n\t\r\n\t#placeholder-toc{\r\n\/* \t\tdisplay: none; *\/\r\n\t}\r\n\t\r\n\t@media (min-width: 768px) and (max-width: 991px){\r\n\t\t#toc.sticky{\r\n\/* \t\t\ttop: 104px; *\/\r\n\t\t\tbottom: 0px;\r\n\t\t}\r\n\t\t\r\n\t\t#toc{\r\n\t\t\twidth: unset !important;\r\n\t\t}\r\n\t}\r\n\t\r\n\t@media (max-width: 767px){\r\n\t\t#toc{\r\n\t\t\twidth: 100% !important;\r\n\t\t\tdisplay: inline-block;\r\n\t\t}\r\n\t\t\r\n\t\t#toc.sticky{\r\n\t\t\twidth: 90% !important;\r\n\/* \t\t\ttop: 81px; *\/\r\n\t\t\tbottom: 60px;\r\n\t\t\tmargin-left: auto;\r\n\t\t\tmargin-right: auto;\r\n\t\t\tpadding: 0 16px;\r\n\t\t\tright: 5%;\r\n\t\t}\r\n\t}\r\n\t\r\n\t<\/style>\r\n\r\n<style>\r\n\t#list_toc li {margin-bottom: 0;margin-top: 5px;}\r\n\t#list_toc > li > ul {padding-left: 20px;margin-bottom: 0;}\r\n\t#list_toc{height:max-content;transition:ease-in-out}\r\n\t#list_toc li {margin-bottom: 0;margin-top: 5px;}\r\n\t#list_toc_float li.active > a {color:#b1252d;background: #ffe1e3;}\r\n\t#list_toc_float li a {padding:3px 7px}\r\n\t#list_toc_float li a {\r\n\t\tdisplay: block;\r\n\t\tcolor:#000;\r\n\t\tmargin-bottom: 10px;\r\n\t\ttransition:all 0.2s ease-in-out;\r\n\t\tfont-size:15px\r\n\t}\r\n\t#list_toc_float li{list-style:none;list-style-position:inside; margin-left:0;}\r\n\t#list_toc_float a:hover{color:#b1252d;}\r\n\t\r\n\t#list_toc_float li a{margin-bottom:0px}\r\n\t#toc_group_float{\r\n\t\tline-height: 24px;\r\n\t\tmax-height: calc(100vh - 100px);\r\n\t\toverflow: auto;\r\n\t\tz-index: 99;\r\n\t\tdisplay:none!important;\r\n\t\tbackground:#fff;\r\n\t\ttransition:all 0.5s linear\r\n\t}\r\n\t\r\n\t@media (min-width:1019px){\r\n\t\t#toc_group_float {\r\n\t\t\tdisplay:block!important;\r\n\t\t\t}\r\n\t\t#toc_group_article {\r\n\t\t\tdisplay:none;\r\n\t\t}\r\n\t}\r\n\t\r\n\t@media (max-width:768px){\r\n\t\t#toc_group_article {\r\n\t\t\tdisplay:none;\r\n\t\t}\r\n\t}\r\n\t\r\n\t \/* custom scrollbar style *\/\r\n::-webkit-scrollbar {\r\n    width: 7px;\r\n}\r\n::-webkit-scrollbar-track {\r\n    background: #d7a2a4;\r\n}\r\n::-webkit-scrollbar-thumb {\r\n    background: #b1252d;\r\n    border-radius: 15px;\r\n}\t\t\r\n\r\n<\/style>\r\n\r\n<script>\r\n\tdocument.addEventListener('DOMContentLoaded', function() {\r\n\t\t\/\/ Fungsi untuk menangani klik pada semua elemen <a> dengan href yang dimulai dengan #\r\n\t\tfunction handleTitleClick(event) {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tconst targetId = this.getAttribute('href').substring(1);\r\n\t\t\tconst targetElement = document.getElementById(targetId);\r\n\r\n\t\t\tif (targetElement) {\r\n\t\t\t\tconst headerHeight = document.querySelector('#toc .header').offsetHeight;\r\n\t\t\t\tconst navbarHeight = document.getElementById('tdi_34') ? document.getElementById('tdi_34').offsetHeight : 0;\r\n\t\t\t\tconst windowHeight = window.innerHeight;\r\n\t\t\t\tconst targetOffset = targetElement.offsetTop;\r\n\t\t\t\tconst scrollTo = targetOffset + (windowHeight \/ 2) + (headerHeight) - navbarHeight - 40;\r\n\r\n\t\t\t\twindow.scrollTo({\r\n\t\t\t\t\ttop: scrollTo,\r\n\t\t\t\t\tbehavior: 'smooth'\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t\/\/ Tambahkan event listener untuk semua elemen <a> di toc-list dan list-toc\r\n\t\tconst titleLinks = document.querySelectorAll('#toc-list a, #list_toc a');\r\n\t\ttitleLinks.forEach(link => {\r\n\t\t\tlink.addEventListener('click', handleTitleClick);\r\n\t\t});\r\n\t});\r\n<\/script>\r\n\r\n<!-- ToC List for mobile -->\r\n<script>\r\n \/\/ Generate TOC based on headings\r\ndocument.addEventListener(\"DOMContentLoaded\", function() {\r\n  \/\/ Get the element that will contain the TOC\r\n  const tocList = document.getElementById('toc-list');\r\n\r\n  \/\/ Get the element with the ID 'article-left'\r\n  const article = document.querySelector('.td-post-content');\r\n\r\n  \/\/ Find all h2 elements within 'myarticle'\r\n  const headers = article.getElementsByTagName('h2');\r\n\r\n  \/\/ Loop through the h2 elements and create a list item for each one\r\n  for (let i = 0; i < headers.length; i++) {\r\n    const header = headers[i];\r\n    const headerText = header.textContent;\r\n\/\/     const headerId = 'header-' + i;\r\n    const headerId = headerText\r\n    .toLowerCase()\r\n    .trim()\r\n    .replace(\/[^\\w\\s-]\/g, '')  \/\/ hapus tanda baca\r\n    .replace(\/\\s+\/g, '-'); \/\/ ganti spasi jadi \"-\"\r\n\r\n    \/\/ Set an ID for the header if it doesn't have one\r\n    header.setAttribute('id', headerId);\r\n\r\n    \/\/ Create a list item for the TOC\r\n    const listItem = document.createElement('li');\r\n\r\n    \/\/ Create a link for the list item\r\n    const link = document.createElement('a');\r\n    link.setAttribute('href', '#' + headerId);\r\n    link.textContent = headerText;\r\n\r\n    \/\/ Append the link to the list item\r\n    listItem.appendChild(link);\r\n\r\n    \/\/ Append the list item to the TOC list\r\n    tocList.appendChild(listItem);\r\n  }\r\n});\r\n\r\n\/\/ Keep height and placement of content using placeholder in place of TOC\r\ndocument.addEventListener(\"DOMContentLoaded\", function() {\r\n  const toc = document.querySelector('#toc');\r\n  const placeholderToc = document.querySelector('#placeholder-toc');\r\n\r\n  function setPlaceholderHeight() {\r\n    placeholderToc.style.height = `${toc.offsetHeight}px`;\r\n  }\r\n\r\n  \/\/ Set the initial height of the placeholder\r\n  setPlaceholderHeight();\r\n\r\n  \/\/ Update the height on window resize\r\n  window.addEventListener('resize', setPlaceholderHeight);\r\n});\r\n  const tocTitle = document.querySelector('#toc-title'); \/\/ Assuming header-faq is the element for TOC title\r\n\r\n\/\/ Sticky TOC and update heading\r\n\/\/ document.addEventListener(\"DOMContentLoaded\", function() {\r\n\/\/   const toc = document.querySelector('#toc');\r\n\/\/   const footer = document.querySelector('.td-footer-template-wrap');\r\n\/\/   const tocParent = toc.parentElement;\r\n\/\/   const divTop = tocParent.getBoundingClientRect().top + window.pageYOffset;\r\n\/\/   const tocHeight = toc.offsetHeight;\r\n\/\/   const triggerPoint = divTop + tocHeight + 700;\r\n\/\/   const footerHeight = footer.offsetHeight;\r\n\/\/   const triggerFooterPoint = footer.getBoundingClientRect().top + window.pageYOffset - footerHeight - footerHeight - footerHeight;\r\n\/\/   const phtoc = document.querySelector('#placeholder-toc');\r\n\/\/   const headers = document.querySelectorAll('.td-post-content h2');\r\n\/\/   const navLinks = document.querySelectorAll('#toc-list a');\r\n\t\r\n\/\/ \tconst panel2 = document.querySelector(\"#toc .list\");\r\n\/\/ \tvar icon = document.querySelector(\".toc-icon\");\r\n\r\n\/\/   let activeLink = null; \/\/ Declare activeLink outside the loop\r\n\t\r\n\/\/   \/\/ Function to handle scroll and add\/remove .sticky class\r\n\/\/   function handleScroll() {\r\n\/\/     const windowTop = window.pageYOffset || document.documentElement.scrollTop;\r\n\/\/     let currentHeader = '';\r\n\r\n\/\/     \/\/ Highlight user progress as the heading comes\r\n\/\/     headers.forEach(header => {\r\n\/\/ \t\tconst headerTop = header.offsetTop;\r\n\/\/ \t\tconst headerHeight = header.clientHeight;\r\n\/\/ \/\/ \t\tif (window.scrollY >= (headerTop - headerHeight + 700)) {\r\n\/\/ \/\/ \t\t\tconst currentHeaderId = header.getAttribute('id');\r\n\/\/ \/\/ \t\t\tconst currentHeaderText = document.getElementById(currentHeaderId).textContent;\r\n\/\/ \/\/ \t\t\tconsole.log(\"current header text:\", currentHeaderText);\r\n\/\/ \/\/ \t\t\ttocTitle.textContent = currentHeaderText;\r\n\/\/ \/\/ \t\t\tcurrentHeader = currentHeaderId;\r\n\t\t\t\r\n\/\/ \/\/ \t\t\tif(window.innerWidth < 767){\r\n\/\/ \/\/ \t\t\t\ttocTitle.textContent = 'Daftar Isi';\r\n\/\/ \/\/ \t\t\t}\r\n\/\/ \/\/ \t\t}\r\n\/\/ \t\tif(window.innerWidth < 767){\r\n\/\/ \t\t\ttocTitle.textContent = 'Daftar Isi'; \/\/ Selalu pertahankan judul ini di mobile\r\n\/\/ \t\t} else {\r\n\/\/ \t\t\tif (window.scrollY >= (headerTop - headerHeight + 700)) {\r\n\/\/ \t\t\t\tconst currentHeaderId = header.getAttribute('id');\r\n\/\/ \t\t\t\tconst currentHeaderText = document.getElementById(currentHeaderId).textContent;\r\n\/\/ \t\t\t\ttocTitle.textContent = currentHeaderText;\r\n\/\/ \t\t\t\tcurrentHeader = currentHeaderId;\r\n\/\/ \t\t\t}\r\n\/\/ \t\t}\r\n\/\/ \t});\r\n\r\n\/\/     navLinks.forEach(link => {\r\n\/\/       link.classList.remove('active');\r\n\/\/       if(currentHeader != '') {\r\n\/\/ \t\t  if (link.getAttribute('href').includes(currentHeader)) {\r\n\/\/ \t\t\t  link.classList.add('active');\r\n\/\/ \t\t  }\r\n\/\/ \t  }\r\n\/\/     });\r\n\/\/ \/\/     if (windowTop < triggerFooterPoint) {\r\n\/\/ \/\/         toc.style.display = 'block';\r\n\/\/ \/\/ \t}else{\r\n\/\/ \/\/         toc.style.display = 'none';\r\n\/\/ \/\/ \t}\r\n\/\/     \/\/ Update TOC title if sticky\r\n\/\/     if (windowTop > triggerPoint) {\r\n\/\/       if (!toc.classList.contains('sticky')) {\r\n\/\/         phtoc.style.display = \"block\";\r\n\/\/         toc.classList.add('sticky');\r\n\/\/         toc.style.width = `${tocParent.offsetWidth}px`; \/\/ Set width to match the parent element\r\n\/\/         toc.setAttribute('style', 'width: ' + tocParent.offsetWidth + 'px !important;');\r\n\/\/         toc.style.backgroundColor = \"#FFF\";\r\n\/\/ \t\tpanel2.style.height = '0px';\r\n\/\/ \t\t  icon.style.transform = \"rotate(180deg)\";\r\n\/\/ \t\t  if(window.innerWidth < 767){\r\n\/\/ \/\/ \t\t\t  const tocs = document.querySelector('#toc.sticky');\r\n\/\/ \t\t\t  tocTitle.textContent = 'Daftar Isi'; \/\/ Reset title\r\n\/\/        \t\t  toc.style.width = '150px'; \/\/ Set width to match the parent element\r\n\/\/ \t\t  }\r\n\/\/       }\r\n\/\/       if (currentHeader) {\r\n\/\/ \/\/         console.log(\"activeLink:\", activeLink);\r\n\/\/         if (activeLink) {\r\n\/\/ \/\/           tocTitle.textContent = activeLink.textContent; \/\/ Update TOC title\r\n\/\/           tocTitle.textContent = activeLink ? activeLink.textContent : \"\"; \/\/ Update title only if activeLink exists\r\n\/\/         }\r\n\/\/       }\r\n\/\/     } else {\r\n\/\/       toc.classList.remove('sticky');\r\n\/\/       phtoc.style.display = \"none\";\r\n\/\/       toc.style.width = 'unset'; \/\/ Reset to original width\r\n\/\/       toc.style.backgroundColor = \"#FFF\";\r\n\/\/       tocTitle.textContent = 'Daftar isi'; \/\/ Reset title\r\n\/\/ \t\tpanel2.style.height = panel2.scrollHeight + \"px\";\r\n\/\/ \t\ticon.style.transform = \"rotate(180deg)\";\r\n\/\/     }\r\n\/\/   }\r\n\r\n\/\/     \/\/ Attach the scroll event listener to the window\r\n\/\/     window.addEventListener('scroll', handleScroll);\r\n\r\n\/\/     \/\/ Initial call to handleScroll to set the correct state on load\r\n\/\/     handleScroll();\r\n\/\/ });\r\n\t\r\n\/\/ \t\/\/ Open toggle TOC\r\n\/\/ \t  document.addEventListener(\"DOMContentLoaded\", function() {\r\n\/\/ \t\tvar tocHeader = document.querySelector(\"#toc .header\");\r\n\/\/ \t\tvar toc = document.querySelector(\"#toc\");\r\n\/\/ \t\tvar icon = document.querySelector(\".toc-icon\");\r\n\/\/ \t\tconst tocTitle = document.querySelector('#toc-title');\r\n\/\/ \t\tconst tocs = document.querySelector('#toc.sticky');\r\n\/\/  \t\tconst tocParent = toc.parentElement;\t\t  \r\n\r\n\/\/ \t\t  tocHeader.addEventListener(\"click\", function() {\r\n\/\/ \t\t\tvar panel = this.nextElementSibling;\r\n\/\/ \t\t\tif (panel.style.height !== '0px') { \/\/ Check if height is not 0px\r\n\/\/ \t\t\t  panel.style.height = '0px'; \/\/ Set height to 0 for full collapse\r\n\/\/ \t\t\t  icon.style.transform = \"rotate(180deg)\";\r\n\/\/ \/\/ \t\t\t\ttoc.style.paddingBottom = '6px'; \r\n\/\/ \t\t\t\tif(window.innerWidth > 768){\r\n\/\/ \t\t\t\t\tif(!toc.classList.contains('sticky')){\r\n\/\/ \t\t\t\t\t\ttoc.style.width = \"unset\";\r\n\/\/ \/\/ \t\t\t\t\t\ttoc.setAttribute('style', 'width: ' + tocParent.offsetWidth + 'px !important;');\r\n\/\/ \t\t\t\t\t}\r\n\/\/ \t\t\t\t\tif (toc.classList.contains('sticky')){\r\n\/\/ \t\t\t\t\t\ttoc.style.width = '${tocParent.offsetWidth}px';\r\n\/\/ \t\t\t\t\t\ttoc.setAttribute('style', 'width: ' + tocParent.offsetWidth + 'px !important;');\r\n\/\/ \t\t\t\t\t}\r\n\/\/ \t\t\t\t}\r\n\/\/ \t\t\t\tif(window.innerWidth < 767){\r\n\/\/ \t\t\t\t\ttoc.style.width = \"unset\"; \/\/ Reset width\r\n\/\/ \t\t\t\t}\r\n\/\/ \t\t\t\ttoc.style.backgroundColor = \"#FFF1F1\";\r\n\/\/ \t\t\t} else {\r\n\/\/ \t\t\t  panel.style.height = panel.scrollHeight + \"px\";\r\n\/\/ \t\t\t  icon.style.transform = \"rotate(0deg)\";\r\n\/\/ \t\t\t  toc.style.backgroundColor = \"#FFF\";\r\n\/\/ \t\t\t  tocTitle.textContent = 'Daftar isi'; \/\/ Reset title\r\n\/\/ \t\t\t\ttoc.style.paddingBottom = '24px';\r\n\/\/ \t\t\t \tif(window.innerWidth < 767){\r\n\/\/ \t\t\t\t\ttoc.style.width = `${tocParent.offsetWidth}px`; \/\/ Set width to match the parent element\r\n\/\/ \t\t\t\t\ttoc.setAttribute('style', 'width: ' + tocParent.offsetWidth + 'px !important;');\r\n\/\/ \t\t\t\t}\r\n\/\/ \t\t\t}\r\n\/\/ \t\t  });\r\n\r\n\/\/ \t\t  \/\/ Close TOC when a link inside it is clicked\r\n\/\/ \t\t  var tocLinks = document.querySelectorAll(\"#toc .list a\");\r\n\/\/ \t\t  tocLinks.forEach(function(link) {\r\n\/\/ \t\t\tlink.addEventListener(\"click\", function() {\r\n\/\/ \t\t\t  var panel = document.querySelector(\"#toc .list\");\r\n\/\/ \t\t\t  panel.style.height = '0px'; \/\/ Set height to 0 for full collapse\r\n\/\/ \t\t\t  icon.style.transform = \"rotate(180deg)\";\r\n\/\/ \t\t\t  toc.style.backgroundColor = \"#FFF\";\r\n\/\/ \t\t\t});\r\n\/\/ \t\t  });\r\n\/\/ \t\t});\r\n\r\n\/\/ START new JS for ToC improvements\r\ndocument.addEventListener(\"DOMContentLoaded\", function() {\r\n  const toc = document.querySelector('#toc');\r\n  const footer = document.querySelector('.td-footer-template-wrap');\r\n  const tocParent = toc.parentElement;\r\n  const divTop = tocParent.getBoundingClientRect().top + window.pageYOffset;\r\n  const tocHeight = toc.offsetHeight;\r\n  const triggerPoint = divTop + tocHeight + 1750;\r\n\tconsole.log(triggerPoint)\r\n  const footerHeight = footer.offsetHeight;\r\n  const triggerFooterPoint = footer.getBoundingClientRect().top + window.pageYOffset - footerHeight*3;\r\n  const phtoc = document.querySelector('#placeholder-toc');\r\n  const headers = document.querySelectorAll('.td-post-content h2');\r\n  const navLinks = document.querySelectorAll('#toc-list a');\r\n  \r\n  const panel2 = document.querySelector(\"#toc .list\");\r\n  const icon = document.querySelector(\".toc-icon\");\r\n  const tocTitle = document.querySelector('#toc-title');\r\n\r\n  let activeLink = null;\r\n  let userClosedTOC = false; \/\/ Flag user menutup TOC\r\n\r\n  function handleScroll() {\r\n    const windowTop = window.pageYOffset || document.documentElement.scrollTop;\r\n    let currentHeader = '';\r\n\r\n    \/\/ Update TOC title sesuai header yang terlihat\r\n    headers.forEach(header => {\r\n      const headerTop = header.offsetTop;\r\n      const headerHeight = header.clientHeight;\r\n      if(window.innerWidth < 767){\r\n        tocTitle.textContent = 'Daftar Isi'; \r\n      } else {\r\n        if (window.scrollY >= (headerTop - headerHeight + 1750)) {\r\n          const currentHeaderId = header.getAttribute('id');\r\n          const currentHeaderText = document.getElementById(currentHeaderId).textContent;\r\n          tocTitle.textContent = currentHeaderText;\r\n          currentHeader = currentHeaderId;\r\n        }\r\n      }\r\n    });\r\n\r\n    navLinks.forEach(link => {\r\n      link.classList.remove('active');\r\n      if(currentHeader && link.getAttribute('href').includes(currentHeader)) {\r\n        link.classList.add('active');\r\n      }\r\n    });\r\n\r\n    if (windowTop > triggerPoint) {\r\n      if (!toc.classList.contains('sticky')) {\r\n        phtoc.style.display = \"block\";\r\n        toc.classList.add('sticky');\r\n        toc.style.width = `${tocParent.offsetWidth}px`;\r\n        toc.style.backgroundColor = \"#FFF\";\r\n        \/\/ Saat sticky, TOC otomatis tertutup\r\n        panel2.style.height = '0px';\r\n        icon.style.transform = \"rotate(180deg)\";\r\n        userClosedTOC = true; \/\/ Set flag supaya tidak terbuka saat scroll\r\n      }\r\n      \r\n      if(window.innerWidth < 767){\r\n        tocTitle.textContent = 'Daftar Isi'; \r\n        toc.style.width = '150px';\r\n      }\r\n\r\n    } else {\r\n      toc.classList.remove('sticky');\r\n      phtoc.style.display = \"none\";\r\n      toc.style.width = 'unset';\r\n      toc.style.backgroundColor = \"#FFF\";\r\n      tocTitle.textContent = 'Daftar isi'; \r\n\r\n      \/\/ Kembalikan panel jika user belum menutup manual\r\n      if(!userClosedTOC) {\r\n        panel2.style.height = panel2.scrollHeight + \"px\";\r\n        icon.style.transform = \"rotate(0deg)\";\r\n      }\r\n    }\r\n  }\r\n\r\n  window.addEventListener('scroll', handleScroll);\r\n  handleScroll();\r\n\r\n  \/\/ Toggle TOC saat user klik\r\n  const tocHeader = document.querySelector(\"#toc .header\");\r\n  tocHeader.addEventListener(\"click\", function() {\r\n    const panel = panel2;\r\n    if (panel.style.height !== '0px') {\r\n      panel.style.height = '0px';\r\n      icon.style.transform = \"rotate(180deg)\";\r\n      userClosedTOC = true;\r\n    } else {\r\n      panel.style.height = panel.scrollHeight + \"px\";\r\n      icon.style.transform = \"rotate(0deg)\";\r\n      userClosedTOC = false;\r\n    }\r\n  });\r\n\r\n  \/\/ Close TOC saat link diklik\r\n  document.querySelectorAll(\"#toc .list a\").forEach(link => {\r\n    link.addEventListener(\"click\", function() {\r\n      panel2.style.height = '0px';\r\n      icon.style.transform = \"rotate(180deg)\";\r\n      userClosedTOC = true;\r\n    });\r\n  });\r\n});\r\n\/\/ END new JS for ToC improvements\r\n\r\n\t\r\n\/\/ \tmake the heading at the center of the viewport\r\n\/\/ \tdocument.addEventListener('DOMContentLoaded', function() {\r\n\/\/     \/\/ Add click event listener to all links in the TOC list\r\n\/\/     document.querySelectorAll('#toc-list a').forEach(anchor => {\r\n\/\/         anchor.addEventListener('click', function (e) {\r\n\/\/             e.preventDefault(); \/\/ Prevent the default behavior of jumping to the anchor\r\n\/\/ \/\/ \t\t\tconsole.log(\"prevent default\");\r\n\/\/             const targetId = this.getAttribute('href').substring(1); \/\/ Get the ID of the target element\r\n\/\/             const targetElement = document.getElementById(targetId); \/\/ Get the target element\r\n\r\n\/\/             if (targetElement) {\r\n\/\/                 const headerHeight = document.querySelector('#toc .header').offsetHeight; \/\/ Get the height of the fixed header\r\n\/\/                 const windowHeight = window.innerHeight; \/\/ Get the height of the viewport\r\n\/\/                 const targetOffset = targetElement.offsetTop; \/\/ Get the top offset of the target element\r\n\/\/                 const scrollTo = targetOffset + (windowHeight \/ 2) + (headerHeight); \/\/ Calculate the scroll position to center the target element\r\n\r\n\/\/                 \/\/ Scroll to the calculated position smoothly\r\n\/\/                 window.scrollTo({\r\n\/\/                     top: scrollTo,\r\n\/\/                     behavior: 'smooth'\r\n\/\/                 });\r\n\/\/             }\r\n\/\/         });\r\n\/\/     });\r\n\/\/ });\r\n<\/script>\r\n\r\n<script>\r\n    \/\/ Scrollspy function to highlight the active TOC item based on the scroll position\r\n  function scrollSpy(tocClass) {\r\n    const scrollPosition = window.scrollY;\r\n\r\n    \/\/ Find the active h2 and h3 headings based on their position in the corresponding TOC\r\n    let activeH2 = null;\r\n    let activeH3 = null;\r\n\r\n    const tocItems = document.querySelectorAll(`.${tocClass} li`);\r\n    tocItems.forEach(item => {\r\n      const a = item.querySelector('a');\r\n      if (!a) return;\r\n      const href = a.getAttribute('href');\r\n      const targetId = href.substring(1); \/\/ Remove the '#' from the href to get the target ID\r\n      const targetElement = document.getElementById(targetId);\r\n      if (!targetElement) return;\r\n\r\n      const targetTop = targetElement.getBoundingClientRect().top + scrollPosition;\r\n      const nextItem = item.nextElementSibling;\r\n      const nextTop = nextItem ? nextItem.getBoundingClientRect().top + scrollPosition : Infinity;\r\n\r\n      if (targetTop <= scrollPosition + 150) {\r\n        if (a.parentElement.parentElement === tocItems) {\r\n          \/\/ The h2 heading is at the root level of the TOC\r\n          activeH2 = { id: targetId, level: 'h2' };\r\n        } \r\n\t\t  else {\r\n          \/\/ The h3 heading is nested under an h2 heading\r\n          const parentH2 = a.parentElement.parentElement.previousElementSibling;\r\n          if (parentH2) {\r\n            const h2Link = parentH2.querySelector('a');\r\n            if (h2Link) {\r\n              const h2Href = h2Link.getAttribute('href');\r\n              const h2Id = h2Href.substring(1);\r\n              activeH2 = { id: h2Id, level: 'h2' };\r\n            }\r\n          }\r\n          activeH3 = { id: targetId, level: 'h3' };\r\n        }\r\n      }\r\n\r\n      if (targetTop > scrollPosition + 150 && nextTop > scrollPosition + 150 && !activeH3) {\r\n        \/\/ Reset the activeH2 when there are no more active h3 headings\r\n        activeH2 = null;\r\n      }\r\n    });\r\n\r\n    \/\/ Update the active state for the TOC items\r\n    tocItems.forEach(item => {\r\n      item.classList.remove('active');\r\n      const a = item.querySelector('a');\r\n      if (a) {\r\n        const href = a.getAttribute('href');\r\n        const targetId = href.substring(1);\r\n        if ((activeH2 && activeH2.id === targetId) || (activeH3 && activeH3.id === targetId)) {\r\n          item.classList.add('active');\r\n        }\r\n      }\r\n    });\r\n  }\r\n\r\n  \/\/ Call scrollSpy for each TOC on window scroll\r\n  const tocClasses = ['list_toc', 'list_toc_float']; \/\/ Add other TOC class names here if you have more than two instances\r\n  tocClasses.forEach(tocClass => {\r\n    window.addEventListener('scroll', () => scrollSpy(tocClass));\r\n  });\r\n<\/script>\r\n\r\n<!-- ToC List for desktop side bar, diganti jadi inject by php, di code snippet \"Sidebar Accordion\" -->\r\n<!-- <script>\r\n\tdocument.addEventListener(\"DOMContentLoaded\", function() {\r\n\r\n        \/\/ Fungsi untuk membuat nested list\r\n        function createNestedList(parentNode, children) {\r\n            if (children.length === 0) return;\r\n\r\n            const nestedUl = document.createElement('ul');\r\n            children.forEach(child => {\r\n                const nestedLi = document.createElement('li');\r\n                const nestedA = document.createElement('a');\r\n                nestedA.textContent = child.title;\r\n                nestedA.href = `#${child.id}`;\r\n                nestedLi.appendChild(nestedA);\r\n                nestedUl.appendChild(nestedLi);\r\n\r\n                if (child.children.length > 0) {\r\n                    createNestedList(nestedLi, child.children);\r\n                }\r\n            });\r\n\r\n            parentNode.appendChild(nestedUl);\r\n        }\r\n\r\n        \/\/ Membuat objek untuk menyimpan daftar h2 dan h3 beserta judulnya\r\n        const headings = [];\r\n\r\n           \/\/ Mengambil semua elemen h2 dan h3\r\n        \/\/ Mengambil semua elemen h2 dan h3\r\n\t\tconst elements = document.querySelectorAll('.td-post-content h2');\r\n\r\n\t\t\tfunction newFormatId(text) {\r\n\t\t\t\tif(text.toLowerCase() === \"key takeaways\") {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tconst result = text.toLowerCase()\r\n\t\t\t\t.trim()\r\n\t\t\t\t.replace(\/[^\\w\\s-]\/g, '')  \/\/ hapus tanda baca\r\n\t\t\t\t.replace(\/\\s+\/g, '-'); \/\/ ganti spasi jadi \"-\"\r\n\r\n\t\t\t\treturn result;\r\n\t\t\t}\r\n\t\r\n\t\telements.forEach(element => {\r\n\t\t\tif (element.tagName === 'H2') {\r\n\t\t\t\tconst id = newFormatId(element.textContent); \/\/ Hasilkan ID baru\r\n\t\t\t\telement.id = id; \/\/ Tetapkan ID ke elemen h2\r\n\t\t\t\tif (element.textContent.toLowerCase() === \"key takeaways\") {return;} \/\/ Kalau Key Takeaways, jangan dimasukin\r\n\t\t\t\theadings.push({ level: 'h2', id: id, title: element.textContent, children: [] });\r\n\t\t\t} else if (element.tagName === 'H3') {\r\n\t\t\t\tconst id = newFormatId(element.textContent); \/\/ Hasilkan ID baru\r\n\t\t\t\telement.id = id; \/\/ Tetapkan ID ke elemen h3\r\n\t\t\t\tif (headings.length > 0) {\r\n\t\t\t\t\theadings[headings.length - 1].children.push({ level: 'h3', id: id, title: element.textContent, children: [] });\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n       \/\/ Membuat list HTML dari objek headings\r\n\t\tconst ul = document.getElementById('list_toc');\r\n\t\tlet currentUl = ul;\r\n\t\theadings.forEach(heading => {\r\n\t\t\tconst li = document.createElement('li');\r\n\t\t\tconst a = document.createElement('a');\r\n\t\t\ta.textContent = heading.title;\r\n\t\t\ta.href = `#${heading.id}`; \/\/ Gunakan ID yang baru dihasilkan\r\n\t\t\tli.appendChild(a);\r\n\r\n\t\t\tif (heading.level === 'h2') {\r\n\t\t\t\tcurrentUl = li;\r\n\t\t\t\tul.appendChild(li);\r\n\t\t\t} else if (heading.level === 'h3') {\r\n\t\t\t\tif (!currentUl.lastElementChild || currentUl.lastElementChild.tagName !== 'UL') {\r\n\t\t\t\t\tconst nestedUl = document.createElement('ul');\r\n\t\t\t\t\tcurrentUl.appendChild(nestedUl);\r\n\t\t\t\t\tcurrentUl = nestedUl;\r\n\t\t\t\t}\r\n\t\t\t\tcurrentUl.appendChild(li);\r\n\t\t\t}\r\n\r\n\t\t\tcreateNestedList(li, heading.children);\r\n\t\t});\r\n\t\t\/\/ Dapatkan elemen ul dengan id 'list_toc'\r\n\t\tconst ulFloat = document.getElementById('list_toc');\r\n\r\n\t\t\/\/ Dapatkan isi (child elements) dari ul dengan id 'list_toc'\r\n\t\tconst clonedChildren = ulFloat.cloneNode(true).children;\r\n\r\n\t\t\/\/ Dapatkan elemen ul dengan id 'list_toc_float'\r\n\t\tconst ulToc = document.getElementById('list_toc_float');\r\n\r\n\t\t\/\/ Tambahkan isi yang telah didapatkan dari 'list_toc' ke ul dengan id 'list_toc_float'\r\n\t\tulToc.append(...clonedChildren);\r\n\r\n\r\n        \/\/ Fungsi untuk mengambil tinggi navbar\r\n\t\tfunction getNavbarHeight() {\r\n\t\t\tconst navbar = document.getElementById('tdi_34');\r\n\t\t\treturn navbar ? navbar.offsetHeight : 0;\r\n\t\t}\r\n\r\n\t\t\/\/ Fungsi untuk menambahkan offset posisi scroll\r\n\t\tfunction scrollToElementWithOffset(elementId) {\r\n\t\t\tconst element = document.getElementById(elementId);\r\n\t\t\tif (element) {\r\n\t\t\t\tconst offset = getNavbarHeight();\r\n\t\t\t\tconst elementPosition = element.getBoundingClientRect().top;\r\n\t\t\t\tconst offsetPosition = elementPosition - offset - 40;\r\n\r\n\t\t\t\twindow.scrollBy({\r\n\t\t\t\t\ttop: offsetPosition,\r\n\t\t\t\t\tbehavior: 'smooth'\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t\/\/ Fungsi untuk menangani klik pada tautan judul\r\n\t\tfunction handleTitleClick(event) {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tconst href = event.target.getAttribute('href').substr(1);\r\n\t\t\tscrollToElementWithOffset(href);\r\n\t\t}\r\n\r\n\t\t\/\/ Tambahkan event listener untuk semua tautan judul\r\n\t\tconst titleLinks = document.querySelectorAll('a[href^=\"#\"]');\r\n\t\ttitleLinks.forEach(link => {\r\n\t\t\tlink.addEventListener('click', handleTitleClick);\r\n\t\t});\r\n\t\t\r\n\t});\r\n    <\/script> -->\r\n\n<h2 id=\"konsep-dasar-vehicle-routing-problem-vrp\"><strong><span id=\"a\">Konsep Dasar Vehicle Routing Problem (VRP)<\/span><\/strong><\/h2>\n<p>Vehicle Routing Problem adalah persoalan kombinatorik untuk menentukan rute armada paling optimal melayani banyak pelanggan. Konsep ini diperkenalkan oleh George Dantzig dan John Ramser pada 1959 sebagai The Truck Dispatching Problem, serta merupakan versi lebih kompleks dari Traveling Salesman Problem karena melibatkan banyak kendaraan dari satu atau beberapa depot.<\/p>\n<p>Tujuan utama penyelesaiannya ialah menekan total biaya rute, yang bisa dihitung dari jarak, waktu, jumlah kendaraan, hingga konsumsi bahan bakar. Dalam model matematis, situasi ini digambarkan sebagai grafik berisi node seperti pelanggan dan depot serta arc sebagai jalan penghubung dengan bobot biaya perjalanan.<\/p>\n<p>Tantangan VRP muncul karena ia termasuk masalah NP-hard, artinya jumlah kemungkinan rute melonjak drastis setiap kali titik berhenti bertambah. Untuk 10 lokasi saja opsinya sudah jutaan, dan saat mencapai 50 titik kombinasi rutenya bisa melampaui jumlah atom di alam semesta, jadi wajar kalau otak manusia saja menyerah tanpa bantuan algoritma.<\/p>\n<h2><strong><span style=\"color: #111111; font-family: Roboto, sans-serif; font-size: 27px;\"><span id=\"b\">Elemen Kunci dalam Sistem Routing<\/span><\/span><\/strong><\/h2>\n<p>Untuk memahami bagaimana VRP bekerja dalam konteks operasional, perlu dipahami elemen-elemen kunci yang membentuk struktur masalah ini. Setiap elemen memiliki karakteristik yang mempengaruhi bagaimana solusi akhir dibentuk.<\/p>\n<h3>1. Jaringan Jalan (Road Network)<\/h3>\n<p>Jaringan jalan menjadi fondasi pergerakan kendaraan dan dalam model matematis direpresentasikan sebagai grafik. Dalam praktik, data geospasialnya jauh lebih kompleks karena mencakup arah jalan, batas kecepatan, tinggi jembatan, dan lalu lintas real-time yang menentukan rute tercepat sebenarnya.<\/p>\n<h3>2. Pelanggan (Customers)<\/h3>\n<p>Pelanggan adalah titik tujuan dengan permintaan spesifik seperti pengiriman atau pengambilan barang. Setiap titik memiliki lokasi tetap, volume kebutuhan, dan sering kali batas waktu layanan yang mengharuskan kendaraan datang pada jam tertentu.<\/p>\n<h3>3. Depot<\/h3>\n<p>Depot adalah titik awal dan akhir dari setiap rute kendaraan. Dalam model sederhana, hanya ada satu depot pusat. Namun dalam rantai pasok yang kompleks, perusahaan mungkin memiliki banyak depot atau pusat distribusi (<em>Multi-Depot VRP<\/em>). Lokasi depot sangat strategis karena menentukan radius operasional dan efisiensi distribusi armada.<\/p>\n<h3>4. Armada Kendaraan (Vehicles)<\/h3>\n<p>Kendaraan merupakan sumber daya utama untuk memenuhi permintaan pelanggan di lapangan. Armada dapat seragam atau campuran, dan masing-masing unit memiliki batas kapasitas, waktu kerja pengemudi, serta spesifikasi teknis yang membatasi opsi rute.<\/p>\n<style>\r\n\t#baca-juga {\r\n\t\tpadding: 16px;\r\n\t\tbackground-color: #f7eaea;\r\n\t\tborder-left: 3px solid #af2828;\r\n\t\tfont-weight: 500;\r\n\t\tmargin-bottom: 26px;\r\n\t}\r\n\t\r\n\t#baca-juga a {\r\n\t\tcolor: #af2828 !important;\r\n\t\ttransition: all 0.2s ease-in-out;\r\n\t}\r\n\t\r\n\t#baca-juga a:hover {\r\n\t\tcolor: #af282880 !important;\r\n\t}\r\n<\/style>\r\n\r\n<div id=\"baca-juga\">\r\n\t<span>Baca juga: <a href=\"https:\/\/www.hashmicro.com\/id\/blog\/rekomendasi-fleet-management-system\/\">15 Fleet Management System Terbaik Armada Indonesia 2026<\/a><\/span>\r\n<\/div>\n<h2 id=\"variasi-dan-kendala-vrp-dalam-industri\"><strong><span id=\"c\">Variasi dan Kendala VRP dalam Industri<\/span><\/strong><\/h2>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-190121\" src=\"https:\/\/www.hashmicro.com\/id\/blog\/wp-content\/uploads\/2026\/02\/Variasi-dan-Kendala-VRP-dalam-Industri.webp\" alt=\"vehicle routing problem\" width=\"1536\" height=\"1024\" srcset=\"https:\/\/www.hashmicro.com\/id\/blog\/wp-content\/uploads\/2026\/02\/Variasi-dan-Kendala-VRP-dalam-Industri.webp 1536w, https:\/\/www.hashmicro.com\/id\/blog\/wp-content\/uploads\/2026\/02\/Variasi-dan-Kendala-VRP-dalam-Industri-300x200.webp 300w, https:\/\/www.hashmicro.com\/id\/blog\/wp-content\/uploads\/2026\/02\/Variasi-dan-Kendala-VRP-dalam-Industri-1024x683.webp 1024w, https:\/\/www.hashmicro.com\/id\/blog\/wp-content\/uploads\/2026\/02\/Variasi-dan-Kendala-VRP-dalam-Industri-768x512.webp 768w, https:\/\/www.hashmicro.com\/id\/blog\/wp-content\/uploads\/2026\/02\/Variasi-dan-Kendala-VRP-dalam-Industri-630x420.webp 630w, https:\/\/www.hashmicro.com\/id\/blog\/wp-content\/uploads\/2026\/02\/Variasi-dan-Kendala-VRP-dalam-Industri-150x100.webp 150w, https:\/\/www.hashmicro.com\/id\/blog\/wp-content\/uploads\/2026\/02\/Variasi-dan-Kendala-VRP-dalam-Industri-696x464.webp 696w, https:\/\/www.hashmicro.com\/id\/blog\/wp-content\/uploads\/2026\/02\/Variasi-dan-Kendala-VRP-dalam-Industri-1068x712.webp 1068w\" sizes=\"auto, (max-width: 1536px) 100vw, 1536px\" \/><\/p>\n<p>Dalam penerapannya di dunia nyata, VRP jarang sekali muncul dalam bentuk dasarnya. Berbagai kendala operasional menciptakan varian-varian VRP yang lebih spesifik dan kompleks. Memahami varian ini penting bagi manajer logistik untuk memilih model solusi yang paling sesuai dengan kebutuhan bisnis.<\/p>\n<h3>1. Capacitated Vehicle Routing Problem (CVRP)<\/h3>\n<p>CVRP adalah bentuk paling umum di mana setiap kendaraan memiliki batas kapasitas muatan yang tidak boleh dilampaui. Tantangannya ialah menyeimbangkan jarak tempuh dan utilisasi kargo karena rute panjang bermuatan sedikit menaikkan biaya, sedangkan muatan penuh dengan rute buruk mengganggu waktu kirim.<\/p>\n<h3>2. Vehicle Routing Problem with Time Windows (VRPTW)<\/h3>\n<p>VRPTW menambahkan batas waktu layanan sehingga kendaraan harus tiba dalam rentang tertentu. Ada jendela waktu ketat yang tidak boleh dilanggar dan jendela fleksibel dengan penalti keterlambatan, model yang sering dipakai di e-commerce dan pengiriman makanan.<\/p>\n<h3>3. Pickup and Delivery Vehicle Routing Problem (VRPPD)<\/h3>\n<p>Pada varian ini kendaraan tidak hanya mengantar barang tetapi juga mengambil muatan dari lokasi tertentu untuk dibawa ke depot atau tujuan lain. Tantangan utamanya ialah mengatur urutan layanan agar kapasitas kendaraan tetap aman sepanjang perjalanan.<\/p>\n<h3>4. Green Vehicle Routing Problem (GVRP)<\/h3>\n<p>GVRP berfokus pada efisiensi energi dan pengurangan emisi selain sekadar jarak atau waktu tempuh. Rute yang dipilih bisa jadi bukan yang paling pendek, melainkan yang paling hemat bahan bakar atau paling sesuai dengan batas jangkauan kendaraan listrik.<\/p>\n<h2 id=\"dampak-bisnis-dari-optimasi-rute-yang-buruk\"><strong>Dampak Bisnis dari Optimasi Rute yang Buruk<\/strong><\/h2>\n<p>Mengabaikan kompleksitas VRP dan mengandalkan perencanaan rute manual atau intuisi pengemudi dapat menimbulkan konsekuensi serius bagi bisnis. Dampak negatif ini sering kali tidak terlihat secara langsung namun menggerogoti margin keuntungan secara perlahan.<\/p>\n<p>Pertama ialah pembengkakan biaya bahan bakar karena rute tidak efisien membuat jarak tempuh lebih jauh dari seharusnya. Dalam armada besar, selisih beberapa kilometer per kendaraan tiap hari bisa menjadi kerugian besar sekaligus mempercepat keausan mesin dan biaya pemeliharaan.<\/p>\n<p>Kedua adalah penurunan tingkat layanan karena estimasi waktu kedatangan menjadi tidak akurat tanpa sistem perhitungan rute yang tepat. Keterlambatan atau kedatangan di luar jam operasional dapat merusak reputasi perusahaan dan menyebabkan kehilangan kontrak di era pelanggan menuntut transparansi serta kecepatan.<\/p>\n<p>Ketiga ialah ketidakefisienan penggunaan aset karena perencanaan buruk sering membuat perusahaan merasa kekurangan armada padahal utilitas kendaraan rendah. Dengan optimasi rute yang baik, kapasitas distribusi sebenarnya bisa meningkat tanpa perlu menambah kendaraan fisik.<\/p>\n<h2 id=\"algoritma-solusi\"><strong>Pendekatan Algoritma Solusi VRP<\/strong><\/h2>\n<p>Karena VRP adalah masalah yang sangat kompleks secara komputasi, para peneliti dan ahli matematika telah mengembangkan berbagai metode untuk menyelesaikannya. Pendekatan ini berkisar dari perhitungan eksak hingga metode pendekatan yang terinspirasi dari alam.<\/p>\n<h3>1. Metode Eksak (Exact Methods)<\/h3>\n<p>Metode eksak mencari solusi paling optimal secara matematis dengan algoritma seperti Branch and Bound atau Branch and Cut yang menelusuri seluruh kemungkinan rute. Hasilnya sangat akurat, tetapi waktu komputasinya panjang sehingga umumnya hanya cocok untuk kasus kecil dengan jumlah titik terbatas, bukan skala industri besar.<\/p>\n<h3>2. Metode Heuristik (Heuristics)<\/h3>\n<p>Heuristik dirancang untuk menemukan solusi cukup baik dengan cepat tanpa menghitung semua kemungkinan. Contohnya Clarke and Wright Savings Algorithm yang menggabungkan rute terpisah berdasarkan potensi penghematan jarak sehingga efisien dipakai untuk kebutuhan operasional harian meski tidak selalu paling optimal.<\/p>\n<h3>3. Metode Metaheuristik (Metaheuristics)<\/h3>\n<p>Ini adalah pendekatan yang paling populer dalam perangkat lunak optimasi rute modern. Metaheuristik adalah kerangka kerja algoritma yang lebih canggih yang mampu menjelajahi ruang solusi secara luas untuk menghindari jebakan &#8220;lokal optimum&#8221; (solusi yang tampak terbaik di area tertentu, tapi bukan yang terbaik secara keseluruhan). Contoh metaheuristik meliputi:<\/p>\n<ul>\n<li><strong>Algoritma Genetika (Genetic Algorithms):<\/strong> Terinspirasi dari proses evolusi biologis, di mana rute-rute &#8220;dikawinkan&#8221; dan &#8220;dimutasi&#8221; untuk menghasilkan generasi rute baru yang lebih baik.<\/li>\n<li><strong>Optimasi Koloni Semut (Ant Colony Optimization):<\/strong> Meniru perilaku semut dalam mencari jalur terpendek menuju sumber makanan dengan meninggalkan jejak feromon.<\/li>\n<li><strong>Simulated Annealing:<\/strong> Terinspirasi dari proses pendinginan logam dalam metalurgi untuk mencapai struktur kristal yang stabil.<\/li>\n<\/ul>\n<h2 id=\"implementasi-teknologi\"><strong>Peran Teknologi dalam Optimasi Rute<\/strong><\/h2>\n<p>Di era digital, penyelesaian VRP sudah beralih dari kertas ke perangkat lunak canggih yang menggabungkan algoritma rute dengan data real-time. Sistem Manajemen Transportasi modern mampu memproses ribuan pesanan dalam menit sambil menghitung puluhan variabel sekaligus.<\/p>\n<p>Komputasi awan memungkinkan perhitungan berat dijalankan di server jarak jauh sehingga hasil optimasi dapat diakses lewat laptop atau ponsel biasa. Integrasi GPS dan telematika juga memberi pemantauan rute langsung serta penyesuaian otomatis saat terjadi gangguan seperti kecelakaan atau penutupan jalan.<\/p>\n<p>Kecerdasan buatan dan machine learning kini berperan besar karena sistem dapat mempelajari pola lalu lintas, durasi bongkar muat, dan performa pengemudi untuk menghasilkan prediksi jauh lebih akurat dibanding metode statistik klasik. Banyak penyedia solusi teknologi telah mengembangkan modul logistik berbasis prinsip ini untuk membantu perusahaan mencapai efisiensi operasional maksimal.<\/p>\n<h2 id=\"studi-kasus-industri\"><strong>Penerapan VRP di Berbagai Industri<\/strong><\/h2>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-190120\" src=\"https:\/\/www.hashmicro.com\/id\/blog\/wp-content\/uploads\/2026\/02\/Penerapan-VRP-di-Berbagai-Industri.webp\" alt=\"vehicle routing problem\" width=\"1200\" height=\"675\" srcset=\"https:\/\/www.hashmicro.com\/id\/blog\/wp-content\/uploads\/2026\/02\/Penerapan-VRP-di-Berbagai-Industri.webp 1200w, https:\/\/www.hashmicro.com\/id\/blog\/wp-content\/uploads\/2026\/02\/Penerapan-VRP-di-Berbagai-Industri-300x169.webp 300w, https:\/\/www.hashmicro.com\/id\/blog\/wp-content\/uploads\/2026\/02\/Penerapan-VRP-di-Berbagai-Industri-1024x576.webp 1024w, https:\/\/www.hashmicro.com\/id\/blog\/wp-content\/uploads\/2026\/02\/Penerapan-VRP-di-Berbagai-Industri-768x432.webp 768w, https:\/\/www.hashmicro.com\/id\/blog\/wp-content\/uploads\/2026\/02\/Penerapan-VRP-di-Berbagai-Industri-747x420.webp 747w, https:\/\/www.hashmicro.com\/id\/blog\/wp-content\/uploads\/2026\/02\/Penerapan-VRP-di-Berbagai-Industri-150x84.webp 150w, https:\/\/www.hashmicro.com\/id\/blog\/wp-content\/uploads\/2026\/02\/Penerapan-VRP-di-Berbagai-Industri-696x392.webp 696w, https:\/\/www.hashmicro.com\/id\/blog\/wp-content\/uploads\/2026\/02\/Penerapan-VRP-di-Berbagai-Industri-1068x601.webp 1068w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\" \/><\/p>\n<p>Masalah rute kendaraan tidak hanya relevan bagi perusahaan truk atau kurir. Prinsip VRP diterapkan di berbagai sektor dengan karakteristik uniknya masing-masing.<\/p>\n<h3>1. Industri Ritel dan FMCG<\/h3>\n<p><a href=\"https:\/\/www.hashmicro.com\/id\/blog\/fmcg-erp-software\/\">Distribusi barang konsumen yang bergerak cepat (FMCG)<\/a> menuntut pengiriman volume besar dengan frekuensi tinggi karena gudang toko terbatas dan stok harus tersedia tepat waktu dan sering (Just-in-Time). VRP membantu menyeimbangkan beban truk, menjaga ketersediaan produk, dan menekan biaya distribusi per unit.<\/p>\n<h3>2. Manajemen Limbah (Waste Management)<\/h3>\n<p>Pengumpulan sampah merupakan contoh Arc Routing Problem di mana kendaraan harus melayani segmen jalan, bukan titik lokasi. Optimasi rute bertujuan meminimalkan manuver berisiko dan boros bahan bakar sekaligus memastikan seluruh area selesai dilayani dalam satu shift.<\/p>\n<h3>3. Layanan Teknis Lapangan (Field Services)<\/h3>\n<p>Perusahaan layanan teknis menggunakan VRP untuk menjadwalkan teknisi berdasarkan lokasi, keahlian, dan ketersediaan suku cadang. Tantangannya ialah mencocokkan kompetensi dengan jenis masalah serta memastikan kedatangan sesuai janji pelanggan.<\/p>\n<h3>4. Distribusi Makanan dan Rantai Dingin (Cold Chain)<\/h3>\n<p>Pengiriman produk segar atau beku memiliki batasan ketat terkait suhu dan waktu tempuh agar kualitas tetap terjaga. Selain itu, aturan pemisahan jenis produk menambah kompleksitas perencanaan kapasitas dan rute kendaraan.<\/p>\n<h2 id=\"tantangan-implementasi\"><strong>Tantangan dalam Mengimplementasikan Solusi VRP<\/strong><\/h2>\n<p>Meskipun manfaatnya jelas, mengimplementasikan solusi optimasi rute bukanlah proses yang tanpa hambatan. Tantangan sering kali datang dari faktor data, manusia, dan infrastruktur.<\/p>\n<h3>1. Kualitas Data<\/h3>\n<p>Hambatan utama ada pada kualitas data karena algoritma VRP hanya seakurat informasi yang dimasukkan seperti alamat keliru, koordinat meleset, atau kapasitas kendaraan salah akan menghasilkan rute yang tak bisa dijalankan. Karena itu, pembersihan dan validasi master data menjadi tahap awal yang krusial sebelum sistem optimasi diterapkan.<\/p>\n<h3>2. Resistensi Pengemudi<\/h3>\n<p>Penolakan dari pengemudi sering terjadi karena mereka merasa pengalaman lapangan lebih dapat dipercaya daripada rekomendasi sistem. Manajemen perubahan yang efektif, pelatihan, dan komunikasi manfaat seperti pembagian kerja lebih adil serta jadwal pulang lebih pasti diperlukan agar adopsi berjalan lancar.<\/p>\n<h3>3. Dinamika Kondisi Lapangan<\/h3>\n<p>Kondisi tak terduga seperti cuaca buruk, demonstrasi, atau kerusakan kendaraan dapat merusak rencana rute terbaik sekalipun. Karena itu, solusi VRP harus fleksibel dengan kemampuan penyesuaian manual atau perhitungan ulang otomatis selama operasional berlangsung.<\/p>\n<h2 id=\"masa-depan-logistik\"><strong>Masa Depan Optimasi Logistik<\/strong><\/h2>\n<p>Evolusi VRP ke depan akan sangat dipengaruhi teknologi otonom dan tuntutan keberlanjutan yang mengubah cara biaya serta waktu dihitung dalam algoritma. Kendaraan otonom dan drone pengiriman memungkinkan perhitungan jarak bergeser dari Manhattan distance berbasis jalan menjadi Euclidean distance garis lurus.<\/p>\n<p>Model crowdsourced logistics mendorong perusahaan memanfaatkan armada eksternal seperti mitra atau pengemudi lepas untuk menangani lonjakan permintaan secara fleksibel. Karena itu, sistem VRP harus mampu mengintegrasikan kapasitas armada internal dan eksternal secara dinamis dalam satu perencanaan.<\/p>\n<p>Regulasi kota yang makin ketat terkait emisi dan kemacetan akan mempercepat adopsi konsep city logistics dengan pusat konsolidasi mikro dan kendaraan kecil ramah lingkungan untuk last-mile delivery. Algoritma VRP harus menyesuaikan diri dengan model distribusi bertingkat ini agar rute tetap efisien sekaligus patuh regulasi.<\/p>\n<h2 id=\"langkah-implementasi-strategis-dan-metrik-keberhasilan\"><strong>Langkah Implementasi Strategis dan Metrik Keberhasilan<\/strong><\/h2>\n<p>Mengadopsi sistem optimasi rute berbasis VRP bukanlah proses <em>plug-and-play<\/em>. Dibutuhkan pendekatan terstruktur agar teknologi ini dapat diadopsi oleh tim lapangan dan memberikan ROI yang diharapkan. Berikut adalah tahapan implementasi mendalam beserta KPI yang harus dipantau.<\/p>\n<h3>Tahap 1: Audit Data dan Pemetaan Kendala<\/h3>\n<p>Langkah awal adalah membersihkan master data karena algoritma VRP bergantung pada akurasi geolokasi pelanggan, kapasitas armada, dan kecepatan kendaraan. Perusahaan juga harus memetakan semua batasan operasional secara eksplisit, sebab tanpa data bersih sistem hanya menghasilkan rute optimal secara matematis tetapi tidak realistis dijalankan (GIGO).<\/p>\n<h3>Tahap 2: Konfigurasi Algoritma dan Pilot Testing<\/h3>\n<p>Perusahaan harus memilih model algoritma sesuai prioritas bisnis, apakah fokus pada waktu tempuh tercepat atau biaya paling efisien. Uji coba di satu wilayah kecil perlu dilakukan dengan membandingkan hasil sistem dan rute historis dispatcher untuk kalibrasi parameter secara presisi.<\/p>\n<h3>Tahap 3: Manajemen Perubahan dan Pelatihan SDM<\/h3>\n<p>Hambatan implementasi sering berasal dari resistensi pengemudi yang merasa rute sistem tidak logis dibanding pengalaman lapangan mereka. Karena itu pelatihan intensif serta insentif berbasis kepatuhan rute diperlukan agar adopsi berjalan efektif dan manfaat efisiensi benar-benar tercapai.<\/p>\n<h3>Metrik Kunci (KPI) untuk Evaluasi VRP<\/h3>\n<p>Untuk mengukur keberhasilan implementasi, perusahaan harus memantau metrik berikut secara berkala:<\/p>\n<ul>\n<li><strong>Cost per Stop\/Drop:<\/strong> Total biaya transportasi dibagi dengan jumlah titik pengiriman yang berhasil. Penurunan metrik ini menandakan peningkatan densitas rute.<\/li>\n<li><strong>Route Adherence Rate:<\/strong> Persentase kesesuaian antara rute yang direncanakan sistem dengan rute aktual yang ditempuh pengemudi. Angka yang rendah bisa mengindikasikan data peta yang tidak akurat atau perilaku pengemudi yang perlu dikoreksi.<\/li>\n<li><strong>Asset Utilization:<\/strong> Mengukur seberapa penuh <a href=\"https:\/\/www.hashmicro.com\/id\/blog\/fill-rate\/\">kapasitas ruang kargo (<em>fill rate<\/em>)<\/a> dan waktu penggunaan kendaraan. Optimasi VRP yang baik akan mengurangi jumlah armada yang dibutuhkan untuk volume pengiriman yang sama.<\/li>\n<li><strong>On-Time In-Full (OTIF):<\/strong> Persentase pengiriman yang sampai tepat waktu dan lengkap sesuai pesanan. Ini adalah indikator langsung kepuasan pelanggan.<\/li>\n<\/ul>\n<h2 id=\"kesimpulan\"><strong>Kesimpulan<\/strong><\/h2>\n<p>Vehicle Routing Problem merupakan inti efisiensi operasional dalam manajemen transportasi modern karena dampaknya langsung terasa pada biaya dan kepuasan pelanggan. Walau berakar dari teori matematika kompleks, penerapannya telah berkembang menjadi alat strategis untuk keunggulan kompetitif, keberlanjutan, dan inovasi layanan.<\/p>\n<p>Perusahaan yang mampu menyelesaikan optimasi rute secara efektif, baik lewat algoritma canggih maupun perangkat lunak khusus, akan memiliki posisi pasar lebih kuat. Sistem optimasi rute kini bukan lagi pelengkap, melainkan infrastruktur penting bagi bisnis dengan aktivitas distribusi skala menengah hingga besar.<\/p>\n<p>Dengan memahami konsep dasar, varian, dan solusi VRP, pemimpin bisnis dapat membuat keputusan operasional yang lebih presisi. Pengetahuan ini memungkinkan pengelolaan armada yang lebih efisien, adaptif, dan siap menghadapi tuntutan logistik modern.<\/p>\n<a href=\"https:\/\/www.hashmicro.com\/id\/fleet-management?medium=moneysite-banner\" target=\"_blank\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/www.hashmicro.com\/id\/blog\/wp-content\/uploads\/2025\/04\/Fleet.webp\" data-desktop-src=\"https:\/\/www.hashmicro.com\/id\/blog\/wp-content\/uploads\/2025\/04\/Fleet.webp\" data-mobile-src=\"https:\/\/www.hashmicro.com\/id\/blog\/wp-content\/uploads\/2025\/04\/Fleet-2.webp\" alt=\"FleetManagement\" class=\"responsive-image-banner\"><\/a>\r\n\r\n<script>\r\n    \/\/ check which image to use based on screensize\r\n    document.addEventListener(\"DOMContentLoaded\", function() {\r\n        function updateImageSource() {\r\n            var images = document.querySelectorAll('.responsive-image-banner');\r\n            var screenWidth = window.innerWidth;\r\n\r\n            images.forEach(function(img) {\r\n                var mobileSrc = img.getAttribute('data-mobile-src');\r\n                var desktopSrc = img.getAttribute('data-desktop-src');\r\n\r\n                if (screenWidth < 576 && mobileSrc) {\r\n                    img.setAttribute('src', mobileSrc);\r\n                } else {\r\n                    img.setAttribute('src', desktopSrc);\r\n                }\r\n            });\r\n        }\r\n\r\n        \/\/ Initial check\r\n        updateImageSource();\r\n\r\n        \/\/ Update on resize\r\n        window.addEventListener('resize', updateImageSource);\r\n    });\r\n<\/script>\n<h2><strong>Pertanyaan Seputar Anggaran Berimbang<\/strong><\/h2>\n<ul class=\"bottom_faq\">\n<li>\n<details>\n<summary><strong>Apa perbedaan antara Vehicle Routing Problem (VRP) dan Traveling Salesman Problem (TSP)?<\/strong><\/summary>\n<p>TSP berfokus pada satu kendaraan yang harus mengunjungi serangkaian titik dan kembali ke awal dengan jarak terpendek. VRP adalah perluasan dari TSP yang melibatkan armada kendaraan ganda dengan kapasitas terbatas untuk melayani serangkaian pelanggan.<\/p>\n<\/details>\n<\/li>\n<li>\n<details>\n<summary><strong>Mengapa VRP dianggap sebagai masalah NP-hard?<\/strong><\/summary>\n<p>VRP disebut NP-hard karena kompleksitas perhitungannya meningkat secara eksponensial seiring bertambahnya jumlah tujuan. Menemukan solusi optimal yang absolut membutuhkan waktu komputasi yang sangat lama, sehingga sering digunakan metode pendekatan (heuristik).<\/p>\n<\/details>\n<\/li>\n<li>\n<details>\n<summary><strong>Apa itu VRPTW dalam konteks logistik?<\/strong><\/summary>\n<p>VRPTW (Vehicle Routing Problem with Time Windows) adalah varian VRP di mana pengiriman harus dilakukan dalam rentang waktu tertentu yang ditentukan oleh pelanggan, menambah tingkat kesulitan dalam perencanaan rute.<\/p>\n<\/details>\n<\/li>\n<li>\n<details>\n<summary><strong>Bagaimana teknologi membantu menyelesaikan masalah VRP?<\/strong><\/summary>\n<p>Teknologi seperti Transportation Management System (TMS) menggunakan algoritma canggih dan kecerdasan buatan untuk memproses ribuan variabel secara cepat, menghasilkan rute yang lebih efisien dibandingkan perencanaan manual.<\/p>\n<\/details>\n<\/li>\n<li>\n<details>\n<summary><strong>Apa manfaat utama menerapkan solusi VRP bagi bisnis?<\/strong><\/summary>\n<p>Manfaat utamanya meliputi pengurangan biaya bahan bakar, peningkatan utilitas kendaraan, efisiensi waktu kerja pengemudi, dan peningkatan kepuasan pelanggan melalui pengiriman yang lebih tepat waktu.<\/p>\n<\/details>\n<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Pengelola logistik, tim distribusi, dan pemilik bisnis pengiriman menghadapi tekanan besar untuk mengatur rute armada secara efisien. Artikel ini memperkenalkan konsep vehicle routing problem dan menjelaskan mengapa topik ini penting bagi operasional modern. Penentuan rute kendaraan sering terlihat sederhana, tetapi praktiknya melibatkan banyak variabel seperti jarak, waktu, kapasitas, dan prioritas pengiriman. Tanpa metode yang tepat, [&hellip;]<\/p>\n","protected":false},"author":161,"featured_media":190122,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1156],"tags":[],"class_list":{"0":"post-188412","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-transport-management"},"acf":{"post_reviewer":""},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.1 (Yoast SEO v25.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Panduan Vehicle Routing Problem untuk Optimasi Rute Logistik<\/title>\n<meta name=\"description\" content=\"Pelajari apa itu Vehicle Routing Problem hingga manfaatnya dalam meningkatkan efisiensi distribusi dan mengoptimalkan rute pengiriman.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.hashmicro.com\/id\/blog\/vehicle-routing-problem\/\" \/>\n<meta property=\"og:locale\" content=\"id_ID\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Panduan Vehicle Routing Problem untuk Optimasi Rute Logistik\" \/>\n<meta property=\"og:description\" content=\"Pelajari apa itu Vehicle Routing Problem hingga manfaatnya dalam meningkatkan efisiensi distribusi dan mengoptimalkan rute pengiriman.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.hashmicro.com\/id\/blog\/vehicle-routing-problem\/\" \/>\n<meta property=\"og:site_name\" content=\"HashMicro Indonesia\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/hashmicro\" \/>\n<meta property=\"article:published_time\" content=\"2026-03-02T03:56:30+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.hashmicro.com\/id\/blog\/wp-content\/uploads\/2026\/02\/vehicle-routing-problem.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"675\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"Jonathan Kurniawan\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@hashmicro\" \/>\n<meta name=\"twitter:site\" content=\"@hashmicro\" \/>\n<meta name=\"twitter:label1\" content=\"Ditulis oleh\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jonathan Kurniawan\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimasi waktu membaca\" \/>\n\t<meta name=\"twitter:data2\" content=\"14 menit\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.hashmicro.com\/id\/blog\/vehicle-routing-problem\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.hashmicro.com\/id\/blog\/vehicle-routing-problem\/\"},\"author\":{\"name\":\"Jonathan Kurniawan\",\"@id\":\"https:\/\/www.hashmicro.com\/id\/blog\/#\/schema\/person\/029ac06d135cf8424dfa4f3cb3fef6c5\"},\"headline\":\"Panduan Vehicle Routing Problem untuk Optimasi Rute Logistik\",\"datePublished\":\"2026-03-02T03:56:30+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.hashmicro.com\/id\/blog\/vehicle-routing-problem\/\"},\"wordCount\":2312,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.hashmicro.com\/id\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.hashmicro.com\/id\/blog\/vehicle-routing-problem\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.hashmicro.com\/id\/blog\/wp-content\/uploads\/2026\/02\/vehicle-routing-problem.webp\",\"articleSection\":[\"Transport Management\"],\"inLanguage\":\"id\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.hashmicro.com\/id\/blog\/vehicle-routing-problem\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.hashmicro.com\/id\/blog\/vehicle-routing-problem\/\",\"url\":\"https:\/\/www.hashmicro.com\/id\/blog\/vehicle-routing-problem\/\",\"name\":\"Panduan Vehicle Routing Problem untuk Optimasi Rute Logistik\",\"isPartOf\":{\"@id\":\"https:\/\/www.hashmicro.com\/id\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.hashmicro.com\/id\/blog\/vehicle-routing-problem\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.hashmicro.com\/id\/blog\/vehicle-routing-problem\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.hashmicro.com\/id\/blog\/wp-content\/uploads\/2026\/02\/vehicle-routing-problem.webp\",\"datePublished\":\"2026-03-02T03:56:30+00:00\",\"description\":\"Pelajari apa itu Vehicle Routing Problem hingga manfaatnya dalam meningkatkan efisiensi distribusi dan mengoptimalkan rute pengiriman.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.hashmicro.com\/id\/blog\/vehicle-routing-problem\/#breadcrumb\"},\"inLanguage\":\"id\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.hashmicro.com\/id\/blog\/vehicle-routing-problem\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"id\",\"@id\":\"https:\/\/www.hashmicro.com\/id\/blog\/vehicle-routing-problem\/#primaryimage\",\"url\":\"https:\/\/www.hashmicro.com\/id\/blog\/wp-content\/uploads\/2026\/02\/vehicle-routing-problem.webp\",\"contentUrl\":\"https:\/\/www.hashmicro.com\/id\/blog\/wp-content\/uploads\/2026\/02\/vehicle-routing-problem.webp\",\"width\":1200,\"height\":675,\"caption\":\"vehicle routing problem\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.hashmicro.com\/id\/blog\/vehicle-routing-problem\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.hashmicro.com\/id\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Panduan Vehicle Routing Problem untuk Optimasi Rute Logistik\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.hashmicro.com\/id\/blog\/#website\",\"url\":\"https:\/\/www.hashmicro.com\/id\/blog\/\",\"name\":\"HashMicro Indonesia\",\"description\":\"Blog Software Manajemen Bisnis Indonesia #1\",\"publisher\":{\"@id\":\"https:\/\/www.hashmicro.com\/id\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.hashmicro.com\/id\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"id\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.hashmicro.com\/id\/blog\/#organization\",\"name\":\"HashMicro Indonesia\",\"url\":\"https:\/\/www.hashmicro.com\/id\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"id\",\"@id\":\"https:\/\/www.hashmicro.com\/id\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.hashmicro.com\/id\/blog\/wp-content\/uploads\/2023\/11\/hashmicro-logo-blog.webp\",\"contentUrl\":\"https:\/\/www.hashmicro.com\/id\/blog\/wp-content\/uploads\/2023\/11\/hashmicro-logo-blog.webp\",\"width\":924,\"height\":121,\"caption\":\"HashMicro Indonesia\"},\"image\":{\"@id\":\"https:\/\/www.hashmicro.com\/id\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/hashmicro\",\"https:\/\/x.com\/hashmicro\",\"https:\/\/www.linkedin.com\/company\/hashmicro\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.hashmicro.com\/id\/blog\/#\/schema\/person\/029ac06d135cf8424dfa4f3cb3fef6c5\",\"name\":\"Jonathan Kurniawan\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"id\",\"@id\":\"https:\/\/www.hashmicro.com\/id\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.hashmicro.com\/id\/blog\/wp-content\/uploads\/2025\/10\/Jonathan-Kurniawan-3-96x96.webp\",\"contentUrl\":\"https:\/\/www.hashmicro.com\/id\/blog\/wp-content\/uploads\/2025\/10\/Jonathan-Kurniawan-3-96x96.webp\",\"caption\":\"Jonathan Kurniawan\"},\"description\":\"Jonathan adalah seorang praktisi dalam bidang procurement, TMS, dan supply chain dengan pengalaman 5 tahun. Spesialis dalam mengulas topik seputar manajemen vendor, budget control procurement, otomatisasi proses pengadaan barang, dan analisis procurement. Tulisannya secara konsisten mendukung pengambilan keputusan bisnis yang lebih strategis.\",\"sameAs\":[\"https:\/\/www.hashmicro.com\/id\/\"],\"gender\":\"laki-laki\",\"knowsAbout\":[\"procurement\",\"pengadaan\",\"pembelian\"],\"knowsLanguage\":[\"Inggris\",\"Indonesia\"],\"jobTitle\":\"Senior Content Writer\",\"url\":\"https:\/\/www.hashmicro.com\/id\/blog\/author\/jonathankurniawan\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Panduan Vehicle Routing Problem untuk Optimasi Rute Logistik","description":"Pelajari apa itu Vehicle Routing Problem hingga manfaatnya dalam meningkatkan efisiensi distribusi dan mengoptimalkan rute pengiriman.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.hashmicro.com\/id\/blog\/vehicle-routing-problem\/","og_locale":"id_ID","og_type":"article","og_title":"Panduan Vehicle Routing Problem untuk Optimasi Rute Logistik","og_description":"Pelajari apa itu Vehicle Routing Problem hingga manfaatnya dalam meningkatkan efisiensi distribusi dan mengoptimalkan rute pengiriman.","og_url":"https:\/\/www.hashmicro.com\/id\/blog\/vehicle-routing-problem\/","og_site_name":"HashMicro Indonesia","article_publisher":"https:\/\/www.facebook.com\/hashmicro","article_published_time":"2026-03-02T03:56:30+00:00","og_image":[{"width":1200,"height":675,"url":"https:\/\/www.hashmicro.com\/id\/blog\/wp-content\/uploads\/2026\/02\/vehicle-routing-problem.webp","type":"image\/webp"}],"author":"Jonathan Kurniawan","twitter_card":"summary_large_image","twitter_creator":"@hashmicro","twitter_site":"@hashmicro","twitter_misc":{"Ditulis oleh":"Jonathan Kurniawan","Estimasi waktu membaca":"14 menit"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.hashmicro.com\/id\/blog\/vehicle-routing-problem\/#article","isPartOf":{"@id":"https:\/\/www.hashmicro.com\/id\/blog\/vehicle-routing-problem\/"},"author":{"name":"Jonathan Kurniawan","@id":"https:\/\/www.hashmicro.com\/id\/blog\/#\/schema\/person\/029ac06d135cf8424dfa4f3cb3fef6c5"},"headline":"Panduan Vehicle Routing Problem untuk Optimasi Rute Logistik","datePublished":"2026-03-02T03:56:30+00:00","mainEntityOfPage":{"@id":"https:\/\/www.hashmicro.com\/id\/blog\/vehicle-routing-problem\/"},"wordCount":2312,"commentCount":0,"publisher":{"@id":"https:\/\/www.hashmicro.com\/id\/blog\/#organization"},"image":{"@id":"https:\/\/www.hashmicro.com\/id\/blog\/vehicle-routing-problem\/#primaryimage"},"thumbnailUrl":"https:\/\/www.hashmicro.com\/id\/blog\/wp-content\/uploads\/2026\/02\/vehicle-routing-problem.webp","articleSection":["Transport Management"],"inLanguage":"id","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.hashmicro.com\/id\/blog\/vehicle-routing-problem\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.hashmicro.com\/id\/blog\/vehicle-routing-problem\/","url":"https:\/\/www.hashmicro.com\/id\/blog\/vehicle-routing-problem\/","name":"Panduan Vehicle Routing Problem untuk Optimasi Rute Logistik","isPartOf":{"@id":"https:\/\/www.hashmicro.com\/id\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.hashmicro.com\/id\/blog\/vehicle-routing-problem\/#primaryimage"},"image":{"@id":"https:\/\/www.hashmicro.com\/id\/blog\/vehicle-routing-problem\/#primaryimage"},"thumbnailUrl":"https:\/\/www.hashmicro.com\/id\/blog\/wp-content\/uploads\/2026\/02\/vehicle-routing-problem.webp","datePublished":"2026-03-02T03:56:30+00:00","description":"Pelajari apa itu Vehicle Routing Problem hingga manfaatnya dalam meningkatkan efisiensi distribusi dan mengoptimalkan rute pengiriman.","breadcrumb":{"@id":"https:\/\/www.hashmicro.com\/id\/blog\/vehicle-routing-problem\/#breadcrumb"},"inLanguage":"id","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.hashmicro.com\/id\/blog\/vehicle-routing-problem\/"]}]},{"@type":"ImageObject","inLanguage":"id","@id":"https:\/\/www.hashmicro.com\/id\/blog\/vehicle-routing-problem\/#primaryimage","url":"https:\/\/www.hashmicro.com\/id\/blog\/wp-content\/uploads\/2026\/02\/vehicle-routing-problem.webp","contentUrl":"https:\/\/www.hashmicro.com\/id\/blog\/wp-content\/uploads\/2026\/02\/vehicle-routing-problem.webp","width":1200,"height":675,"caption":"vehicle routing problem"},{"@type":"BreadcrumbList","@id":"https:\/\/www.hashmicro.com\/id\/blog\/vehicle-routing-problem\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.hashmicro.com\/id\/blog\/"},{"@type":"ListItem","position":2,"name":"Panduan Vehicle Routing Problem untuk Optimasi Rute Logistik"}]},{"@type":"WebSite","@id":"https:\/\/www.hashmicro.com\/id\/blog\/#website","url":"https:\/\/www.hashmicro.com\/id\/blog\/","name":"HashMicro Indonesia","description":"Blog Software Manajemen Bisnis Indonesia #1","publisher":{"@id":"https:\/\/www.hashmicro.com\/id\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.hashmicro.com\/id\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"id"},{"@type":"Organization","@id":"https:\/\/www.hashmicro.com\/id\/blog\/#organization","name":"HashMicro Indonesia","url":"https:\/\/www.hashmicro.com\/id\/blog\/","logo":{"@type":"ImageObject","inLanguage":"id","@id":"https:\/\/www.hashmicro.com\/id\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.hashmicro.com\/id\/blog\/wp-content\/uploads\/2023\/11\/hashmicro-logo-blog.webp","contentUrl":"https:\/\/www.hashmicro.com\/id\/blog\/wp-content\/uploads\/2023\/11\/hashmicro-logo-blog.webp","width":924,"height":121,"caption":"HashMicro Indonesia"},"image":{"@id":"https:\/\/www.hashmicro.com\/id\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/hashmicro","https:\/\/x.com\/hashmicro","https:\/\/www.linkedin.com\/company\/hashmicro"]},{"@type":"Person","@id":"https:\/\/www.hashmicro.com\/id\/blog\/#\/schema\/person\/029ac06d135cf8424dfa4f3cb3fef6c5","name":"Jonathan Kurniawan","image":{"@type":"ImageObject","inLanguage":"id","@id":"https:\/\/www.hashmicro.com\/id\/blog\/#\/schema\/person\/image\/","url":"https:\/\/www.hashmicro.com\/id\/blog\/wp-content\/uploads\/2025\/10\/Jonathan-Kurniawan-3-96x96.webp","contentUrl":"https:\/\/www.hashmicro.com\/id\/blog\/wp-content\/uploads\/2025\/10\/Jonathan-Kurniawan-3-96x96.webp","caption":"Jonathan Kurniawan"},"description":"Jonathan adalah seorang praktisi dalam bidang procurement, TMS, dan supply chain dengan pengalaman 5 tahun. Spesialis dalam mengulas topik seputar manajemen vendor, budget control procurement, otomatisasi proses pengadaan barang, dan analisis procurement. Tulisannya secara konsisten mendukung pengambilan keputusan bisnis yang lebih strategis.","sameAs":["https:\/\/www.hashmicro.com\/id\/"],"gender":"laki-laki","knowsAbout":["procurement","pengadaan","pembelian"],"knowsLanguage":["Inggris","Indonesia"],"jobTitle":"Senior Content Writer","url":"https:\/\/www.hashmicro.com\/id\/blog\/author\/jonathankurniawan\/"}]}},"focus_keyword":"vehicle routing problem","order_j":"","_links":{"self":[{"href":"https:\/\/www.hashmicro.com\/id\/blog\/wp-json\/wp\/v2\/posts\/188412","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.hashmicro.com\/id\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.hashmicro.com\/id\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.hashmicro.com\/id\/blog\/wp-json\/wp\/v2\/users\/161"}],"replies":[{"embeddable":true,"href":"https:\/\/www.hashmicro.com\/id\/blog\/wp-json\/wp\/v2\/comments?post=188412"}],"version-history":[{"count":1,"href":"https:\/\/www.hashmicro.com\/id\/blog\/wp-json\/wp\/v2\/posts\/188412\/revisions"}],"predecessor-version":[{"id":190130,"href":"https:\/\/www.hashmicro.com\/id\/blog\/wp-json\/wp\/v2\/posts\/188412\/revisions\/190130"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.hashmicro.com\/id\/blog\/wp-json\/wp\/v2\/media\/190122"}],"wp:attachment":[{"href":"https:\/\/www.hashmicro.com\/id\/blog\/wp-json\/wp\/v2\/media?parent=188412"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.hashmicro.com\/id\/blog\/wp-json\/wp\/v2\/categories?post=188412"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.hashmicro.com\/id\/blog\/wp-json\/wp\/v2\/tags?post=188412"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}