<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: ibrahim ethem demirci</title>
    <description>The latest articles on DEV Community by ibrahim ethem demirci (@iedmrc).</description>
    <link>https://dev.to/iedmrc</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F212283%2Fbdbf5cc0-ef12-494e-ba95-195f950d592e.jpeg</url>
      <title>DEV Community: ibrahim ethem demirci</title>
      <link>https://dev.to/iedmrc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/iedmrc"/>
    <language>en</language>
    <item>
      <title>Awesome Docker Compose</title>
      <dc:creator>ibrahim ethem demirci</dc:creator>
      <pubDate>Wed, 04 Sep 2019 21:21:05 +0000</pubDate>
      <link>https://dev.to/iedmrc/awesome-docker-compose-4l6a</link>
      <guid>https://dev.to/iedmrc/awesome-docker-compose-4l6a</guid>
      <description>&lt;p&gt;I created a docker-compose files repository on Github, named as &lt;em&gt;Awesome Docker Compose&lt;/em&gt;. Run a well-prepared applications stack with just a single command. Any contributions are welcome! Let your precious hidden stack help the community!&lt;/p&gt;

&lt;p&gt;Check it on &lt;a href="https://github.com/iedmrc/awesome-docker-compose"&gt;here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>dockercompose</category>
      <category>awesome</category>
    </item>
    <item>
      <title>Galois: An auto-completer for code editors based on OpenAI GPT-2.</title>
      <dc:creator>ibrahim ethem demirci</dc:creator>
      <pubDate>Thu, 15 Aug 2019 09:40:18 +0000</pubDate>
      <link>https://dev.to/iedmrc/galois-an-auto-completer-for-code-editors-based-on-openai-gpt-2-40oh</link>
      <guid>https://dev.to/iedmrc/galois-an-auto-completer-for-code-editors-based-on-openai-gpt-2-40oh</guid>
      <description>&lt;p&gt;Today I introduce &lt;a href=""&gt;&lt;strong&gt;Galois&lt;/strong&gt;&lt;/a&gt; (/ɡælˈwɑː/) which is an open-source auto code completer based on OpenAI GPT-2 .&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Galois&lt;/strong&gt; is trained (finetuned) on a curated list of approximately 45K Python (~470MB) files gathered from the Github. Currently, it just works properly on Python but not bad at other languages (thanks to GPT-2's power).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fiedmrc%2Fgalois-autocompleter%2Fmaster%2Fimg%2Fpython1.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fiedmrc%2Fgalois-autocompleter%2Fmaster%2Fimg%2Fpython1.gif" alt="Galois demo GIF"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With this project, I aim to create a &lt;strong&gt;Deep Learning Based Auto-completer&lt;/strong&gt; such that anyone can run it on their own computer easily. I originally inspired by TabNine but wanted to make &lt;strong&gt;Galois&lt;/strong&gt; can be run on endusers computer, freely (as in freedom). Thus anyone (especially developers) can benefit from state-of-the-art NLP technologies freely without sharing the codes (or texts) with a server. To fulfill this purpose we need to do the same what &lt;a href="https://paperswithcode.com/paper/efficientnet-rethinking-model-scaling-for" rel="noopener noreferrer"&gt;EfficientNet&lt;/a&gt; did to achieve state-of-the-art results in many datasets. For now, &lt;strong&gt;Galois&lt;/strong&gt; trained on GPT-2 345M without developing such an efficient deep learning model. Check the &lt;a href="https://github.com/iedmrc/galois-autocompleter#planned-works" rel="noopener noreferrer"&gt;planned works&lt;/a&gt; here for the future of &lt;strong&gt;Galois&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You can try it on &lt;a href="https://usegalois.com/" rel="noopener noreferrer"&gt;usegalois.com&lt;/a&gt;. It is licensed under MIT, so you can find the trained model, codes and some instructions on &lt;a href="https://github.com/iedmrc/galois-autocompleter" rel="noopener noreferrer"&gt;github.com/iedmrc/galois-autocompleter&lt;/a&gt; for &lt;strong&gt;Galois&lt;/strong&gt;, and on &lt;a href="https://github.com/iedmrc/galois-web" rel="noopener noreferrer"&gt;github.com/iedmrc/galois-web&lt;/a&gt; for the online editor. Check the link &lt;a href="https://gist.github.com/iedmrc/1e41197a6a2f7a9a654a0df9bd932290" rel="noopener noreferrer"&gt;here&lt;/a&gt; for the &lt;code&gt;docker-compose&lt;/code&gt; file .&lt;/p&gt;

&lt;p&gt;Any contributions are welcome. The technology behind the &lt;strong&gt;Galois&lt;/strong&gt; has been developed by the community for many years. So clearly we can say that it belongs to the community.&lt;/p&gt;

&lt;p&gt;To democratize the AI, let's spread the word to the world! Have it, use it, contribute to it, share it!&lt;/p&gt;

&lt;p&gt;With respect to &lt;a href="https://en.wikipedia.org/wiki/%C3%89variste_Galois" rel="noopener noreferrer"&gt;Évariste Galois&lt;/a&gt; ([evaʁist ɡalwa]).&lt;/p&gt;

</description>
      <category>deeplearning</category>
      <category>machinelearning</category>
      <category>gpt</category>
      <category>codecompletion</category>
    </item>
    <item>
      <title>Vehicle Routing Problems And How To Solve Them</title>
      <dc:creator>ibrahim ethem demirci</dc:creator>
      <pubDate>Wed, 14 Aug 2019 14:45:50 +0000</pubDate>
      <link>https://dev.to/iedmrc/vehicle-routing-problems-and-how-to-solve-them-8h3</link>
      <guid>https://dev.to/iedmrc/vehicle-routing-problems-and-how-to-solve-them-8h3</guid>
      <description>&lt;h1&gt;
  
  
  Vehicle Routing Problems
&lt;/h1&gt;




&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Vehicle_routing_problem" rel="noopener noreferrer"&gt;Vehicle routing problems (VRP)&lt;/a&gt; are essential in logistics. As the name suggests, vehicle routing problems come to exist when we have &lt;strong&gt;&lt;em&gt;N vehicle&lt;/em&gt;&lt;/strong&gt; to visit &lt;strong&gt;&lt;em&gt;M nodes&lt;/em&gt;&lt;/strong&gt; on any map. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2F2%2F2b%2FFigure_illustrating_the_vehicle_routing_problem.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2F2%2F2b%2FFigure_illustrating_the_vehicle_routing_problem.png" title="A figure illustrating the vehicle routing problem - Wikipedia" alt="A figure illustrating the vehicle routing problem - Wikipedia"&gt;&lt;/a&gt; &lt;br&gt;
&lt;em&gt;A figure illustrating the vehicle routing problem&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We could say VRPs are a subset of &lt;a href="https://en.wikipedia.org/wiki/Travelling_salesman_problem" rel="noopener noreferrer"&gt;Traveling Salesman Problem (TSP)&lt;/a&gt;. In general, it looks like that:&lt;/p&gt;

&lt;p&gt;CVRP, VRPTW ⊆ SVRP, DVRP ⊆ VRP ⊆ TSP ⊆ Graph Theory&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CVRP&lt;/strong&gt;: If you have vehicles restricted by any capacity (e.g. max loading limit) constraint, then we call it &lt;em&gt;Capacitated Vehicle Routing Problem (CVRP)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;VRPTW&lt;/strong&gt;: If you have vehicles restricted with working times, then we call it &lt;em&gt;Vehicle Routing Problem with Time Windows (VRPTW)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SVRP&lt;/strong&gt;: If the visiting points (nodes) are given, then we call it &lt;em&gt;Static Vehicle Routing Problem&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DVRP&lt;/strong&gt;: If the visiting points (nodes) come to exist while trying to solve or moving on the map, then we call it &lt;em&gt;Dynamic Vehicle Routing Problem&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Confused ? 🤔&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2F2%2F29%2FMap_of_vrp_subproblems.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2F2%2F29%2FMap_of_vrp_subproblems.jpg" title="A map showing the relationship between common VRP subproblems. - Wikipedia" alt="A map showing the relationship between common VRP subproblems. - Wikipedia"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is a map showing the relationship between common VRP subproblems, from Wikipedia.&lt;/p&gt;
&lt;h1&gt;
  
  
  Graph Theory and VRP Solvers
&lt;/h1&gt;



&lt;p&gt;The leading actor is &lt;em&gt;Graph Theory&lt;/em&gt;. It all started with the "&lt;em&gt;The Seven Bridges of Königsberg&lt;/em&gt;"  &lt;a href="https://en.wikipedia.org/wiki/Seven_Bridges_of_K%C3%B6nigsberg" rel="noopener noreferrer"&gt;question&lt;/a&gt; being asked to Euler.&lt;br&gt;
Today we ask more sophisticated questions such as "&lt;em&gt;How are all packages delivered to their addresses in the most efficient way?&lt;/em&gt;".&lt;/p&gt;

&lt;p&gt;There are many ways to solve a VRP. &lt;strong&gt;&lt;em&gt;Heuristics&lt;/em&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;em&gt;Constructive Methods&lt;/em&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;em&gt;2-Phase Algorithms&lt;/em&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;em&gt;Metaheuristics&lt;/em&gt;&lt;/strong&gt; and more are general methods for VRPs. See &lt;a href="http://neo.lcc.uma.es/vrp/solution-methods/" rel="noopener noreferrer"&gt;here&lt;/a&gt;  for more information.&lt;/p&gt;

&lt;p&gt;Today we have enough compute power to run iterative solutions or optimizers that take long times while solving VRPs with computers.&lt;/p&gt;
&lt;h1&gt;
  
  
  Real World Map, Routes and Solving on
&lt;/h1&gt;


&lt;h2&gt;
  
  
  Open Street Map
&lt;/h2&gt;

&lt;p&gt;So far we have described the problem and introduced some solutions but what about the roads &amp;amp; routes on the real world map? One can think about &lt;em&gt;Google Maps&lt;/em&gt;, &lt;em&gt;Yandex Maps&lt;/em&gt;, &lt;em&gt;HERE Maps&lt;/em&gt; etc.. They are all good but also commercial. Thanks to  &lt;a href="https://wiki.openstreetmap.org/wiki/Main_Page" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;em&gt;OpenStreetMap (OSM)&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt; and the community, we have a very big and useful real world map updated every week.&lt;/p&gt;
&lt;h2&gt;
  
  
  Open Source Routing Machine
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;OpenStreetMap&lt;/em&gt; just provides the real world map, not routes and therefore we need something else to give us the routes, distances, durations etc.. Oh, what's that  &lt;a href="http://map.project-osrm.org/" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;em&gt;Open Source Routing Machine (OSRM)&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;? You guess right, we love free (as in freedom) software! &lt;strong&gt;&lt;em&gt;OSRM&lt;/em&gt;&lt;/strong&gt; uses &lt;em&gt;OpenStreetMap&lt;/em&gt; as (map) backend and has the following features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nearest&lt;/strong&gt; - Snaps coordinates to the street network and returns the nearest matches&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Route&lt;/strong&gt; - Finds the fastest route between coordinates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Table&lt;/strong&gt; - Computes the duration or distances of the fastest route between all pairs of supplied coordinates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Match&lt;/strong&gt; - Snaps noisy GPS traces to the road network in the most plausible way&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trip&lt;/strong&gt; - Solves the Traveling Salesman Problem using a greedy heuristic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tile&lt;/strong&gt; - Generates Mapbox Vector Tiles with internal routing metadata&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now we can fetch the routes between all the nodes and then run a VRP solver algorithm to have optimized (the fastest or the shortest) sequence of routes of nodes. &lt;/p&gt;

&lt;p&gt;But wait! Send me more open source, please! 😂&lt;/p&gt;
&lt;h2&gt;
  
  
  Vehicle Routing Open-source Optimization Machine
&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://vroom-project.org" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;em&gt;Vehicle Routing Open-source Optimization Machine (VROOM)&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt; is a VRP solver. It uses OSRM or  &lt;a href="https://openrouteservice.org/" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;em&gt;OpenRouteService (OSR)&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt; as backend to get routes and returns solutions for &lt;em&gt;CVRP&lt;/em&gt;, &lt;em&gt;VRPTW&lt;/em&gt;, &lt;em&gt;CVRPTW&lt;/em&gt; problems. It also has a nice UI (frontend) to show vehicles, nodes and routes on the map.&lt;/p&gt;

&lt;p&gt;You should note that VROOM's objective is optimizing the &lt;em&gt;overall duration&lt;/em&gt;, not the &lt;em&gt;overall distance&lt;/em&gt;. Hence you might need to find another open source solution or write your own in order to calculate the shortest path.&lt;/p&gt;
&lt;h1&gt;
  
  
  Talk is Cheap Show Me the Code!
&lt;/h1&gt;


&lt;h2&gt;
  
  
  Preparing Dependencies in the Traditional Way
&lt;/h2&gt;

&lt;p&gt;That means, without docker. I suggest you jump to the non-traditional.&lt;/p&gt;
&lt;h3&gt;
  
  
  Running OSRM With an OSM Map
&lt;/h3&gt;

&lt;p&gt;To build OSRM for your OS and architecture follow  &lt;a href="https://github.com/Project-OSRM/osrm-backend/wiki/Building-OSRM" rel="noopener noreferrer"&gt;this guide&lt;/a&gt; .&lt;/p&gt;

&lt;p&gt;Then, you need to download an OSM map and process it for OSRM. Next, you can run the OSRM backend. Follow &lt;a href="https://github.com/Project-OSRM/osrm-backend/wiki/Running-OSRM" rel="noopener noreferrer"&gt;this guide&lt;/a&gt; to achieve them all.&lt;/p&gt;
&lt;h3&gt;
  
  
  Running VROOM Backend and Exposing the API
&lt;/h3&gt;

&lt;p&gt;Clone and build VROOM according to &lt;a href="https://github.com/VROOM-Project/vroom/wiki/Building" rel="noopener noreferrer"&gt;this guide&lt;/a&gt;. Make sure you have &lt;code&gt;vroom&lt;/code&gt; binary in your path (environment variable).&lt;/p&gt;

&lt;p&gt;Thus far, we had a routing machine (OSRM) with a map (OSM), and a VRP solver (VROOM) which uses them. We can call VROOM with proper parameters through CLI and have the calculated result. However, it is easier to interact with VROOM via the &lt;a href="https://github.com/VROOM-Project/vroom-express" rel="noopener noreferrer"&gt;Node.js HTTP API&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Okay then, let's install and run &lt;em&gt;VROOM Express.js API&lt;/em&gt;. It is very easy. Just clone the repository and follow the guide &lt;a href="https://github.com/VROOM-Project/vroom-express" rel="noopener noreferrer"&gt;here&lt;/a&gt;. One caveat: Don't forget to configure via &lt;code&gt;config.js&lt;/code&gt;, before running. You might want to change the &lt;code&gt;MAX_JOBS&lt;/code&gt;, &lt;code&gt;MAX_VEHICLES&lt;/code&gt;, &lt;code&gt;PORT&lt;/code&gt; or &lt;code&gt;routingServers&lt;/code&gt; values.&lt;/p&gt;
&lt;h2&gt;
  
  
  Preparing Dependencies via Docker
&lt;/h2&gt;

&lt;p&gt;First, download an OSM map and process it with dockerized OSRM through &lt;a href="https://github.com/Project-OSRM/osrm-backend#using-docker" rel="noopener noreferrer"&gt;this simple guide&lt;/a&gt;. But don't run the OSRM as in the last command. Because from now on, we'll use &lt;code&gt;docker-compose&lt;/code&gt; with the following compose file:&lt;/p&gt;

&lt;p&gt;%[&lt;a href="https://gist.github.com/iedmrc/51d02fefa9e3ee91a5608c02c452c965" rel="noopener noreferrer"&gt;https://gist.github.com/iedmrc/51d02fefa9e3ee91a5608c02c452c965&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;Adjust the &lt;code&gt;command&lt;/code&gt; and &lt;code&gt;volume&lt;/code&gt; parameters to your own. If you wish to edit config files of VROOM backend, clone &lt;a href="https://github.com/iedmrc/vroom-docker" rel="noopener noreferrer"&gt;this repository&lt;/a&gt; and build your own image. You can do the same for VROOM frontend by cloning &lt;a href="https://github.com/iedmrc/vroom-frontend-docker" rel="noopener noreferrer"&gt;this repository&lt;/a&gt;. These repositories are the images I prepared for VROOM backend and frontend. I recommend you to review them.&lt;/p&gt;

&lt;p&gt;Fire it up!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker-compose up -d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One caveat: If you use &lt;em&gt;Docker for Mac&lt;/em&gt;, you may need to increase the default Docker resources. I have reserved the following resources for Docker:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPUs: 4&lt;/li&gt;
&lt;li&gt;Memory: 6 GiB&lt;/li&gt;
&lt;li&gt;Swap: 2.0 GiB&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Links to docker files:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VROOM backend docker repository: &lt;a href="https://github.com/iedmrc/vroom-docker" rel="noopener noreferrer"&gt;https://github.com/iedmrc/vroom-docker&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;VROOM frontend docker repository: &lt;a href="https://github.com/iedmrc/vroom-frontend-docker" rel="noopener noreferrer"&gt;https://github.com/iedmrc/vroom-frontend-docker&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Solving VRP via Direct API Request
&lt;/h2&gt;

&lt;p&gt;Now you can have the VRP solved by making a request to VROOM Express API with a JSON payload attached according to &lt;a href="https://github.com/VROOM-Project/vroom/blob/master/docs/API.md" rel="noopener noreferrer"&gt;this API guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;An example request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl 'http://localhost:3000/' -H 'Content-type: application/json' --data-binary \
'{ "jobs": [ { "id": 1613, "service": 1200, "amount": [ 1 ], "location": [ 29.02988, 40.99423 ] }, { "id": 1665, "service": 1200, "amount": [ 1 ], "location": [ 29.216, 41.008520000000004 ] }, { "id": 21234, "service": 900, "amount": [ 1 ], "location": [ 29.272640000000003, 40.94765 ] }, { "id": 23457, "service": 600, "amount": [ 1 ], "location": [ 29.119659999999996, 40.97359 ] }, { "id": 24145, "service": 900, "amount": [ 1 ], "location": [ 29.16579, 40.925540000000005 ] }, { "id": 33007, "service": 900, "amount": [ 1 ], "location": [ 29.123801, 40.978068 ] }, { "id": 38081, "service": 600, "amount": [ 1 ], "location": [ 29.113429999999997, 40.980259999999994 ] }, { "id": 39163, "service": 900, "amount": [ 1 ], "location": [ 29.25528, 40.87539 ] } ], "vehicles": [ { "id": 7, "start": [ 29.208498, 40.890795 ], "end": [ 29.208498, 40.890795 ], "capacity": [ 25 ], "time_window": [ 30600, 61200 ], "startDescription": "Start", "endDescription": "End" } ], "options": { "g": true }}' --compressed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "code": 0,
  "summary": {
    "cost": 4387,
    "unassigned": 0,
    "amount": [8],
    "service": 7200,
    "duration": 4387,
    "waiting_time": 0,
    "distance": 72452,
    "computing_times": {"loading": 28,"solving": 4,"routing": 10}
  },
  "unassigned": [],
  "routes": [{
      "vehicle": 7,
      "cost": 4387,
      "amount": [8],
      "service": 7200,
      "duration": 4387,
      "waiting_time": 0,
      "distance": 72452,
      "steps": [{
          "type": "start",
          "location": [29.208498,40.890795],
          "arrival": 30600,
          "duration": 0,
          "distance": 0
        },{
          "type": "job",
          "location": [29.16579,40.925540000000005],
          "job": 24145,
          "service": 900,
          "waiting_time": 0,
          "arrival": 31064,
          "duration": 464,
          "distance": 8110
        },{
          "type": "job",
          "location": [29.02988,40.99423],
          "job": 1613,
          "service": 1200,
          "waiting_time": 0,
          "arrival": 32854,
          "duration": 1354,
          "distance": 25277
        },{
          "type": "job",
          "location": [29.113429999999997,40.980259999999994],
          "job": 38081,
          "service": 600,
          "waiting_time": 0,
          "arrival": 34586,
          "duration": 1886,
          "distance": 34414
        },{
          "type": "job",
          "location": [29.123801,40.978068],
          "job": 33007,
          "service": 900,
          "waiting_time": 0,
          "arrival": 35260,
          "duration": 1960,
          "distance": 35539
        },{
          "type": "job",
          "location": [29.119659999999996,40.97359],
          "job": 23457,
          "service": 600,
          "waiting_time": 0,
          "arrival": 36215,
          "duration": 2015,
          "distance": 36533
        },{
          "type": "job",
          "location": [29.216,41.00852],
          "job": 1665,
          "service": 1200,
          "waiting_time": 0,
          "arrival": 37454,
          "duration": 2654,
          "distance": 47712
        },{
          "type": "job",
          "location": [29.272640000000003,40.94765],
          "job": 21234,
          "service": 900,
          "waiting_time": 0,
          "arrival": 39281,
          "duration": 3281,
          "distance": 57059
        },{
          "type": "job",
          "location": [29.25528,40.87539],
          "job": 39163,
          "service": 900,
          "waiting_time": 0,
          "arrival": 41007,
          "duration": 4107,
          "distance": 67891
        },{
          "type": "end",
          "location": [29.208498,40.890795],
          "arrival": 42187,
          "duration": 4387,
          "distance": 72452
        }
      ]}
  ]}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Solving VRP via Frontend
&lt;/h2&gt;

&lt;p&gt;If you have run the VROOM frontend either via &lt;code&gt;docker-compose&lt;/code&gt; or via compiling manually, by uploading the JSON you prepared, you can make VROOM solve the VRP.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1559256825172%2FI4vq18w7D.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1559256825172%2FI4vq18w7D.png" title="A screenshot of VROOM frontend" alt="A screenshot of VROOM frontend"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;A screenshot of VROOM frontend&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Final Overview
&lt;/h1&gt;




&lt;ol&gt;
&lt;li&gt;Download an OSM map &lt;a href="http://download.geofabrik.de" rel="noopener noreferrer"&gt;here&lt;/a&gt; (or wherever you want).&lt;/li&gt;
&lt;li&gt;Build OSRM binaries and process .osm file with &lt;a href="https://github.com/Project-OSRM/osrm-backend#using-docker" rel="noopener noreferrer"&gt;docker&lt;/a&gt; or as described  &lt;a href="https://github.com/Project-OSRM/osrm-backend/wiki/Running-OSRM" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Build VROOM binary and make sure it is in the path.&lt;/li&gt;
&lt;li&gt;Run OSRM HTTP Server to listen port 5000 (or whichever you want).&lt;/li&gt;
&lt;li&gt;Configure VROOM Express.js API to use the VROOM binary at the path, and to connect to OSRM HTTP Server via the port it listens. &lt;/li&gt;
&lt;li&gt;Run the VROOM Express.js API to listen port 3000 (or whichever you want).&lt;/li&gt;
&lt;li&gt;Make a JSON file as described &lt;a href="https://github.com/VROOM-Project/vroom/blob/master/docs/API.md" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Make HTTP request to VROOM Express.js with the JSON file you prepared.&lt;/li&gt;
&lt;li&gt;[Optional] Configure VROOM frontend to connect to VROOM Express.js API and run it to listen port 9966 (or whichever you want).&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  In conclusion
&lt;/h1&gt;




&lt;p&gt;Vehicle routing problems are a very valuable and still active area of research, especially in logistics. The community has good solutions for it. Here we combined them and solved the problem. &lt;/p&gt;

&lt;p&gt;If you have any questions, feel free to ask! And please spread the word! 🙏🏼&lt;/p&gt;

</description>
      <category>vrp</category>
      <category>tsp</category>
      <category>osrm</category>
      <category>cpp</category>
    </item>
  </channel>
</rss>
