第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從 Java 中的 Google DistanceMatrix 響應(yīng)計算二維距離矩陣

從 Java 中的 Google DistanceMatrix 響應(yīng)計算二維距離矩陣

慕的地8271018 2022-12-15 15:12:20
我正在嘗試使用 Google 或工具庫解決旅行推銷員問題和車輛路徑問題,在此處找到的教程中,他們使用距離矩陣whose i, j條目是從位置 i 到位置 j 的距離(以英里為單位),其中給出了位置以下順序:紐約 1. 洛杉磯 2. 芝加哥 3. 明尼阿波利斯 4. 丹佛 5. 達拉斯 6. 西雅圖 7. 波士頓 8. 舊金山 9. 圣路易斯 圣路易斯 10. 休斯頓 11. 菲尼克斯 12. 鹽湖城它們的矩陣距離如下所示:  public final long[][] distanceMatrix = {      {0, 2451, 713, 1018, 1631, 1374, 2408, 213, 2571, 875, 1420, 2145, 1972},      {2451, 0, 1745, 1524, 831, 1240, 959, 2596, 403, 1589, 1374, 357, 579},      {713, 1745, 0, 355, 920, 803, 1737, 851, 1858, 262, 940, 1453, 1260},      {1018, 1524, 355, 0, 700, 862, 1395, 1123, 1584, 466, 1056, 1280, 987},      {1631, 831, 920, 700, 0, 663, 1021, 1769, 949, 796, 879, 586, 371},      {1374, 1240, 803, 862, 663, 0, 1681, 1551, 1765, 547, 225, 887, 999},      {2408, 959, 1737, 1395, 1021, 1681, 0, 2493, 678, 1724, 1891, 1114, 701},      {213, 2596, 851, 1123, 1769, 1551, 2493, 0, 2699, 1038, 1605, 2300, 2099},      {2571, 403, 1858, 1584, 949, 1765, 678, 2699, 0, 1744, 1645, 653, 600},      {875, 1589, 262, 466, 796, 547, 1724, 1038, 1744, 0, 679, 1272, 1162},      {1420, 1374, 940, 1056, 879, 225, 1891, 1605, 1645, 679, 0, 1017, 1200},      {2145, 357, 1453, 1280, 586, 887, 1114, 2300, 653, 1272, 1017, 0, 504},      {1972, 579, 1260, 987, 371, 999, 701, 2099, 600, 1162, 1200, 504, 0},  };他們進一步提供了一個關(guān)于如何動態(tài)創(chuàng)建距離矩陣的教程Python,除了它在里面而且我不是很擅長,我正在使用Java.在我的 Javaimplementation中,我正在使用Java Client,我的代碼看起來像
查看完整描述

1 回答

?
汪汪一只貓

TA貢獻1898條經(jīng)驗 獲得超8個贊

我確實解決了這個問題。我用Euclidean distance formular來得到一個距離矩陣


/// @brief Compute Euclidean distance matrix from locations array.

/// @details It uses an array of locations and computes

/// the Euclidean distance between any two locations.

private static long[][] computeEuclideanDistanceMatrix(long[][] locations) {

    // Calculate distance matrix using Euclidean distance.

    long[][] distanceMatrix = new long[locations.length][locations.length];

    for (int fromNode = 0; fromNode < locations.length; ++fromNode) {

        for (int toNode = 0; toNode < locations.length; ++toNode) {

            if (fromNode == toNode) {

                distanceMatrix[fromNode][toNode] = 0;

            } else {

                distanceMatrix[fromNode][toNode] =

                        (long) Math.hypot(locations[toNode][0] - locations[fromNode][0],

                                locations[toNode][1] - locations[fromNode][1]);

            }

        }

    }

    return distanceMatrix;

}

完整的解決方案看起來像


public static Assignment findWithVehicleRoutingProblem(List<LatLng> destinations, int numOfVehicles) {

    long[][] distanceMatrix = RoutUtils.computeEuclideanDistanceMatrix(RoutUtils.scaleCoordinatesForEuclidean(destinations));

    RoutingIndexManager manager = new RoutingIndexManager(distanceMatrix.length, numOfVehicles, 0);


    RoutingModel routing = new RoutingModel(manager);

    final int transitCallbackIndex = routing.registerTransitCallback((long fromIndex, long toIndex) -> {

        int fromNode = manager.indexToNode(fromIndex);

        int toNode = manager.indexToNode(toIndex);

        return distanceMatrix[fromNode][toNode];

    });


    routing.setArcCostEvaluatorOfAllVehicles(transitCallbackIndex);


    routing.addDimension(transitCallbackIndex, 0, 3000,

            true, 

            "Distance");

    RoutingDimension distanceDimension = routing.getMutableDimension("Distance");

    distanceDimension.setGlobalSpanCostCoefficient(100);


    RoutingSearchParameters searchParameters = main.defaultRoutingSearchParameters()

            .toBuilder()

            .setFirstSolutionStrategy(FirstSolutionStrategy.Value.PATH_CHEAPEST_ARC)

            .build();


    return routing.solveWithParameters(searchParameters);

}

哪里findWithVehicleRoutingProblem有一個arraylistof destinations。LatLng是一個簡單的類,看起來像


public class LatLng  {

public double lat;

public double lng;

}

和scaleCoordinatesForEuclidean方法


private static final long DISTANCE_MATRIX_SCALE_FACTOR = 100000000000L;

   private static long[][] scaleCoordinatesForEuclidean(List<LatLng> destinations) {

    long[][] locations = new long[destinations.size()][destinations.size()];

    for (int i = 0; i < destinations.size(); i++) {

        long[] coordinate = {(long) (destinations.get(i).lat * DISTANCE_MATRIX_SCALE_FACTOR), (long) (destinations.get(i).lng * DISTANCE_MATRIX_SCALE_FACTOR)};

        locations[i] = coordinate;

    }

    return locations;

}


查看完整回答
反對 回復(fù) 2022-12-15
  • 1 回答
  • 0 關(guān)注
  • 148 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號