<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: How can I add time windows to a VRP model? in Mathematical Optimization, Discrete-Event Simulation, and OR</title>
    <link>https://communities.sas.com/t5/Mathematical-Optimization/How-can-I-add-time-windows-to-a-VRP-model/m-p/455265#M2228</link>
    <description>&lt;P&gt;You can enforce time windows by introducing a Start variable and big-M constraints:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;var UseArc {ARCS, VEHICLES} binary;
var Start {i in NODES, k in VEHICLES} &amp;gt;= r[i] &amp;lt;= d[i];
/* if UseArc[i,j,k] = 1 then Start[i,k] + c[i,j,k] &amp;lt;= Start[j,k] */
con StartCon {i in NODES, j in NODES diff {depot}, k in VEHICLES: i ne j}:
   Start[i,k] + c[i,j,k] - Start[j,k] 
&amp;lt;= (Start[i,k].ub + c[i,j,k] - Start[j,k].lb) * (1 - UseArc[i,j,k]);&lt;/CODE&gt;&amp;nbsp;&lt;/PRE&gt;</description>
    <pubDate>Fri, 20 Apr 2018 14:04:29 GMT</pubDate>
    <dc:creator>RobPratt</dc:creator>
    <dc:date>2018-04-20T14:04:29Z</dc:date>
    <item>
      <title>How can I add time windows to a VRP model?</title>
      <link>https://communities.sas.com/t5/Mathematical-Optimization/How-can-I-add-time-windows-to-a-VRP-model/m-p/454688#M2227</link>
      <description>&lt;P&gt;Hello! I am working on a School assignment. I am using SAS Studio to build up a VRP model.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The model is a typical VRP problem with split deliveries, a set of nodes, two trucks, truck capacity&amp;nbsp;and time Windows.&lt;/P&gt;&lt;P&gt;How do I define the time windows? There has to be a lower time window and a upper time window.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Example: A customer has a time window between 08:00 and 08:30. The customers demand has to be fulfilled between 08:00 and 08:30 by 1 or 2 trucks (split deliveries).&lt;/P&gt;</description>
      <pubDate>Tue, 17 Apr 2018 10:08:24 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Mathematical-Optimization/How-can-I-add-time-windows-to-a-VRP-model/m-p/454688#M2227</guid>
      <dc:creator>simen1994</dc:creator>
      <dc:date>2018-04-17T10:08:24Z</dc:date>
    </item>
    <item>
      <title>Re: How can I add time windows to a VRP model?</title>
      <link>https://communities.sas.com/t5/Mathematical-Optimization/How-can-I-add-time-windows-to-a-VRP-model/m-p/455265#M2228</link>
      <description>&lt;P&gt;You can enforce time windows by introducing a Start variable and big-M constraints:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;var UseArc {ARCS, VEHICLES} binary;
var Start {i in NODES, k in VEHICLES} &amp;gt;= r[i] &amp;lt;= d[i];
/* if UseArc[i,j,k] = 1 then Start[i,k] + c[i,j,k] &amp;lt;= Start[j,k] */
con StartCon {i in NODES, j in NODES diff {depot}, k in VEHICLES: i ne j}:
   Start[i,k] + c[i,j,k] - Start[j,k] 
