/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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
*
* http://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.
*/
package org.apache.mahout.ga.watchmaker.travellingsalesman;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* This class contains data about cities in Europe and the distances between them.
*
* <br>
* The original code is from <b>the Watchmaker project</b> (https://watchmaker.dev.java.net/).
*/
public final class EuropeanDistanceLookup implements DistanceLookup {
private static final Map<String,Map<String,Integer>> DISTANCES = new HashMap<String,Map<String,Integer>>(15);
static {
// Distances are in km as the crow flies (from http://www.indo.com/distance/)
Map<String,Integer> amsterdam = Maps.newHashMapWithExpectedSize(20);
amsterdam.put("Amsterdam", 0);
amsterdam.put("Athens", 2162);
amsterdam.put("Berlin", 576);
amsterdam.put("Brussels", 171);
amsterdam.put("Copenhagen", 622);
amsterdam.put("Dublin", 757);
amsterdam.put("Helsinki", 1506);
amsterdam.put("Lisbon", 1861);
amsterdam.put("London", 356);
amsterdam.put("Luxembourg", 318);
amsterdam.put("Madrid", 1477);
amsterdam.put("Paris", 429);
amsterdam.put("Rome", 1304);
amsterdam.put("Stockholm", 1132);
amsterdam.put("Vienna", 938);
DISTANCES.put("Amsterdam", amsterdam);
Map<String,Integer> athens = Maps.newHashMapWithExpectedSize(20);
athens.put("Amsterdam", 2162);
athens.put("Athens", 0);
athens.put("Berlin", 1801);
athens.put("Brussels", 2089);
athens.put("Copenhagen", 2140);
athens.put("Dublin", 2860);
athens.put("Helsinki", 2464);
athens.put("Lisbon", 2854);
athens.put("London", 2391);
athens.put("Luxembourg", 1901);
athens.put("Madrid", 2374);
athens.put("Paris", 2097);
athens.put("Rome", 1040);
athens.put("Stockholm", 2410);
athens.put("Vienna", 1280);
DISTANCES.put("Athens", athens);
Map<String,Integer> berlin = Maps.newHashMapWithExpectedSize(20);
berlin.put("Amsterdam", 576);
berlin.put("Athens", 1801);
berlin.put("Berlin", 0);
berlin.put("Brussels", 648);
berlin.put("Copenhagen", 361);
berlin.put("Dublin", 1315);
berlin.put("Helsinki", 1108);
berlin.put("Lisbon", 2310);
berlin.put("London", 929);
berlin.put("Luxembourg", 595);
berlin.put("Madrid", 1866);
berlin.put("Paris", 877);
berlin.put("Rome", 1185);
berlin.put("Stockholm", 818);
berlin.put("Vienna", 525);
DISTANCES.put("Berlin", berlin);
Map<String,Integer> brussels = Maps.newHashMapWithExpectedSize(20);
brussels.put("Amsterdam", 171);
brussels.put("Athens", 2089);
brussels.put("Berlin", 648);
brussels.put("Brussels", 0);
brussels.put("Copenhagen", 764);
brussels.put("Dublin", 780);
brussels.put("Helsinki", 1649);
brussels.put("Lisbon", 1713);
brussels.put("London", 321);
brussels.put("Luxembourg", 190);
brussels.put("Madrid", 1315);
brussels.put("Paris", 266);
brussels.put("Rome", 1182);
brussels.put("Stockholm", 1284);
brussels.put("Vienna", 917);
DISTANCES.put("Brussels", brussels);
Map<String,Integer> copenhagen = Maps.newHashMapWithExpectedSize(20);
copenhagen.put("Amsterdam", 622);
copenhagen.put("Athens", 2140);
copenhagen.put("Berlin", 361);
copenhagen.put("Brussels", 764);
copenhagen.put("Copenhagen", 0);
copenhagen.put("Dublin", 1232);
copenhagen.put("Helsinki", 885);
copenhagen.put("Lisbon", 2477);
copenhagen.put("London", 953);
copenhagen.put("Luxembourg", 799);
copenhagen.put("Madrid", 2071);
copenhagen.put("Paris", 1028);
copenhagen.put("Rome", 1540);
copenhagen.put("Stockholm", 526);
copenhagen.put("Vienna", 876);
DISTANCES.put("Copenhagen", copenhagen);
Map<String,Integer> dublin = Maps.newHashMapWithExpectedSize(20);
dublin.put("Amsterdam", 757);
dublin.put("Athens", 2860);
dublin.put("Berlin", 1315);
dublin.put("Brussels", 780);
dublin.put("Copenhagen", 1232);
dublin.put("Dublin", 0);
dublin.put("Helsinki", 2021);
dublin.put("Lisbon", 1652);
dublin.put("London", 469);
dublin.put("Luxembourg", 961);
dublin.put("Madrid", 1458);
dublin.put("Paris", 787);
dublin.put("Rome", 1903);
dublin.put("Stockholm", 1625);
dublin.put("Vienna", 1687);
DISTANCES.put("Dublin", dublin);
Map<String,Integer> helsinki = Maps.newHashMapWithExpectedSize(20);
helsinki.put("Amsterdam", 1506);
helsinki.put("Athens", 2464);
helsinki.put("Berlin", 1108);
helsinki.put("Brussels", 1649);
helsinki.put("Copenhagen", 885);
helsinki.put("Dublin", 2021);
helsinki.put("Helsinki", 0);
helsinki.put("Lisbon", 3362);
helsinki.put("London", 1823);
helsinki.put("Luxembourg", 1667);
helsinki.put("Madrid", 2949);
helsinki.put("Paris", 1912);
helsinki.put("Rome", 2202);
helsinki.put("Stockholm", 396);
helsinki.put("Vienna", 1439);
DISTANCES.put("Helsinki", helsinki);
Map<String,Integer> lisbon = Maps.newHashMapWithExpectedSize(20);
lisbon.put("Amsterdam", 1861);
lisbon.put("Athens", 2854);
lisbon.put("Berlin", 2310);
lisbon.put("Brussels", 1713);
lisbon.put("Copenhagen", 2477);
lisbon.put("Dublin", 1652);
lisbon.put("Helsinki", 3362);
lisbon.put("Lisbon", 0);
lisbon.put("London", 1585);
lisbon.put("Luxembourg", 1716);
lisbon.put("Madrid", 501);
lisbon.put("Paris", 1452);
lisbon.put("Rome", 1873);
lisbon.put("Stockholm", 2993);
lisbon.put("Vienna", 2300);
DISTANCES.put("Lisbon", lisbon);
Map<String,Integer> london = Maps.newHashMapWithExpectedSize(20);
london.put("Amsterdam", 356);
london.put("Athens", 2391);
london.put("Berlin", 929);
london.put("Brussels", 321);
london.put("Copenhagen", 953);
london.put("Dublin", 469);
london.put("Helsinki", 1823);
london.put("Lisbon", 1585);
london.put("London", 0);
london.put("Luxembourg", 494);
london.put("Madrid", 1261);
london.put("Paris", 343);
london.put("Rome", 1444);
london.put("Stockholm", 1436);
london.put("Vienna", 1237);
DISTANCES.put("London", london);
Map<String,Integer> luxembourg = Maps.newHashMapWithExpectedSize(20);
luxembourg.put("Amsterdam", 318);
luxembourg.put("Athens", 1901);
luxembourg.put("Berlin", 595);
luxembourg.put("Brussels", 190);
luxembourg.put("Copenhagen", 799);
luxembourg.put("Dublin", 961);
luxembourg.put("Helsinki", 1667);
luxembourg.put("Lisbon", 1716);
luxembourg.put("London", 494);
luxembourg.put("Luxembourg", 0);
luxembourg.put("Madrid", 1282);
luxembourg.put("Paris", 294);
luxembourg.put("Rome", 995);
luxembourg.put("Stockholm", 1325);
luxembourg.put("Vienna", 761);
DISTANCES.put("Luxembourg", luxembourg);
Map<String,Integer> madrid = Maps.newHashMapWithExpectedSize(20);
madrid.put("Amsterdam", 1477);
madrid.put("Athens", 2374);
madrid.put("Berlin", 1866);
madrid.put("Brussels", 1315);
madrid.put("Copenhagen", 2071);
madrid.put("Dublin", 1458);
madrid.put("Helsinki", 2949);
madrid.put("Lisbon", 501);
madrid.put("London", 1261);
madrid.put("Luxembourg", 1282);
madrid.put("Madrid", 0);
madrid.put("Paris", 1050);
madrid.put("Rome", 1377);
madrid.put("Stockholm", 2596);
madrid.put("Vienna", 1812);
DISTANCES.put("Madrid", madrid);
Map<String,Integer> paris = Maps.newHashMapWithExpectedSize(20);
paris.put("Amsterdam", 429);
paris.put("Athens", 2097);
paris.put("Berlin", 877);
paris.put("Brussels", 266);
paris.put("Copenhagen", 1028);
paris.put("Dublin", 787);
paris.put("Helsinki", 1912);
paris.put("Lisbon", 1452);
paris.put("London", 343);
paris.put("Luxembourg", 294);
paris.put("Madrid", 1050);
paris.put("Paris", 0);
paris.put("Rome", 1117);
paris.put("Stockholm", 1549);
paris.put("Vienna", 1037);
DISTANCES.put("Paris", paris);
Map<String,Integer> rome = Maps.newHashMapWithExpectedSize(20);
rome.put("Amsterdam", 1304);
rome.put("Athens", 1040);
rome.put("Berlin", 1185);
rome.put("Brussels", 1182);
rome.put("Copenhagen", 1540);
rome.put("Dublin", 1903);
rome.put("Helsinki", 2202);
rome.put("Lisbon", 1873);
rome.put("London", 1444);
rome.put("Luxembourg", 995);
rome.put("Madrid", 1377);
rome.put("Paris", 1117);
rome.put("Rome", 0);
rome.put("Stockholm", 1984);
rome.put("Vienna", 765);
DISTANCES.put("Rome", rome);
Map<String,Integer> stockholm = Maps.newHashMapWithExpectedSize(20);
stockholm.put("Amsterdam", 1132);
stockholm.put("Athens", 2410);
stockholm.put("Berlin", 818);
stockholm.put("Brussels", 1284);
stockholm.put("Copenhagen", 526);
stockholm.put("Dublin", 1625);
stockholm.put("Helsinki", 396);
stockholm.put("Lisbon", 2993);
stockholm.put("London", 1436);
stockholm.put("Luxembourg", 1325);
stockholm.put("Madrid", 2596);
stockholm.put("Paris", 1549);
stockholm.put("Rome", 1984);
stockholm.put("Stockholm", 0);
stockholm.put("Vienna", 1247);
DISTANCES.put("Stockholm", stockholm);
Map<String,Integer> vienna = Maps.newHashMapWithExpectedSize(20);
vienna.put("Amsterdam", 938);
vienna.put("Athens", 1280);
vienna.put("Berlin", 525);
vienna.put("Brussels", 917);
vienna.put("Copenhagen", 876);
vienna.put("Dublin", 1687);
vienna.put("Helsinki", 1439);
vienna.put("Lisbon", 2300);
vienna.put("London", 1237);
vienna.put("Luxembourg", 761);
vienna.put("Madrid", 1812);
vienna.put("Paris", 1037);
vienna.put("Rome", 765);
vienna.put("Stockholm", 1247);
vienna.put("Vienna", 0);
DISTANCES.put("Vienna", vienna);
}
@Override
public List<String> getKnownCities() {
List<String> cities = Lists.newArrayList(DISTANCES.keySet());
Collections.sort(cities);
return cities;
}
@Override
public int getDistance(String startingCity, String destinationCity) {
return DISTANCES.get(startingCity).get(destinationCity);
}
}