commit 962db980038e66ecc18af01d6865273bc7fed89a Author: Nabil Ould Hamou <ouldhamounabil@gmail.com> Date: Sun Jan 26 22:08:49 2025 +0100 Initial Commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..869d741 --- /dev/null +++ b/.gitignore @@ -0,0 +1,43 @@ +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ +.idea + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..371c34a --- /dev/null +++ b/build.gradle @@ -0,0 +1,19 @@ +plugins { + id 'java' +} + +group = 'fr.nabil' +version = '1.0-SNAPSHOT' + +repositories { + mavenCentral() +} + +dependencies { + testImplementation platform('org.junit:junit-bom:5.10.0') + testImplementation 'org.junit.jupiter:junit-jupiter' +} + +test { + useJUnitPlatform() +} \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..249e583 Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..6ada88b --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Sun Jan 26 20:48:21 CET 2025 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..1b6c787 --- /dev/null +++ b/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..23fa14c --- /dev/null +++ b/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = 'CombinatorialOptimization' + diff --git a/src/main/java/fr/nabil/Main.java b/src/main/java/fr/nabil/Main.java new file mode 100644 index 0000000..149786c --- /dev/null +++ b/src/main/java/fr/nabil/Main.java @@ -0,0 +1,36 @@ +package fr.nabil; + +import fr.nabil.data.VRP; +import fr.nabil.utils.FileReader; + +import java.io.File; +import java.io.IOException; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + +public class Main { + + public static void main(String[] args) throws URISyntaxException, IOException { + + List<VRP> vrps = new ArrayList<>(); + + ClassLoader classLoader = Main.class.getClassLoader(); + + Path vrpPath = Paths.get(classLoader.getResource("vrp").toURI()); + + try (Stream<Path> paths = Files.list(vrpPath)) { + paths.forEach(p -> { + vrps.add(FileReader.readFile(p.toUri())); + }); + } + + System.out.println(vrps.getFirst().toString()); + } + +} diff --git a/src/main/java/fr/nabil/data/VRP.java b/src/main/java/fr/nabil/data/VRP.java new file mode 100644 index 0000000..50e09e6 --- /dev/null +++ b/src/main/java/fr/nabil/data/VRP.java @@ -0,0 +1,42 @@ +package fr.nabil.data; + +import fr.nabil.utils.Pair; + +import java.util.Map; + +public class VRP { + + private String name; + private String comment; + private String type; + private int dimension; + private String edgeWeightType; + private int capacity; + private Map<Integer, Pair<Integer, Integer>> nodeCoordSection; + private Map<Integer, Integer> demandeSection; + + public VRP(String name, String comment, String type, int dimension, String edgeWeightType, int capacity, Map<Integer, Pair<Integer, Integer>> nodeCoordSection, Map<Integer, Integer> demandeSection) { + this.name = name; + this.comment = comment; + this.type = type; + this.dimension = dimension; + this.edgeWeightType = edgeWeightType; + this.capacity = capacity; + this.nodeCoordSection = nodeCoordSection; + this.demandeSection = demandeSection; + } + + @Override + public String toString() { + return "VRP{" + + "name='" + name + '\'' + + ", comment='" + comment + '\'' + + ", type='" + type + '\'' + + ", dimension=" + dimension + + ", edgeWeightType='" + edgeWeightType + '\'' + + ", capacity=" + capacity + + ", nodeCoordSection=" + nodeCoordSection + + ", demandeSection=" + demandeSection + + '}'; + } +} diff --git a/src/main/java/fr/nabil/utils/FileReader.java b/src/main/java/fr/nabil/utils/FileReader.java new file mode 100644 index 0000000..9e0e052 --- /dev/null +++ b/src/main/java/fr/nabil/utils/FileReader.java @@ -0,0 +1,80 @@ +package fr.nabil.utils; + +import fr.nabil.data.VRP; + +import java.io.IOException; +import java.net.URI; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class FileReader { + + public static VRP readFile(URI fileUri) { + try { + List<String> lines = Files.readAllLines(Path.of(fileUri), StandardCharsets.UTF_8); + + return parseFile(lines); + + } catch (IOException e) { + e.printStackTrace(); + } + + return null; + } + + private static VRP parseFile(List<String> lines) { + + String name = ""; + String comment = ""; + String type = ""; + int dimension = 0; + String weightType = ""; + int capacity = 0; + + Map<Integer, Pair<Integer, Integer>> nodeCoordSection = new HashMap<>(); + Map<Integer, Integer> demandeSection = new HashMap<>(); + + for (String line : lines) { + String[] words = line.split(" : "); + + switch (words[0].toLowerCase()) { + + case "name": + name = words[1]; + break; + case "comment": + comment = words[1]; + break; + case "type": + type = words[1]; + break; + case "dimension": + dimension = Integer.parseInt(words[1].trim()); + break; + case "edge_weight_type": + weightType = words[1]; + break; + case "capacity": + capacity = Integer.parseInt(words[1].trim()); + break; + default: + String[] reParsed = words[0].split(" "); + if (reParsed.length == 3) { + nodeCoordSection.put(Integer.parseInt(reParsed[0]), new Pair<>(Integer.parseInt(reParsed[1]), Integer.parseInt(reParsed[2]))); + } else if (reParsed.length == 2) { + if (reParsed[0].equalsIgnoreCase("")) break; + demandeSection.put(Integer.parseInt(reParsed[0]), Integer.parseInt(reParsed[1])); + } + break; + } + } + + return new VRP(name, comment, type, dimension, weightType, capacity, nodeCoordSection, demandeSection); + } + +} diff --git a/src/main/java/fr/nabil/utils/Pair.java b/src/main/java/fr/nabil/utils/Pair.java new file mode 100644 index 0000000..eb4d846 --- /dev/null +++ b/src/main/java/fr/nabil/utils/Pair.java @@ -0,0 +1,33 @@ +package fr.nabil.utils; + +public class Pair<T, U> { + + private T first; + private U second; + + public Pair(T first, U second) { + this.first = first; + this.second = second; + } + + public T getFirst() { + return first; + } + + public U getSecond() { + return second; + } + + public void setPair(T first, U second) { + this.first = first; + this.second = second; + } + + public void setFirst(T first) { + this.first = first; + } + + public void setSecond(U second) { + this.second = second; + } +} diff --git a/src/main/resources/Description.txt b/src/main/resources/Description.txt new file mode 100644 index 0000000..b814c82 --- /dev/null +++ b/src/main/resources/Description.txt @@ -0,0 +1,9 @@ +NAME : Nom de l'instance +COMMENT : Commentaires +TYPE : Type de problème +DIMENSION : Nombre de sites (incluant le dépôt) +EDGE_WEIGHT_TYPE : Représentation des distances (ici toutes sont en distances euclidiennes) +CAPACITY : capacité des vehicules +NODE_COORD_SECTION : Coordonnées des sites +DEMAND_SECTION : Demande par site +DEPOT SECTION : Numéro des dépôts \ No newline at end of file diff --git a/src/main/resources/opt/E-n101-k14.opt.txt b/src/main/resources/opt/E-n101-k14.opt.txt new file mode 100644 index 0000000..984a9e7 --- /dev/null +++ b/src/main/resources/opt/E-n101-k14.opt.txt @@ -0,0 +1,15 @@ +Route #1: 92 37 100 85 93 99 96 +Route #2: 13 87 97 95 94 +Route #3: 18 8 46 36 49 64 11 62 88 +Route #4: 52 7 19 47 48 82 +Route #5: 53 27 +Route #6: 61 16 86 38 44 91 98 +Route #7: 69 70 30 32 90 63 10 31 +Route #8: 23 67 39 25 55 54 +Route #9: 28 76 77 3 68 12 +Route #10: 80 24 29 78 34 35 71 65 66 20 +Route #11: 50 79 33 81 9 51 1 +Route #12: 26 4 56 75 72 21 40 +Route #13: 58 2 57 42 14 43 15 41 22 74 73 +Route #14: 89 60 83 45 17 84 5 59 6 +Cost 1067 diff --git a/src/main/resources/opt/E-n22-k4.opt.txt b/src/main/resources/opt/E-n22-k4.opt.txt new file mode 100644 index 0000000..7dbf437 --- /dev/null +++ b/src/main/resources/opt/E-n22-k4.opt.txt @@ -0,0 +1,5 @@ +Route #1: 17 20 18 15 12 +Route #2: 16 19 21 14 +Route #3: 13 11 4 3 8 10 +Route #4: 9 7 5 2 1 6 +Cost 375 diff --git a/src/main/resources/opt/E-n33-k4.opt.txt b/src/main/resources/opt/E-n33-k4.opt.txt new file mode 100644 index 0000000..c603235 --- /dev/null +++ b/src/main/resources/opt/E-n33-k4.opt.txt @@ -0,0 +1,5 @@ +Route #1: 1 15 26 27 16 28 29 +Route #2: 30 14 31 +Route #3: 3 5 6 10 18 19 22 21 20 23 24 25 17 13 +Route #4: 2 12 11 32 8 9 7 4 +Cost 835 diff --git a/src/main/resources/opt/E-n51-k5.opt.txt b/src/main/resources/opt/E-n51-k5.opt.txt new file mode 100644 index 0000000..e30b330 --- /dev/null +++ b/src/main/resources/opt/E-n51-k5.opt.txt @@ -0,0 +1,6 @@ +Route #1: 5 49 10 39 33 45 15 44 37 17 12 +Route #2: 47 4 42 19 40 41 13 18 +Route #3: 46 32 1 22 20 35 36 3 28 31 26 8 +Route #4: 6 14 25 24 43 7 23 48 27 +Route #5: 11 16 2 29 21 50 34 30 9 38 +Cost 521 diff --git a/src/main/resources/opt/X-n228-k23.opt.txt b/src/main/resources/opt/X-n228-k23.opt.txt new file mode 100644 index 0000000..710ebe0 --- /dev/null +++ b/src/main/resources/opt/X-n228-k23.opt.txt @@ -0,0 +1,24 @@ +Route #1: 129 227 140 27 184 176 118 106 42 +Route #2: 155 28 26 192 218 +Route #3: 69 124 114 51 32 104 173 133 74 158 62 146 222 80 170 156 +Route #4: 90 35 58 2 103 29 142 +Route #5: 193 191 207 18 189 186 78 128 86 70 +Route #6: 101 225 77 30 202 68 44 195 38 +Route #7: 220 61 1 40 57 100 83 159 172 206 110 76 47 203 +Route #8: 117 151 212 137 36 14 4 148 +Route #9: 182 72 167 50 88 208 20 13 177 67 145 98 +Route #10: 52 116 82 92 144 162 33 39 112 164 171 +Route #11: 217 12 37 65 75 134 15 +Route #12: 181 201 190 152 64 6 108 139 165 97 122 196 +Route #13: 71 194 200 213 25 59 109 141 198 91 205 +Route #14: 119 56 5 163 138 99 221 136 111 121 127 79 224 +Route #15: 16 19 +Route #16: 216 84 126 169 48 214 3 54 149 +Route #17: 160 153 161 10 180 46 188 199 63 130 135 94 209 95 166 34 178 41 +Route #18: 24 9 107 89 123 +Route #19: 113 174 143 210 215 96 147 7 105 226 23 +Route #20: 60 157 73 115 49 43 31 21 93 120 +Route #21: 183 223 132 102 168 87 11 53 179 197 150 187 +Route #22: 66 81 22 17 175 +Route #23: 204 219 85 45 131 154 8 55 185 125 211 +Cost 25742 diff --git a/src/main/resources/opt/X-n524-k153.opt.txt b/src/main/resources/opt/X-n524-k153.opt.txt new file mode 100644 index 0000000..689ef68 --- /dev/null +++ b/src/main/resources/opt/X-n524-k153.opt.txt @@ -0,0 +1,156 @@ +Route #1: 373 431 129 +Route #2: 375 215 160 248 +Route #3: 98 +Route #4: 305 243 462 209 460 303 71 297 513 241 +Route #5: 374 74 151 +Route #6: 186 341 +Route #7: 6 319 +Route #8: 202 +Route #9: 354 176 358 482 469 357 +Route #10: 114 +Route #11: 229 355 309 279 415 149 516 276 326 +Route #12: 288 225 39 269 497 308 +Route #13: 522 121 +Route #14: 100 +Route #15: 44 +Route #16: 277 281 165 +Route #17: 204 404 +Route #18: 37 435 394 385 444 233 +Route #19: 139 +Route #20: 67 +Route #21: 272 317 211 239 10 451 274 517 463 +Route #22: 376 286 443 226 260 38 224 +Route #23: 302 414 383 135 395 323 212 +Route #24: 118 101 468 +Route #25: 452 339 514 289 465 210 515 112 270 471 +Route #26: 24 93 +Route #27: 1 454 330 +Route #28: 196 434 +Route #29: 91 477 +Route #30: 116 +Route #31: 493 426 273 190 +Route #32: 331 498 236 208 324 389 170 467 363 +Route #33: 500 409 18 437 315 +Route #34: 109 +Route #35: 486 197 282 +Route #36: 285 185 155 +Route #37: 325 9 474 257 +Route #38: 180 30 +Route #39: 510 263 349 284 347 96 +Route #40: 413 207 480 299 50 +Route #41: 133 92 +Route #42: 4 54 +Route #43: 26 +Route #44: 169 68 366 +Route #45: 12 45 +Route #46: 102 138 +Route #47: 356 69 +Route #48: 107 +Route #49: 367 450 7 459 +Route #50: 455 94 +Route #51: 194 123 457 +Route #52: 90 127 +Route #53: 72 +Route #54: 173 +Route #55: 327 316 418 193 +Route #56: 506 80 488 +Route #57: 247 14 509 178 +Route #58: 110 +Route #59: 300 421 377 73 217 301 221 365 +Route #60: 144 76 +Route #61: 62 +Route #62: 244 41 448 +Route #63: 65 344 268 +Route #64: 17 25 253 +Route #65: 322 115 255 214 494 521 +Route #66: 290 31 81 +Route #67: 447 386 53 +Route #68: 131 163 495 +Route #69: 27 117 +Route #70: 508 446 449 378 106 381 306 +Route #71: 439 353 313 19 346 382 +Route #72: 34 66 +Route #73: 154 87 +Route #74: 407 390 77 399 405 312 364 483 +Route #75: 146 492 256 453 +Route #76: 320 36 223 +Route #77: 438 388 15 343 296 +Route #78: 183 472 +Route #79: 266 369 402 362 481 105 491 441 +Route #80: 417 162 294 232 +Route #81: 179 +Route #82: 63 +Route #83: 283 249 424 152 512 304 523 420 +Route #84: 189 295 456 168 252 +Route #85: 350 479 425 275 222 398 380 228 181 +Route #86: 470 174 428 337 +Route #87: 171 505 182 +Route #88: 75 137 +Route #89: 48 +Route #90: 33 40 +Route #91: 32 +Route #92: 242 103 52 +Route #93: 145 201 +Route #94: 164 84 +Route #95: 372 430 203 445 +Route #96: 360 58 55 +Route #97: 403 267 216 293 195 287 476 +Route #98: 205 8 291 +Route #99: 86 432 387 +Route #100: 89 51 +Route #101: 199 42 +Route #102: 200 132 +Route #103: 466 240 11 501 +Route #104: 79 3 +Route #105: 412 238 340 489 192 442 +Route #106: 153 88 +Route #107: 113 321 +Route #108: 427 410 35 +Route #109: 156 +Route #110: 147 251 333 406 351 +Route #111: 416 411 503 99 280 261 264 487 +Route #112: 392 46 436 334 336 +Route #113: 478 141 142 +Route #114: 397 328 43 473 332 +Route #115: 97 219 +Route #116: 345 485 23 423 258 396 +Route #117: 28 167 +Route #118: 177 +Route #119: 128 +Route #120: 29 +Route #121: 314 143 490 250 220 262 +Route #122: 218 187 384 +Route #123: 318 371 259 22 245 507 329 +Route #124: 298 20 +Route #125: 148 184 504 +Route #126: 502 518 119 400 475 +Route #127: 59 78 +Route #128: 21 +Route #129: 60 408 +Route #130: 120 157 +Route #131: 499 158 461 433 311 +Route #132: 16 +Route #133: 278 519 166 292 235 +Route #134: 130 159 +Route #135: 108 +Route #136: 370 213 134 +Route #137: 310 359 429 150 +Route #138: 47 122 520 +Route #139: 484 271 422 234 56 348 361 391 +Route #140: 61 +Route #141: 237 140 335 231 +Route #142: 57 125 +Route #143: 2 49 +Route #144: 246 175 126 +Route #145: 230 338 440 227 254 419 83 458 265 368 +Route #146: 85 191 +Route #147: 82 64 379 496 +Route #148: 161 +Route #149: 5 111 +Route #150: 124 307 104 +Route #151: 511 352 95 464 +Route #152: 188 70 +Route #153: 198 136 +Route #154: 206 401 13 342 393 +Route #155: 172 +Cost 154593 \ No newline at end of file diff --git a/src/main/resources/vrp/E-n101-k14.vrp.txt b/src/main/resources/vrp/E-n101-k14.vrp.txt new file mode 100644 index 0000000..cf474e0 --- /dev/null +++ b/src/main/resources/vrp/E-n101-k14.vrp.txt @@ -0,0 +1,214 @@ +NAME : E-n101-k14 +COMMENT : (Christophides and Eilon, Min no of trucks: 14, Best value: 1071) +TYPE : CVRP +DIMENSION : 101 +EDGE_WEIGHT_TYPE : EUC_2D +CAPACITY : 112 +NODE_COORD_SECTION +1 35 35 +2 41 49 +3 35 17 +4 55 45 +5 55 20 +6 15 30 +7 25 30 +8 20 50 +9 10 43 +10 55 60 +11 30 60 +12 20 65 +13 50 35 +14 30 25 +15 15 10 +16 30 5 +17 10 20 +18 5 30 +19 20 40 +20 15 60 +21 45 65 +22 45 20 +23 45 10 +24 55 5 +25 65 35 +26 65 20 +27 45 30 +28 35 40 +29 41 37 +30 64 42 +31 40 60 +32 31 52 +33 35 69 +34 53 52 +35 65 55 +36 63 65 +37 2 60 +38 20 20 +39 5 5 +40 60 12 +41 40 25 +42 42 7 +43 24 12 +44 23 3 +45 11 14 +46 6 38 +47 2 48 +48 8 56 +49 13 52 +50 6 68 +51 47 47 +52 49 58 +53 27 43 +54 37 31 +55 57 29 +56 63 23 +57 53 12 +58 32 12 +59 36 26 +60 21 24 +61 17 34 +62 12 24 +63 24 58 +64 27 69 +65 15 77 +66 62 77 +67 49 73 +68 67 5 +69 56 39 +70 37 47 +71 37 56 +72 57 68 +73 47 16 +74 44 17 +75 46 13 +76 49 11 +77 49 42 +78 53 43 +79 61 52 +80 57 48 +81 56 37 +82 55 54 +83 15 47 +84 14 37 +85 11 31 +86 16 22 +87 4 18 +88 28 18 +89 26 52 +90 26 35 +91 31 67 +92 15 19 +93 22 22 +94 18 24 +95 26 27 +96 25 24 +97 22 27 +98 25 21 +99 19 21 +100 20 26 +101 18 18 +DEMAND_SECTION +1 0 +2 10 +3 7 +4 13 +5 19 +6 26 +7 3 +8 5 +9 9 +10 16 +11 16 +12 12 +13 19 +14 23 +15 20 +16 8 +17 19 +18 2 +19 12 +20 17 +21 9 +22 11 +23 18 +24 29 +25 3 +26 6 +27 17 +28 16 +29 16 +30 9 +31 21 +32 27 +33 23 +34 11 +35 14 +36 8 +37 5 +38 8 +39 16 +40 31 +41 9 +42 5 +43 5 +44 7 +45 18 +46 16 +47 1 +48 27 +49 36 +50 30 +51 13 +52 10 +53 9 +54 14 +55 18 +56 2 +57 6 +58 7 +59 18 +60 28 +61 3 +62 13 +63 19 +64 10 +65 9 +66 20 +67 25 +68 25 +69 36 +70 6 +71 5 +72 15 +73 25 +74 9 +75 8 +76 18 +77 13 +78 14 +79 3 +80 23 +81 6 +82 26 +83 16 +84 11 +85 7 +86 41 +87 35 +88 26 +89 9 +90 15 +91 3 +92 1 +93 2 +94 22 +95 27 +96 20 +97 11 +98 12 +99 10 +100 9 +101 17 +DEPOT_SECTION + 1 + -1 +EOF diff --git a/src/main/resources/vrp/E-n22-k4.vrp.txt b/src/main/resources/vrp/E-n22-k4.vrp.txt new file mode 100644 index 0000000..7618645 --- /dev/null +++ b/src/main/resources/vrp/E-n22-k4.vrp.txt @@ -0,0 +1,56 @@ +NAME : E-n22-k4 +COMMENT : (Christophides and Eilon, Min no of trucks: 4, Optimal value: 375) +TYPE : CVRP +DIMENSION : 22 +EDGE_WEIGHT_TYPE : EUC_2D +CAPACITY : 6000 +NODE_COORD_SECTION +1 145 215 +2 151 264 +3 159 261 +4 130 254 +5 128 252 +6 163 247 +7 146 246 +8 161 242 +9 142 239 +10 163 236 +11 148 232 +12 128 231 +13 156 217 +14 129 214 +15 146 208 +16 164 208 +17 141 206 +18 147 193 +19 164 193 +20 129 189 +21 155 185 +22 139 182 +DEMAND_SECTION +1 0 +2 1100 +3 700 +4 800 +5 1400 +6 2100 +7 400 +8 800 +9 100 +10 500 +11 600 +12 1200 +13 1300 +14 1300 +15 300 +16 900 +17 2100 +18 1000 +19 900 +20 2500 +21 1800 +22 700 +DEPOT_SECTION + 1 + -1 +EOF diff --git a/src/main/resources/vrp/E-n33-k4.vrp.txt b/src/main/resources/vrp/E-n33-k4.vrp.txt new file mode 100644 index 0000000..41e8068 --- /dev/null +++ b/src/main/resources/vrp/E-n33-k4.vrp.txt @@ -0,0 +1,78 @@ +NAME : E-n33-k4 +COMMENT : (Christophides and Eilon, Min no of trucks: 4, Optimal value: 835) +TYPE : CVRP +DIMENSION : 33 +EDGE_WEIGHT_TYPE : EUC_2D +CAPACITY : 8000 +NODE_COORD_SECTION +1 292 495 +2 298 427 +3 309 445 +4 307 464 +5 336 475 +6 320 439 +7 321 437 +8 322 437 +9 323 433 +10 324 433 +11 323 429 +12 314 435 +13 311 442 +14 304 427 +15 293 421 +16 296 418 +17 261 384 +18 297 410 +19 315 407 +20 314 406 +21 321 391 +22 321 398 +23 314 394 +24 313 378 +25 304 382 +26 295 402 +27 283 406 +28 279 399 +29 271 401 +30 264 414 +31 277 439 +32 290 434 +33 319 433 +DEMAND_SECTION +1 0 +2 700 +3 400 +4 400 +5 1200 +6 40 +7 80 +8 2000 +9 900 +10 600 +11 750 +12 1500 +13 150 +14 250 +15 1600 +16 450 +17 700 +18 550 +19 650 +20 200 +21 400 +22 300 +23 1300 +24 700 +25 750 +26 1400 +27 4000 +28 600 +29 1000 +30 500 +31 2500 +32 1700 +33 1100 +DEPOT_SECTION + 1 + -1 +EOF diff --git a/src/main/resources/vrp/E-n51-k5.vrp.txt b/src/main/resources/vrp/E-n51-k5.vrp.txt new file mode 100644 index 0000000..eeb9c21 --- /dev/null +++ b/src/main/resources/vrp/E-n51-k5.vrp.txt @@ -0,0 +1,114 @@ +NAME : E-n51-k5 +COMMENT : (Christophides and Eilon, Min no of trucks: 5, Optimal value: 521) +TYPE : CVRP +DIMENSION : 51 +EDGE_WEIGHT_TYPE : EUC_2D +CAPACITY : 160 +NODE_COORD_SECTION +1 30 40 +2 37 52 +3 49 49 +4 52 64 +5 20 26 +6 40 30 +7 21 47 +8 17 63 +9 31 62 +10 52 33 +11 51 21 +12 42 41 +13 31 32 +14 5 25 +15 12 42 +16 36 16 +17 52 41 +18 27 23 +19 17 33 +20 13 13 +21 57 58 +22 62 42 +23 42 57 +24 16 57 +25 8 52 +26 7 38 +27 27 68 +28 30 48 +29 43 67 +30 58 48 +31 58 27 +32 37 69 +33 38 46 +34 46 10 +35 61 33 +36 62 63 +37 63 69 +38 32 22 +39 45 35 +40 59 15 +41 5 6 +42 10 17 +43 21 10 +44 5 64 +45 30 15 +46 39 10 +47 32 39 +48 25 32 +49 25 55 +50 48 28 +51 56 37 +DEMAND_SECTION +1 0 +2 7 +3 30 +4 16 +5 9 +6 21 +7 15 +8 19 +9 23 +10 11 +11 5 +12 19 +13 29 +14 23 +15 21 +16 10 +17 15 +18 3 +19 41 +20 9 +21 28 +22 8 +23 8 +24 16 +25 10 +26 28 +27 7 +28 15 +29 14 +30 6 +31 19 +32 11 +33 12 +34 23 +35 26 +36 17 +37 6 +38 9 +39 15 +40 14 +41 7 +42 27 +43 13 +44 11 +45 16 +46 10 +47 5 +48 25 +49 17 +50 18 +51 10 +DEPOT_SECTION + 1 + -1 +EOF diff --git a/src/main/resources/vrp/X-n228-k23.vrp.txt b/src/main/resources/vrp/X-n228-k23.vrp.txt new file mode 100644 index 0000000..d7a62b4 --- /dev/null +++ b/src/main/resources/vrp/X-n228-k23.vrp.txt @@ -0,0 +1,468 @@ +NAME : X-n228-k23 +COMMENT : "Generated by Uchoa, Pecin, Pessoa, Poggi, Subramanian, and Vidal (2013)" +TYPE : CVRP +DIMENSION : 228 +EDGE_WEIGHT_TYPE : EUC_2D +CAPACITY : 154 +NODE_COORD_SECTION +1 550 574 +2 177 24 +3 448 476 +4 934 619 +5 323 122 +6 430 76 +7 364 9 +8 988 994 +9 91 636 +10 938 641 +11 979 764 +12 4 748 +13 420 164 +14 294 15 +15 304 89 +16 362 207 +17 770 344 +18 67 634 +19 90 44 +20 712 418 +21 299 6 +22 997 871 +23 38 695 +24 830 1000 +25 916 622 +26 445 107 +27 314 222 +28 292 519 +29 183 344 +30 520 434 +31 262 283 +32 996 902 +33 115 158 +34 371 61 +35 971 352 +36 448 484 +37 299 89 +38 402 147 +39 537 431 +40 389 48 +41 186 22 +42 658 505 +43 459 528 +44 956 900 +45 486 383 +46 36 651 +47 994 713 +48 270 100 +49 944 606 +50 813 917 +51 318 42 +52 17 369 +53 398 280 +54 74 760 +55 910 623 +56 96 604 +57 432 96 +58 188 17 +59 441 480 +60 458 124 +61 557 620 +62 196 51 +63 253 137 +64 953 658 +65 389 0 +66 386 127 +67 140 683 +68 293 75 +69 475 386 +70 224 487 +71 299 157 +72 556 346 +73 366 110 +74 681 864 +75 220 97 +76 382 140 +77 266 88 +78 440 423 +79 168 19 +80 616 244 +81 270 177 +82 126 666 +83 332 85 +84 234 26 +85 834 571 +86 49 602 +87 248 74 +88 81 696 +89 308 43 +90 915 675 +91 500 518 +92 510 353 +93 329 86 +94 830 724 +95 993 634 +96 959 600 +97 991 973 +98 411 25 +99 382 303 +100 477 58 +101 225 31 +102 439 456 +103 120 710 +104 462 471 +105 107 134 +106 970 995 +107 427 501 +108 938 650 +109 370 16 +110 460 140 +111 263 59 +112 524 19 +113 411 89 +114 953 944 +115 79 357 +116 757 867 +117 343 121 +118 361 316 +119 407 508 +120 414 117 +121 576 591 +122 544 44 +123 418 27 +124 837 660 +125 174 487 +126 168 601 +127 854 575 +128 615 52 +129 193 51 +130 458 659 +131 957 641 +132 51 647 +133 137 714 +134 203 140 +135 386 146 +136 976 649 +137 522 26 +138 281 121 +139 453 69 +140 393 25 +141 341 532 +142 466 153 +143 507 472 +144 946 963 +145 327 78 +146 301 135 +147 256 139 +148 997 980 +149 343 173 +150 860 622 +151 151 798 +152 317 211 +153 418 6 +154 833 694 +155 83 641 +156 229 449 +157 283 204 +158 513 697 +159 232 96 +160 247 22 +161 651 664 +162 857 701 +163 337 72 +164 439 65 +165 398 106 +166 409 24 +167 931 476 +168 368 92 +169 97 676 +170 880 606 +171 281 199 +172 410 110 +173 252 22 +174 181 147 +175 945 948 +176 135 618 +177 348 443 +178 296 39 +179 953 368 +180 81 826 +181 997 734 +182 533 134 +183 372 134 +184 231 681 +185 317 479 +186 143 603 +187 122 38 +188 220 898 +189 946 690 +190 95 37 +191 429 9 +192 137 64 +193 361 258 +194 153 65 +195 536 296 +196 509 404 +197 423 59 +198 162 759 +199 525 342 +200 943 678 +201 522 195 +202 463 29 +203 371 335 +204 289 136 +205 191 568 +206 505 381 +207 265 55 +208 125 62 +209 304 44 +210 958 610 +211 975 966 +212 277 631 +213 285 169 +214 486 111 +215 940 621 +216 993 964 +217 771 548 +218 484 276 +219 440 455 +220 104 561 +221 200 61 +222 491 62 +223 277 169 +224 177 695 +225 628 312 +226 430 429 +227 945 994 +228 461 608 +DEMAND_SECTION +1 0 +2 79 +3 57 +4 88 +5 54 +6 92 +7 84 +8 61 +9 100 +10 61 +11 69 +12 78 +13 54 +14 59 +15 60 +16 61 +17 85 +18 67 +19 96 +20 57 +21 57 +22 52 +23 80 +24 60 +25 71 +26 93 +27 59 +28 88 +29 77 +30 50 +31 98 +32 53 +33 54 +34 99 +35 10 +36 9 +37 8 +38 9 +39 7 +40 10 +41 9 +42 2 +43 3 +44 3 +45 7 +46 8 +47 3 +48 2 +49 2 +50 10 +51 2 +52 10 +53 3 +54 9 +55 7 +56 4 +57 6 +58 6 +59 3 +60 3 +61 9 +62 9 +63 9 +64 5 +65 2 +66 10 +67 2 +68 5 +69 9 +70 6 +71 3 +72 7 +73 10 +74 7 +75 10 +76 6 +77 3 +78 10 +79 6 +80 2 +81 4 +82 4 +83 9 +84 5 +85 9 +86 5 +87 5 +88 7 +89 1 +90 10 +91 4 +92 4 +93 2 +94 6 +95 1 +96 2 +97 1 +98 8 +99 1 +100 9 +101 7 +102 1 +103 9 +104 6 +105 4 +106 2 +107 10 +108 7 +109 10 +110 2 +111 3 +112 5 +113 6 +114 7 +115 4 +116 8 +117 4 +118 1 +119 3 +120 4 +121 2 +122 5 +123 8 +124 5 +125 9 +126 3 +127 10 +128 2 +129 1 +130 7 +131 8 +132 2 +133 3 +134 8 +135 6 +136 1 +137 6 +138 8 +139 5 +140 8 +141 2 +142 6 +143 8 +144 4 +145 10 +146 3 +147 10 +148 2 +149 8 +150 9 +151 5 +152 7 +153 10 +154 3 +155 8 +156 7 +157 2 +158 4 +159 7 +160 10 +161 5 +162 10 +163 7 +164 8 +165 1 +166 9 +167 8 +168 4 +169 7 +170 8 +171 6 +172 3 +173 2 +174 4 +175 3 +176 1 +177 10 +178 4 +179 8 +180 10 +181 5 +182 2 +183 2 +184 10 +185 9 +186 7 +187 6 +188 4 +189 4 +190 10 +191 5 +192 8 +193 6 +194 9 +195 10 +196 9 +197 3 +198 5 +199 6 +200 6 +201 10 +202 5 +203 7 +204 3 +205 1 +206 9 +207 10 +208 10 +209 6 +210 1 +211 1 +212 5 +213 8 +214 3 +215 7 +216 4 +217 2 +218 8 +219 5 +220 8 +221 6 +222 5 +223 7 +224 7 +225 5 +226 6 +227 8 +228 7 +DEPOT_SECTION + 1 + -1 +EOF diff --git a/src/main/resources/vrp/X-n524-k153.vrp.txt b/src/main/resources/vrp/X-n524-k153.vrp.txt new file mode 100644 index 0000000..cdb0527 --- /dev/null +++ b/src/main/resources/vrp/X-n524-k153.vrp.txt @@ -0,0 +1,1060 @@ +NAME : X-n524-k153 +COMMENT : "Generated by Uchoa, Pecin, Pessoa, Poggi, Subramanian, and Vidal (2013)" +TYPE : CVRP +DIMENSION : 524 +EDGE_WEIGHT_TYPE : EUC_2D +CAPACITY : 125 +NODE_COORD_SECTION +1 691 729 +2 978 828 +3 427 367 +4 777 543 +5 190 596 +6 773 750 +7 234 727 +8 851 358 +9 140 69 +10 891 285 +11 467 13 +12 537 162 +13 636 355 +14 213 284 +15 75 877 +16 384 814 +17 606 173 +18 76 236 +19 86 733 +20 642 61 +21 303 261 +22 771 775 +23 107 264 +24 763 43 +25 811 873 +26 38 170 +27 822 920 +28 907 792 +29 539 273 +30 576 836 +31 491 411 +32 430 725 +33 727 248 +34 532 825 +35 457 218 +36 398 153 +37 942 597 +38 8 330 +39 637 85 +40 75 781 +41 578 635 +42 560 188 +43 27 523 +44 432 198 +45 359 691 +46 695 372 +47 203 307 +48 641 389 +49 836 612 +50 375 499 +51 818 980 +52 577 226 +53 889 259 +54 516 324 +55 102 346 +56 318 976 +57 223 11 +58 484 245 +59 365 982 +60 648 790 +61 878 261 +62 600 800 +63 493 722 +64 549 214 +65 714 918 +66 638 166 +67 452 172 +68 711 687 +69 924 905 +70 326 662 +71 786 203 +72 24 32 +73 529 661 +74 843 248 +75 115 449 +76 82 971 +77 876 644 +78 322 24 +79 642 810 +80 685 607 +81 141 824 +82 351 732 +83 641 954 +84 330 941 +85 830 188 +86 469 250 +87 970 812 +88 723 360 +89 274 238 +90 668 103 +91 562 82 +92 269 147 +93 135 493 +94 895 953 +95 930 729 +96 579 972 +97 901 987 +98 546 102 +99 664 479 +100 967 393 +101 388 767 +102 977 995 +103 933 329 +104 947 364 +105 242 400 +106 991 716 +107 983 38 +108 738 728 +109 436 466 +110 346 490 +111 639 634 +112 765 715 +113 772 60 +114 254 183 +115 804 906 +116 150 451 +117 378 297 +118 881 802 +119 959 912 +120 225 450 +121 213 802 +122 842 994 +123 662 474 +124 20 116 +125 562 217 +126 709 544 +127 50 682 +128 771 244 +129 538 704 +130 506 883 +131 341 389 +132 414 522 +133 583 435 +134 210 579 +135 326 715 +136 92 24 +137 969 100 +138 252 841 +139 879 544 +140 648 720 +141 291 405 +142 14 19 +143 446 28 +144 130 966 +145 978 572 +146 333 105 +147 558 84 +148 288 10 +149 783 837 +150 1000 230 +151 319 895 +152 76 494 +153 289 952 +154 254 165 +155 915 405 +156 151 945 +157 407 685 +158 294 824 +159 106 831 +160 373 284 +161 875 321 +162 768 758 +163 735 150 +164 304 323 +165 760 158 +166 277 663 +167 217 608 +168 712 264 +169 958 12 +170 879 873 +171 52 214 +172 63 197 +173 690 714 +174 579 862 +175 313 245 +176 32 608 +177 9 608 +178 840 747 +179 152 742 +180 994 868 +181 294 57 +182 76 784 +183 302 11 +184 527 742 +185 753 939 +186 156 870 +187 571 127 +188 913 884 +189 922 146 +190 900 41 +191 346 427 +192 637 341 +193 162 87 +194 581 979 +195 93 14 +196 888 48 +197 168 188 +198 427 499 +199 856 260 +200 54 332 +201 459 387 +202 118 61 +203 754 299 +204 233 411 +205 883 640 +206 288 268 +207 489 533 +208 720 892 +209 115 418 +210 22 358 +211 839 126 +212 516 272 +213 162 208 +214 361 714 +215 157 512 +216 826 443 +217 855 12 +218 798 356 +219 882 889 +220 554 183 +221 354 851 +222 776 448 +223 21 719 +224 812 664 +225 650 254 +226 196 793 +227 668 231 +228 412 946 +229 57 773 +230 911 335 +231 490 922 +232 371 480 +233 723 473 +234 223 658 +235 234 50 +236 408 609 +237 118 434 +238 393 488 +239 225 141 +240 444 66 +241 547 252 +242 132 189 +243 865 488 +244 106 475 +245 636 540 +246 104 269 +247 135 647 +248 222 849 +249 844 424 +250 428 875 +251 94 941 +252 325 93 +253 957 47 +254 172 293 +255 381 958 +256 148 504 +257 588 69 +258 863 453 +259 709 51 +260 129 266 +261 679 164 +262 977 422 +263 372 843 +264 912 957 +265 1000 521 +266 442 912 +267 743 716 +268 838 43 +269 649 346 +270 144 771 +271 771 321 +272 454 383 +273 553 361 +274 419 490 +275 482 77 +276 13 726 +277 967 302 +278 556 701 +279 484 665 +280 969 209 +281 972 422 +282 297 676 +283 461 532 +284 476 864 +285 978 988 +286 340 827 +287 675 391 +288 895 110 +289 225 785 +290 832 207 +291 465 723 +292 289 259 +293 281 611 +294 875 10 +295 752 271 +296 926 12 +297 539 782 +298 25 72 +299 530 546 +300 772 963 +301 724 627 +302 791 367 +303 375 323 +304 0 91 +305 385 995 +306 132 510 +307 941 144 +308 488 274 +309 403 745 +310 965 258 +311 456 817 +312 313 773 +313 486 256 +314 657 8 +315 231 914 +316 256 745 +317 668 922 +318 528 298 +319 153 272 +320 303 733 +321 814 649 +322 352 306 +323 187 498 +324 141 175 +325 115 362 +326 857 350 +327 878 459 +328 663 898 +329 592 503 +330 222 391 +331 846 792 +332 461 617 +333 592 526 +334 582 527 +335 290 396 +336 333 441 +337 292 402 +338 522 501 +339 489 939 +340 781 370 +341 197 119 +342 582 192 +343 299 353 +344 506 792 +345 638 178 +346 755 124 +347 654 335 +348 917 986 +349 277 98 +350 986 960 +351 66 850 +352 623 623 +353 602 913 +354 674 0 +355 125 625 +356 937 264 +357 430 671 +358 171 691 +359 1 656 +360 374 862 +361 407 938 +362 284 116 +363 939 702 +364 155 256 +365 504 293 +366 770 501 +367 764 790 +368 702 683 +369 525 835 +370 839 711 +371 379 711 +372 140 264 +373 597 673 +374 657 752 +375 265 523 +376 798 514 +377 679 437 +378 843 272 +379 981 47 +380 708 837 +381 55 768 +382 965 58 +383 664 373 +384 103 28 +385 841 826 +386 47 539 +387 530 354 +388 924 776 +389 477 784 +390 69 282 +391 371 110 +392 309 154 +393 234 333 +394 460 499 +395 61 527 +396 104 132 +397 711 178 +398 602 538 +399 47 755 +400 357 66 +401 332 541 +402 332 390 +403 860 711 +404 817 206 +405 853 658 +406 440 187 +407 603 576 +408 438 190 +409 857 282 +410 169 702 +411 461 299 +412 878 549 +413 252 181 +414 714 846 +415 196 92 +416 995 201 +417 780 638 +418 724 171 +419 650 937 +420 353 961 +421 505 953 +422 801 374 +423 239 74 +424 718 26 +425 325 941 +426 0 789 +427 461 518 +428 559 493 +429 461 432 +430 330 888 +431 391 542 +432 548 841 +433 965 772 +434 252 790 +435 181 188 +436 61 446 +437 215 324 +438 181 749 +439 562 764 +440 678 70 +441 422 965 +442 985 664 +443 344 341 +444 678 370 +445 118 587 +446 483 572 +447 913 258 +448 548 391 +449 669 600 +450 951 149 +451 735 621 +452 474 67 +453 765 428 +454 615 218 +455 854 798 +456 850 728 +457 928 10 +458 154 235 +459 390 924 +460 768 589 +461 4 303 +462 204 802 +463 43 400 +464 525 257 +465 673 778 +466 850 158 +467 593 392 +468 123 233 +469 935 921 +470 130 687 +471 394 334 +472 765 405 +473 625 734 +474 540 408 +475 881 423 +476 358 553 +477 903 236 +478 524 486 +479 64 121 +480 11 847 +481 758 962 +482 981 723 +483 36 659 +484 539 348 +485 506 458 +486 762 62 +487 465 529 +488 956 508 +489 294 792 +490 173 89 +491 96 995 +492 982 670 +493 593 42 +494 473 529 +495 256 579 +496 538 566 +497 706 808 +498 373 748 +499 346 575 +500 252 819 +501 260 698 +502 538 250 +503 348 539 +504 952 444 +505 716 841 +506 84 185 +507 320 795 +508 168 346 +509 857 379 +510 84 839 +511 901 930 +512 637 820 +513 297 973 +514 61 140 +515 804 298 +516 795 51 +517 979 294 +518 492 157 +519 324 520 +520 285 618 +521 672 535 +522 306 601 +523 832 980 +524 450 987 +DEMAND_SECTION +1 0 +2 95 +3 66 +4 66 +5 50 +6 55 +7 91 +8 100 +9 73 +10 96 +11 85 +12 82 +13 72 +14 77 +15 62 +16 86 +17 100 +18 63 +19 94 +20 97 +21 78 +22 94 +23 83 +24 90 +25 71 +26 59 +27 88 +28 50 +29 65 +30 75 +31 50 +32 56 +33 90 +34 56 +35 71 +36 95 +37 93 +38 97 +39 79 +40 94 +41 69 +42 90 +43 63 +44 93 +45 82 +46 53 +47 92 +48 70 +49 88 +50 57 +51 93 +52 69 +53 66 +54 98 +55 75 +56 69 +57 87 +58 69 +59 55 +60 64 +61 92 +62 96 +63 80 +64 85 +65 66 +66 99 +67 54 +68 77 +69 67 +70 77 +71 66 +72 74 +73 93 +74 81 +75 60 +76 73 +77 64 +78 84 +79 60 +80 57 +81 95 +82 63 +83 51 +84 77 +85 67 +86 70 +87 98 +88 66 +89 60 +90 56 +91 72 +92 77 +93 71 +94 51 +95 79 +96 97 +97 93 +98 84 +99 79 +100 75 +101 86 +102 58 +103 65 +104 54 +105 57 +106 81 +107 88 +108 85 +109 82 +110 82 +111 81 +112 59 +113 81 +114 94 +115 82 +116 81 +117 94 +118 75 +119 63 +120 95 +121 54 +122 85 +123 52 +124 53 +125 67 +126 56 +127 61 +128 53 +129 80 +130 76 +131 56 +132 52 +133 61 +134 53 +135 87 +136 95 +137 73 +138 52 +139 60 +140 91 +141 98 +142 58 +143 65 +144 88 +145 60 +146 62 +147 97 +148 96 +149 59 +150 76 +151 83 +152 64 +153 83 +154 65 +155 57 +156 55 +157 93 +158 71 +159 89 +160 69 +161 93 +162 86 +163 99 +164 70 +165 56 +166 75 +167 95 +168 60 +169 54 +170 57 +171 89 +172 53 +173 73 +174 78 +175 76 +176 55 +177 96 +178 80 +179 58 +180 83 +181 75 +182 84 +183 69 +184 90 +185 57 +186 61 +187 100 +188 95 +189 59 +190 60 +191 74 +192 55 +193 92 +194 76 +195 70 +196 92 +197 85 +198 85 +199 51 +200 61 +201 63 +202 59 +203 86 +204 86 +205 71 +206 50 +207 6 +208 6 +209 10 +210 2 +211 6 +212 1 +213 1 +214 3 +215 8 +216 7 +217 9 +218 8 +219 9 +220 7 +221 6 +222 7 +223 6 +224 6 +225 8 +226 3 +227 7 +228 6 +229 2 +230 10 +231 4 +232 3 +233 3 +234 5 +235 3 +236 10 +237 2 +238 9 +239 6 +240 3 +241 7 +242 3 +243 5 +244 5 +245 2 +246 5 +247 9 +248 2 +249 9 +250 10 +251 10 +252 8 +253 4 +254 2 +255 4 +256 9 +257 10 +258 1 +259 10 +260 9 +261 8 +262 5 +263 2 +264 5 +265 3 +266 1 +267 8 +268 2 +269 8 +270 3 +271 9 +272 5 +273 2 +274 2 +275 10 +276 1 +277 1 +278 6 +279 2 +280 5 +281 7 +282 4 +283 6 +284 4 +285 7 +286 8 +287 1 +288 3 +289 7 +290 2 +291 6 +292 1 +293 7 +294 5 +295 8 +296 2 +297 6 +298 5 +299 4 +300 5 +301 6 +302 5 +303 8 +304 5 +305 9 +306 10 +307 5 +308 1 +309 10 +310 8 +311 8 +312 9 +313 4 +314 10 +315 10 +316 7 +317 9 +318 9 +319 9 +320 2 +321 1 +322 10 +323 8 +324 3 +325 3 +326 3 +327 3 +328 6 +329 5 +330 7 +331 3 +332 2 +333 9 +334 8 +335 4 +336 6 +337 9 +338 10 +339 2 +340 8 +341 2 +342 5 +343 10 +344 7 +345 2 +346 2 +347 3 +348 10 +349 1 +350 7 +351 2 +352 8 +353 6 +354 7 +355 8 +356 8 +357 9 +358 1 +359 10 +360 1 +361 1 +362 2 +363 9 +364 5 +365 9 +366 4 +367 1 +368 9 +369 5 +370 6 +371 3 +372 5 +373 8 +374 8 +375 1 +376 10 +377 5 +378 2 +379 9 +380 6 +381 7 +382 5 +383 1 +384 2 +385 2 +386 5 +387 8 +388 9 +389 5 +390 2 +391 2 +392 7 +393 8 +394 10 +395 3 +396 7 +397 8 +398 7 +399 10 +400 8 +401 10 +402 9 +403 1 +404 4 +405 3 +406 10 +407 2 +408 2 +409 5 +410 3 +411 10 +412 7 +413 8 +414 5 +415 9 +416 9 +417 3 +418 6 +419 2 +420 9 +421 5 +422 8 +423 1 +424 8 +425 8 +426 6 +427 9 +428 10 +429 10 +430 8 +431 5 +432 5 +433 6 +434 2 +435 9 +436 7 +437 7 +438 4 +439 7 +440 6 +441 3 +442 6 +443 9 +444 6 +445 8 +446 10 +447 8 +448 9 +449 2 +450 4 +451 1 +452 9 +453 2 +454 2 +455 10 +456 7 +457 4 +458 1 +459 9 +460 7 +461 6 +462 9 +463 8 +464 2 +465 5 +466 7 +467 8 +468 7 +469 4 +470 1 +471 8 +472 2 +473 4 +474 6 +475 8 +476 5 +477 8 +478 2 +479 2 +480 6 +481 10 +482 10 +483 9 +484 2 +485 8 +486 7 +487 1 +488 5 +489 7 +490 8 +491 5 +492 1 +493 9 +494 4 +495 10 +496 2 +497 1 +498 8 +499 2 +500 6 +501 7 +502 5 +503 8 +504 5 +505 9 +506 3 +507 9 +508 6 +509 2 +510 3 +511 2 +512 2 +513 1 +514 7 +515 7 +516 1 +517 5 +518 3 +519 7 +520 5 +521 1 +522 8 +523 9 +524 3 +DEPOT_SECTION + 1 + -1 +EOF