&amp;lt;= (Start[i,k].ub + c[i,j,k] - Start[j,k].lb) * (1 - UseArc[i,j,k]);&lt;/CODE&gt;&amp;nbsp;&lt;/PRE&gt;</description>
      <pubDate>Fri, 20 Apr 2018 14:04:29 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Mathematical-Optimization/How-can-I-add-time-windows-to-a-VRP-model/m-p/455265#M2228</guid>
      <dc:creator>RobPratt</dc:creator>
      <dc:date>2018-04-20T14:04:29Z</dc:date>
    </item>
    <item>
      <title>Re: How can I add time windows to a VRP model?</title>
      <link>https://communities.sas.com/t5/Mathematical-Optimization/How-can-I-add-time-windows-to-a-VRP-model/m-p/455842#M2230</link>
      <description>&lt;P&gt;This is my model now. I'm afraid I didnt understand your solution, because im very new to this. Could you ad the time constraint to this?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;proc optmodel;&lt;BR /&gt;/*DATA*/&lt;BR /&gt;set trucks&amp;nbsp; = {1,2};&lt;BR /&gt;set customers = {0,1,2,3};&lt;BR /&gt;number distance{customers, customers}=[&lt;BR /&gt;0 2 4 5&lt;BR /&gt;2 0 0.8 1.5&lt;BR /&gt;4 0.8 0 0.6&lt;BR /&gt;5 1.5 0.6 0&lt;BR /&gt;];&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;number demand{customers} =[0 10 5 10];&lt;/P&gt;&lt;P&gt;number truckCapacity{trucks} = [20 20];&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;/*VARIABLES*/&lt;/P&gt;&lt;P&gt;var X{customers,customers,trucks} binary;&lt;/P&gt;&lt;P&gt;var Y{trucks, customers} binary;&lt;/P&gt;&lt;P&gt;var Q{trucks,customers};&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;/*Objective function*/&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;minimize C = sum{i in customers, j in customers, k in trucks} distance[i,j]*X[i,j,k];&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/*CONSTRAINTS*/&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/*Each truck must start from depot*/&lt;/P&gt;&lt;P&gt;con startDepot{k in trucks} : sum{j in customers : j&amp;gt;0} X[0,j,k] = 1;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;/*Each truck must return to depot*/&lt;/P&gt;&lt;P&gt;con endDepot{k in trucks} : sum{i in customers : i&amp;gt;0} X[i,0,k] = 1;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/*Flow conservation - what comes in - must come out*/&lt;/P&gt;&lt;P&gt;con flowConst{i in customers, k in trucks}:&lt;BR /&gt;&amp;nbsp;sum{j in customers : j ne i}&lt;BR /&gt;&amp;nbsp;&amp;nbsp;(X[j,i,k] - X[i,j,k]) =0;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;/*Demand must be fulfilled*/&lt;/P&gt;&lt;P&gt;con demandFulfill{i in customers: i&amp;gt;0}:&lt;BR /&gt;&amp;nbsp;sum{k in trucks}Q[k,i] = demand[i];&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;/*Logical constraint: X -&amp;gt; Y*/&lt;/P&gt;&lt;P&gt;con xyConst{j in customers , k in trucks: j&amp;gt;0}:&lt;BR /&gt;&amp;nbsp;sum{i in customers : i ne j} X[i,j,k] = Y[k,j];&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;/*Logical constraint: Q -&amp;gt; Y*/&lt;/P&gt;&lt;P&gt;con qyConst{i in customers , k in trucks: i&amp;gt;0}:&lt;BR /&gt;&amp;nbsp;Q[k,i] &amp;lt;= demand[i]*Y[k,i];&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/*Truck capacity in m^3*/&lt;/P&gt;&lt;P&gt;con truckCapacityConst{k in trucks}:&lt;BR /&gt;&amp;nbsp;sum{i in customers : i&amp;gt;0}Q[k,i] &amp;lt;= truckCapacity[k];&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;solve with milp / maxtime=600;&lt;/P&gt;&lt;P&gt;print X Y Q C;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;quit;&lt;/P&gt;</description>
      <pubDate>Fri, 20 Apr 2018 07:52:29 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Mathematical-Optimization/How-can-I-add-time-windows-to-a-VRP-model/m-p/455842#M2230</guid>
      <dc:creator>simen1994</dc:creator>
      <dc:date>2018-04-20T07:52:29Z</dc:date>
    </item>
    <item>
      <title>Re: How can I add time windows to a VRP model?</title>
      <link>https://communities.sas.com/t5/Mathematical-Optimization/How-can-I-add-time-windows-to-a-VRP-model/m-p/455918#M2231</link>
      <description>&lt;P&gt;The correspondence is VEHICLES&amp;lt;-&amp;gt;trucks, NODES&amp;lt;-&amp;gt;customers, and ARCS&amp;lt;-&amp;gt;customers cross customers.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Where is your time window data?&amp;nbsp; You also will need travel time data between customers, like you already have travel distances between customers.&lt;/P&gt;</description>
      <pubDate>Fri, 20 Apr 2018 14:05:40 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Mathematical-Optimization/How-can-I-add-time-windows-to-a-VRP-model/m-p/455918#M2231</guid>
      <dc:creator>RobPratt</dc:creator>
      <dc:date>2018-04-20T14:05:40Z</dc:date>
    </item>
    <item>
      <title>Re: How can I add time windows to a VRP model?</title>
      <link>https://communities.sas.com/t5/Mathematical-Optimization/How-can-I-add-time-windows-to-a-VRP-model/m-p/456413#M2232</link>
      <description>&lt;P&gt;I think I understand now. I have added now the travel time between the nodes and a new variable which is arrivaltime B{i,j}.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Before I add the time constraints I Guess there should be a constraint which tells the value of the arrival time.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I have written it like this:&amp;nbsp; &amp;nbsp;X[i,j,k]*runtime[i,j] = B[i];&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; =&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Desicion variables * runetime between the nodes = arrival time.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;After this I would constrain the arrival time to a upper and a lower time window.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Is this the correct way to do it?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;If this is correct, what should come before: X[i,j,k]*runtime[i,j] = B[i];? It should be sum of all trucks.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;proc optmodel;&lt;BR /&gt;/*DATA*/&lt;BR /&gt;set trucks&amp;nbsp; = {1,2};&lt;BR /&gt;set customers = {0,1,2,3};&lt;BR /&gt;number distance{customers, customers}=[&lt;BR /&gt;0 2 4 5&lt;BR /&gt;2 0 0.8 1.5&lt;BR /&gt;4 0.8 0 0.6&lt;BR /&gt;5 1.5 0.6 0&lt;BR /&gt;];&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;number demand{customers} =[0 10 5 10];&lt;/P&gt;&lt;P&gt;number truckCapacity{trucks} = [20 20];&lt;/P&gt;&lt;P&gt;/*NEW DATA*/&lt;/P&gt;&lt;P&gt;/*Time windows&lt;/P&gt;&lt;P&gt;Customer 0 (depot)&amp;nbsp;=&amp;gt; 07:00-07:00&lt;BR /&gt;Customer 1&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;gt; 07:00-07:30&lt;BR /&gt;Customer 2&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;gt; 07:00-07:50&lt;BR /&gt;Customer 3 &amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;gt; 08:00-08:30&lt;BR /&gt;*/&lt;/P&gt;&lt;P&gt;number lowertimeWindows{customers}=[0 0 0 60];&lt;BR /&gt;number uppertimeWindows{customers}=[0 30 50 90];&lt;/P&gt;&lt;P&gt;number runtime{customers, customers}=[&lt;BR /&gt;0 10 20 25&lt;BR /&gt;10 0 15 22&lt;BR /&gt;20 15 0 18&lt;BR /&gt;25 22 18 0];&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/*VARIABLER*/&lt;/P&gt;&lt;P&gt;var X{customers,customers,trucks} binary;&lt;/P&gt;&lt;P&gt;var Y{trucks, customers} binary;&lt;/P&gt;&lt;P&gt;var Q{trucks,customers};&lt;/P&gt;&lt;P&gt;/*NEW VARIABLE*/&lt;BR /&gt;var B{customers}; /*The number of minutes it takes for the trucks to meet the demand*/&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;/*Objective function*/&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;minimize C = sum{i in customers, j in customers, k in trucks} distance[i,j]*X[i,j,k];&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/*CONSTRAINTS*/&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/*Each truck must start from depot*/&lt;/P&gt;&lt;P&gt;con startDepot{k in trucks} : sum{j in customers : j&amp;gt;0} X[0,j,k] = 1;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;/*Each truck must return to depot*/&lt;/P&gt;&lt;P&gt;con endDepot{k in trucks} : sum{i in customers : i&amp;gt;0} X[i,0,k] = 1;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/*Flow conservation - what comes in - must come out*/&lt;/P&gt;&lt;P&gt;con flowConst{i in customers, k in trucks}:&lt;BR /&gt;&amp;nbsp;sum{j in customers : j ne i}&lt;BR /&gt;&amp;nbsp;&amp;nbsp;(X[j,i,k] - X[i,j,k]) =0;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;/*Demand must be fulfilled*/&lt;/P&gt;&lt;P&gt;con demandFulfill{i in customers: i&amp;gt;0}:&lt;BR /&gt;&amp;nbsp;sum{k in trucks}Q[k,i] = demand[i];&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;/*Logical constraint: X -&amp;gt; Y*/&lt;/P&gt;&lt;P&gt;con xyConst{j in customers , k in trucks: j&amp;gt;0}:&lt;BR /&gt;&amp;nbsp;sum{i in customers : i ne j} X[i,j,k] = Y[k,j];&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;/*Logical constraint: Q -&amp;gt; Y*/&lt;/P&gt;&lt;P&gt;con qyConst{i in customers , k in trucks: i&amp;gt;0}:&lt;BR /&gt;&amp;nbsp;Q[k,i] &amp;lt;= demand[i]*Y[k,i];&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/*Truck capacity in m^3*/&lt;/P&gt;&lt;P&gt;con truckCapacityConst{k in trucks}:&lt;BR /&gt;&amp;nbsp;sum{i in customers : i&amp;gt;0}Q[k,i] &amp;lt;= truckCapacity[k];&lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;/*NEW CONSTRAINTS*/&lt;/P&gt;&lt;P&gt;con sum{} X[i,j,k]*runtime[i,j] = B[i];&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;solve with milp / maxtime=600;&lt;/P&gt;&lt;P&gt;print X Y Q C B;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;quit;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 23 Apr 2018 06:41:43 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Mathematical-Optimization/How-can-I-add-time-windows-to-a-VRP-model/m-p/456413#M2232</guid>
      <dc:creator>simen1994</dc:creator>
      <dc:date>2018-04-23T06:41:43Z</dc:date>
    </item>
    <item>
      <title>Re: How can I add time windows to a VRP model?</title>
      <link>https://communities.sas.com/t5/Mathematical-Optimization/How-can-I-add-time-windows-to-a-VRP-model/m-p/456603#M2233</link>
      <description>&lt;P&gt;Try this:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;var Start {i in customers, k in trucks} &amp;gt;= lowertimeWindows[i] &amp;lt;= uppertimeWindows[i];
