Php 一种克服距离矩阵API元素限制的算法

Php 一种克服距离矩阵API元素限制的算法,php,algorithm,google-maps-api-3,google-distancematrix-api,distance-matrix,Php,Algorithm,Google Maps Api 3,Google Distancematrix Api,Distance Matrix,首先,我做了StackOverflow搜索,所以我知道这是新的。请继续阅读: 所以我有一个9个位置的字符串数组,需要找到它们之间的距离,然后输入到一个算法中。我使用了谷歌的距离矩阵API,将这些地方作为起点和终点传递,它会返回一个响应,我制作了一个n x n平方矩阵,如下所示: 0 3201 4584 4821 1628 1218 1786 4738 4897 3122 0 1400 1638 1797 2756 3323 5310 5472 4523 1400

首先,我做了StackOverflow搜索,所以我知道这是新的。请继续阅读:

所以我有一个9个位置的字符串数组,需要找到它们之间的距离,然后输入到一个算法中。我使用了谷歌的距离矩阵API,将这些地方作为起点和终点传递,它会返回一个响应,我制作了一个n x n平方矩阵,如下所示:

0  3201  4584  4821  1628  1218  1786  4738  4897
3122  0  1400  1638  1797  2756  3323  5310  5472
4523  1400  0  237 3198  4156  4723  6711  6872
4760  1638  237 0  3435  4394  4961  6948  7110
1324  1846  3247  3485  0  958 1525  3931  4093
932 2854  4273  4510  1002  0  567 4873  5034
1499  3422  4840  5078  1569  567 0  5440  5602
5061  5359  6760  6998  4019  4959  5526  0  161
5233  5531  6931  7169  4190  5130  5697  171 0
在这种情况下,行和列都是地名,也就是说,相同的位置数组以相同的顺序排列,这就是为什么对角线元素为零(尽管实际上谷歌的响应由于某种原因并不总是为0),因为从它自身到一个位置应该为0

现在的问题是Google distance matrix API每个请求有25个元素的限制,其中出发地和目的地的总数不应超过25。因为我使用的是相同的起点和终点,所以这将它分解为最多12个元素。但是我正在构建的应用程序需要计算12个以上的位置,所以我正在考虑一种解决方法

一个想法是使用这种逻辑(它不是真正的代码,我写它只是为了展示算法/伪代码):


因此,基本上在这种情况下,如果地点计数超过12个地点,它将取而代之的是一个有趣的for循环,其中一个地点作为起点,所有地点作为目的地。这样我就可以将限制从12->25移动,因为它包含1个起点和24个目的地。问题是,如果超过24岁,它就无法工作。那么有没有其他方法可以克服这个问题呢?我知道必须有一种方法可以提出多个请求并填写矩阵,我想知道怎么做,因为我想不出算法。

我不确定您多久会这样做一次,但值得注意的是,这可能会随着元素数量的增加而迅速增加。发件人:

“起点的数量乘以目的地的数量等于元素的数量。”,元素从$0.01/个开始。所以,如果你要做25个出发地和25个目的地,这将是625个元素,花费6.25美元。100美元,100美元。200美元就要400美元。1000美元,就是10000美元

如果您仍想继续,下面是一些伪代码,介绍如何执行此操作(假设所有内容(包括apiCall)都是同步的,并且结果是在二维数组中):

/**
*@ PARAM位置数组您想考虑的位置
*/
var queryDistances=函数(位置){
var位置距离=[];
变量placestoconsistence=12;
/获取位置组考虑
变量位置组;
对于(变量i=0;i
我不确定您多久会这样做一次,但值得注意的是,随着元素数量的增加,这可能会迅速增加。发件人:

“起点的数量乘以目的地的数量等于元素的数量。”,元素从$0.01/个开始。所以,如果你要做25个出发地和25个目的地,这将是625个元素,花费6.25美元。100美元,100美元。200美元就要400美元。1000美元,就是10000美元

如果您仍想继续,下面是一些伪代码,介绍如何执行此操作(假设所有内容(包括apiCall)都是同步的,并且结果是在二维数组中):

/**
*@ PARAM位置数组您想考虑的位置
*/
var queryDistances=函数(位置){
var位置距离=[];
变量placestoconsistence=12;
/获取位置组考虑
变量位置组;
对于(变量i=0;i
if(count(places) > 12) {
   distanceMatrix = []
   for(place in placesArray) {
      distanceMatrix[] = apiCall->(place, placesArray); // apiCall(origin, dest)
   }
} else {
   response = apiCall->(placesArray, placesArray); // apiCall(origin, dest)
   distancesMatrix = convertResponseToDistancesMatrix(response)
}
/**
 * @param locations Array of locations you want to consider
 */
var queryDistances = function(locations) {
    var locationDistances = [];
    var placesToConsiderAtOnce = 12;

    //Get the location groups to consider
    var locationGroups;
    for(var i = 0; i < locations.length; i++){
        var locationArraysIndex = Math.floor(i / placesToConsiderAtOnce);
        locationGroups[locationArraysIndex] = locationGroups[locationArraysIndex] || [];
        locationGroups[locationArraysIndex].push(locations[i]);
    }

    //Process all combinations of the location groups
    for(var i = 0; i < locationGroups.length; i++){
        for(var j = 0; j < locationGroups.length; j++){
            var originArray = locationGroups[i];
            var destinationArray = locationGroups[j];
            var results = apiCall(originArray, destinationArray);

            for(var k = 0; k < originArray.length; k++){
                for(var l = 0; l < destinationArray.length; l++){
                    var locationDistancesFirstIndex = k + i * placesToConsiderAtOnce;
                    var locationDistancesSecondIndex = l + j * placesToConsiderAtOnce;

                    locationDistances[locationDistancesFirstIndex] = locationDistances[locationDistancesFirstIndex] || [];
                    locationDistances[locationDistancesSecondIndex] = results[k][l];
                }
            }
        }
    }

    return locationDistances;
};