\documentclass[10pt,a4paper]{article} % Packages \usepackage{fancyhdr} % For header and footer \usepackage{multicol} % Allows multicols in tables \usepackage{tabularx} % Intelligent column widths \usepackage{tabulary} % Used in header and footer \usepackage{hhline} % Border under tables \usepackage{graphicx} % For images \usepackage{xcolor} % For hex colours %\usepackage[utf8x]{inputenc} % For unicode character support \usepackage[T1]{fontenc} % Without this we get weird character replacements \usepackage{colortbl} % For coloured tables \usepackage{setspace} % For line height \usepackage{lastpage} % Needed for total page number \usepackage{seqsplit} % Splits long words. %\usepackage{opensans} % Can't make this work so far. Shame. Would be lovely. \usepackage[normalem]{ulem} % For underlining links % Most of the following are not required for the majority % of cheat sheets but are needed for some symbol support. \usepackage{amsmath} % Symbols \usepackage{MnSymbol} % Symbols \usepackage{wasysym} % Symbols %\usepackage[english,german,french,spanish,italian]{babel} % Languages % Document Info \author{txthao1998} \pdfinfo{ /Title (xuan-thao-vrp.pdf) /Creator (Cheatography) /Author (txthao1998) /Subject (Xuan Thao VRP Cheat Sheet) } % Lengths and widths \addtolength{\textwidth}{6cm} \addtolength{\textheight}{-1cm} \addtolength{\hoffset}{-3cm} \addtolength{\voffset}{-2cm} \setlength{\tabcolsep}{0.2cm} % Space between columns \setlength{\headsep}{-12pt} % Reduce space between header and content \setlength{\headheight}{85pt} % If less, LaTeX automatically increases it \renewcommand{\footrulewidth}{0pt} % Remove footer line \renewcommand{\headrulewidth}{0pt} % Remove header line \renewcommand{\seqinsert}{\ifmmode\allowbreak\else\-\fi} % Hyphens in seqsplit % This two commands together give roughly % the right line height in the tables \renewcommand{\arraystretch}{1.3} \onehalfspacing % Commands \newcommand{\SetRowColor}[1]{\noalign{\gdef\RowColorName{#1}}\rowcolor{\RowColorName}} % Shortcut for row colour \newcommand{\mymulticolumn}[3]{\multicolumn{#1}{>{\columncolor{\RowColorName}}#2}{#3}} % For coloured multi-cols \newcolumntype{x}[1]{>{\raggedright}p{#1}} % New column types for ragged-right paragraph columns \newcommand{\tn}{\tabularnewline} % Required as custom column type in use % Font and Colours \definecolor{HeadBackground}{HTML}{333333} \definecolor{FootBackground}{HTML}{666666} \definecolor{TextColor}{HTML}{333333} \definecolor{DarkBackground}{HTML}{7905A3} \definecolor{LightBackground}{HTML}{F6EFF9} \renewcommand{\familydefault}{\sfdefault} \color{TextColor} % Header and Footer \pagestyle{fancy} \fancyhead{} % Set header to blank \fancyfoot{} % Set footer to blank \fancyhead[L]{ \noindent \begin{multicols}{3} \begin{tabulary}{5.8cm}{C} \SetRowColor{DarkBackground} \vspace{-7pt} {\parbox{\dimexpr\textwidth-2\fboxsep\relax}{\noindent \hspace*{-6pt}\includegraphics[width=5.8cm]{/web/www.cheatography.com/public/images/cheatography_logo.pdf}} } \end{tabulary} \columnbreak \begin{tabulary}{11cm}{L} \vspace{-2pt}\large{\bf{\textcolor{DarkBackground}{\textrm{Xuan Thao VRP Cheat Sheet}}}} \\ \normalsize{by \textcolor{DarkBackground}{txthao1998} via \textcolor{DarkBackground}{\uline{cheatography.com/147472/cs/32069/}}} \end{tabulary} \end{multicols}} \fancyfoot[L]{ \footnotesize \noindent \begin{multicols}{3} \begin{tabulary}{5.8cm}{LL} \SetRowColor{FootBackground} \mymulticolumn{2}{p{5.377cm}}{\bf\textcolor{white}{Cheatographer}} \\ \vspace{-2pt}txthao1998 \\ \uline{cheatography.com/txthao1998} \\ \end{tabulary} \vfill \columnbreak \begin{tabulary}{5.8cm}{L} \SetRowColor{FootBackground} \mymulticolumn{1}{p{5.377cm}}{\bf\textcolor{white}{Cheat Sheet}} \\ \vspace{-2pt}Not Yet Published.\\ Updated 13th May, 2022.\\ Page {\thepage} of \pageref{LastPage}. \end{tabulary} \vfill \columnbreak \begin{tabulary}{5.8cm}{L} \SetRowColor{FootBackground} \mymulticolumn{1}{p{5.377cm}}{\bf\textcolor{white}{Sponsor}} \\ \SetRowColor{white} \vspace{-5pt} %\includegraphics[width=48px,height=48px]{dave.jpeg} Measure your website readability!\\ www.readability-score.com \end{tabulary} \end{multicols}} \begin{document} \raggedright \raggedcolumns % Set font size to small. Switch to any value % from this page to resize cheat sheet text: % www.emerson.emory.edu/services/latex/latex_169.html \footnotesize % Small font. \begin{multicols*}{2} \begin{tabularx}{8.4cm}{x{4 cm} x{4 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{8.4cm}}{\bf\textcolor{white}{Ortools}} \tn % Row 0 \SetRowColor{LightBackground} {\bf{create dimension}} & {\bf{dimension\_name}} = 'Distance' \{\{nl\}\} \seqsplit{routing.AddDimension(} \{\{nl\}\} \seqsplit{transit\_callback\_index}, \{\{nl\}\} 0, \# no slack \{\{nl\}\} 300\_000, \# vehicle maximum travel distance \{\{nl\}\} True, \#start cumul to zero \{\{nl\}\} dimension\_name) \{\{nl\}\} \tn % Row Count 14 (+ 14) % Row 1 \SetRowColor{white} {\bf{activate dimension}} & {\bf{distance\_dimension}} = \{\{nl\}\} routing.{\bf{GetDimensionOrDie}}(dimension\_name) \tn % Row Count 19 (+ 5) % Row 2 \SetRowColor{LightBackground} {\bf{add custom constraint to solver}} & \seqsplit{routing.solver().Add(} constraint\_Boolean ) \tn % Row Count 22 (+ 3) % Row 3 \SetRowColor{white} {\bf{which vehicle visiting i}} & routing.{\bf{VehicleVar}}(i) \{\{nl\}\}-1 if i not visited \tn % Row Count 26 (+ 4) % Row 4 \SetRowColor{LightBackground} {\bf{value of dimension when reaching i}} & dimension.{\bf{CumulVar}}(i) \tn % Row Count 28 (+ 2) % Row 5 \SetRowColor{white} Set value of dimension at i inside (a,b) & dimension.{\bf{CumulVar}}(i).{\bf{SetRange}}(a, b) \tn % Row Count 31 (+ 3) \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{x{4 cm} x{4 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{8.4cm}}{\bf\textcolor{white}{Ortools (cont)}} \tn % Row 6 \SetRowColor{LightBackground} {\bf{Increase speed for P\&D}} & routing.{\bf{AddPickupAndDelivery}}(pickup\_i, delivery\_i) \tn % Row Count 3 (+ 3) % Row 7 \SetRowColor{white} {\bf{hard limited veh/cus}}\{\{nl\}\} force i dropped or served by veh1 or veh2 & routing.{\bf{VehicleVar}}(i).{\bf{SetValues}}({[}-1, veh1, veh2{]}) \{\{nl\}\} when customer choose vehicle \tn % Row Count 9 (+ 6) % Row 8 \SetRowColor{LightBackground} {\bf{ Next visited node after i}} & rounting.{\bf{NextVar(i)}} \{\{nl\}\} NextVar(i) == j is true if j is the node immediately reached from node i in the solution. \tn % Row Count 15 (+ 6) % Row 9 \SetRowColor{white} force j not after i & routing.{\bf{nextVar}}(from).{\bf{removeValue}}(to); \tn % Row Count 18 (+ 3) % Row 10 \SetRowColor{LightBackground} {\bf{drop node, or have not been visited in search process}} & routing.{\bf{ActiveVar}}(i) \{\{nl\}\} a Boolean variable that indicates if a node i is visited or not in the solution. \tn % Row Count 24 (+ 6) % Row 11 \SetRowColor{white} {\bf{TW for customers}} & dimension.{\bf{CumulVar}}(i).{\bf{SetRange}}(a, b) \{\{nl\}\} for i not depot\_idx \tn % Row Count 28 (+ 4) % Row 12 \SetRowColor{LightBackground} {\bf{TW for depot}} (for start point) & for veh\_idx in range(num\_vehicle):\{\{nl\}\} start\_loc\_index = routing.{\bf{Start}}(veh\_idx)\{\{nl\}\} node= \seqsplit{manager.IndexToNode(start\_loc\_index} )\{\{nl\}\} a = TW{[} node {]}{[}0{]}\{\{nl\}\} b = TW{[} node {]}{[}1{]}\{\{nl\}\} time\_dim.{\bf{CumulVar}}(start\_loc\_index).{\bf{SetRange}}(a,b)\{\{nl\}\} \tn % Row Count 42 (+ 14) \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{x{4 cm} x{4 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{8.4cm}}{\bf\textcolor{white}{Ortools (cont)}} \tn % Row 13 \SetRowColor{LightBackground} {\bf{TW for endpoint}} & for veh\_idx in range(num\_vehicle):\{\{nl\}\} end\_loc\_index = routing.{\bf{End}}(veh\_idx)\{\{nl\}\} node= manager.IndexToNode(end\_loc\_index)\{\{nl\}\} a = TW{[} node {]}{[}0{]}\{\{nl\}\} b = TW{[} node {]}{[}1{]}\{\{nl\}\} time\_dim.{\bf{CumulVar}}(end\_loc\_index).{\bf{SetRange}}(a,b)\{\{nl\}\} \tn % Row Count 14 (+ 14) % Row 14 \SetRowColor{white} Time visit at node i & time\_var = time\_dimension.{\bf{CumulVar}}(index) \tn % Row Count 17 (+ 3) % Row 15 \SetRowColor{LightBackground} Return the earliest/ lastest possible time to visit node i & solution.{\bf{Min}}(time\_var) \{\{nl\}\} solution.{\bf{Max}}(time\_var) \tn % Row Count 20 (+ 3) % Row 16 \SetRowColor{white} Take an array of capacities (each vehicle has different capacity) & {\bf{AddDimensionWithVehicleCapacity}} \tn % Row Count 24 (+ 4) % Row 17 \SetRowColor{LightBackground} Set dimension with different max val of dim and one callback & dimension\_name = 'Capacity ' \{\{nl\}\} routing.{\bf{AddDimensionWithVehicleCapacity}}( \{\{nl\}\} \seqsplit{transit\_callback\_index}, \{\{nl\}\} 0, \# no slack \{\{nl\}\} {[} 10000, 20000{]}, \# vehicle maximum travel distance \{\{nl\}\} True, \#start cumul to zero \{\{nl\}\} dimension\_name) \tn % Row Count 38 (+ 14) \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{x{4 cm} x{4 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{8.4cm}}{\bf\textcolor{white}{Ortools (cont)}} \tn % Row 18 \SetRowColor{LightBackground} Set dimension with different max val of dim and many callbacks & routing.{\bf{AddDimensionWithVehicleTransitAndCapacity}}( \{\{nl\}\} {\bf{callback\_func\_list\_by\_veh}}, \{\{nl\}\} 0, \# no slack \{\{nl\}\} {\bf{ {[}max\_dim\_vel list{]}}}, \{\{nl\}\} \# vehicle maximum travel time True, \# start cumul to zero \{\{nl\}\} dimension\_name) \tn % Row Count 13 (+ 13) % Row 19 \SetRowColor{white} multiple callbacks depend on vehicle.param & def \seqsplit{callback(from\_index}, to\_index, veh.param) \{\{nl\}\} callback\_list = {[}partial(callback, veh.param) for veh in veh\_list{]} \tn % Row Count 19 (+ 6) % Row 20 \SetRowColor{LightBackground} register multiple callback & \seqsplit{register\_callback\_list=} {[}routing.RegisterTransitCallback(f) for f in callback\_list{]} \tn % Row Count 24 (+ 5) % Row 21 \SetRowColor{white} define cost function for many vehs with different costs callback \{\{nl\}\} sum\_veh\_k time(i,j)\_k & for veh\_id in \seqsplit{range(len(veh\_list)):} routing.SetArcCostEvaluatorOfVehicle(callback\_list{[}veh\_id{]}, veh\_id) \tn % Row Count 30 (+ 6) \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{x{4 cm} x{4 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{8.4cm}}{\bf\textcolor{white}{Ortools (cont)}} \tn % Row 22 \SetRowColor{LightBackground} set arc cost for vehicle k moving from i to j \{\{nl\}\} 1. & def \seqsplit{callback\_cost(fnode}, tnode, veh\_id) \{\{nl\}\} return 3{\emph{ d(i,j,veh\_id) +40}}t (i,j, veh\_id) \seqsplit{cost\_callback\_list} ={[} \seqsplit{partial(callback\_cost}, veh\_id=veh\_id) for veh\_id in veh\_list{]} \seqsplit{register\_cost\_callback\_list=} {[}routing.RegisterTransitCallback(f) for f in cost\_callback\_list{]} for veh\_id in \seqsplit{range(len(veh\_list)):} routing.SetArcCostEvaluatorOfVehicle(register\_cost\_callback\_list{[}veh\_id{]}, veh\_id) \tn % Row Count 20 (+ 20) % Row 23 \SetRowColor{white} create cost callback from i to j depend on vehicle.param & def cost(i, j, veh\_id): \{\{nl\}\} return d(i,j,veh\_id) + t(i,j,veh\_id) \{\{nl\}\} cost\_list = {[}partial(cost, veh\_id=i) for i in veh\_id\_list{]}\{\{nl\}\} reg\_cost\_list = {[}routing.RegisterTransitCallback(f) for f in cost\_list{]}\{\{nl\}\} \tn % Row Count 32 (+ 12) \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{x{4 cm} x{4 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{8.4cm}}{\bf\textcolor{white}{Ortools (cont)}} \tn % Row 24 \SetRowColor{LightBackground} set different arc cost for different vehicle & routing.SetArcCostEvaluatorOfVehicle(reg\_cost\_list{[}i{]}, i ) \tn % Row Count 3 (+ 3) % Row 25 \SetRowColor{white} & staff\_at\_end = {[}{]} for vehicle\_id in \seqsplit{range(manager.GetNumberOfVehicles()):} index = \seqsplit{routing.End(vehicle\_id)} \seqsplit{staff\_at\_end.append(staff\_dimension.CumulVar(index))solver.Add(solver.Sum(staff\_at\_end)} \textless{}= N) \tn % Row Count 14 (+ 11) \hhline{>{\arrayrulecolor{DarkBackground}}--} \SetRowColor{LightBackground} \mymulticolumn{2}{x{8.4cm}}{SetFixedCostOfVehicle \newline SetMaximumNumberOfActiveVehicles} \tn \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{x{4 cm} x{4 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{8.4cm}}{\bf\textcolor{white}{ortools 2}} \tn % Row 0 \SetRowColor{LightBackground} force vehicle i to visit its end location by the earliest possible time & routing.{\bf{AddVariableMinimizedByFinalizer}}(time\_dim.{\bf{CumulVar}}(routing.{\bf{Start}}(i))) \tn % Row Count 5 (+ 5) % Row 1 \SetRowColor{white} force vehicle i to leave its start location by the earliest possible time & routing.{\bf{AddVariableMinimizedByFinalizer}}(time\_dim.{\bf{CumulVar}}(routing.{\bf{End}}(i))) \tn % Row Count 10 (+ 5) \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{x{2.96 cm} x{5.04 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{8.4cm}}{\bf\textcolor{white}{CPSAT}} \tn % Row 0 \SetRowColor{LightBackground} create new Variable & x = model.NewIntVar(0, 10, 'x') \tn % Row Count 2 (+ 2) % Row 1 \SetRowColor{white} Implement b == (x \textgreater{}= 5) & model.Add(x \textgreater{}= 5).OnlyEnforceIf(b) \{\{nl\}\} model.Add(x \textless{} \seqsplit{5).OnlyEnforceIf(b.Not())} \tn % Row Count 6 (+ 4) \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} % That's all folks \end{multicols*} \end{document}