/* if X[i,j,k] = 1 then Start[i,k] + runtime[i,j] &amp;lt;= Start[j,k] */
con StartCon {i in customers, j in customers diff {0}, k in trucks: i ne j}:
   Start[i,k] + runtime[i,j] - Start[j,k] 
&amp;lt;= (Start[i,k].ub + runtime[i,j] - Start[j,k].lb) * (1 - X[i,j,k]); 
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;The value of Start[i,k] matters only when customer i is served by truck k, that is, when Y[k,i] = 1.&lt;/P&gt;</description>
      <pubDate>Mon, 23 Apr 2018 16:50:24 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Mathematical-Optimization/How-can-I-add-time-windows-to-a-VRP-model/m-p/456603#M2233</guid>
      <dc:creator>RobPratt</dc:creator>
      <dc:date>2018-04-23T16:50:24Z</dc:date>
    </item>
    <item>
      <title>Re: How can I add time windows to a VRP model?</title>
      <link>https://communities.sas.com/t5/Mathematical-Optimization/How-can-I-add-time-windows-to-a-VRP-model/m-p/456981#M2236</link>
      <description>&lt;P&gt;It worked &lt;span class="lia-unicode-emoji" title=":slightly_smiling_face:"&gt;🙂&lt;/span&gt; Thanks Rob!&lt;/P&gt;</description>
      <pubDate>Tue, 24 Apr 2018 17:35:45 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Mathematical-Optimization/How-can-I-add-time-windows-to-a-VRP-model/m-p/456981#M2236</guid>
      <dc:creator>simen1994</dc:creator>
      <dc:date>2018-04-24T17:35:45Z</dc:date>
    </item>
  </channel>
</rss>

