Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用Google脚本为大型数据集生成距离矩阵?_Javascript_Node.js_Google Maps_Google Apps Script_Google Sheets - Fatal编程技术网

Javascript 如何使用Google脚本为大型数据集生成距离矩阵?

Javascript 如何使用Google脚本为大型数据集生成距离矩阵?,javascript,node.js,google-maps,google-apps-script,google-sheets,Javascript,Node.js,Google Maps,Google Apps Script,Google Sheets,我目前正在制作一个脚本,将大约90个地址的列表相互比较。脚本的结果应该是一个列表,其中包含从彼此到每个地址所花费的时间 我在试图解决这个问题时遇到了一系列问题。主要问题是生成的距离矩阵将包含8100个元素。Google脚本的最大执行时间为30分钟,因此脚本会一直超时 有什么方法可以改进脚本以使其运行更快 这个脚本的目的是生成一个包含StartID、EndID和Time的列表。然后我就可以过滤列表,在一个小时内找到彼此的地址 谢谢 功能映射(起点、终点){ var driving=Maps.Di

我目前正在制作一个脚本,将大约90个地址的列表相互比较。脚本的结果应该是一个列表,其中包含从彼此到每个地址所花费的时间

我在试图解决这个问题时遇到了一系列问题。主要问题是生成的距离矩阵将包含8100个元素。Google脚本的最大执行时间为30分钟,因此脚本会一直超时

有什么方法可以改进脚本以使其运行更快

这个脚本的目的是生成一个包含StartID、EndID和Time的列表。然后我就可以过滤列表,在一个小时内找到彼此的地址

谢谢

功能映射(起点、终点){
var driving=Maps.DirectionFinder.Mode.driving
var transit=Maps.DirectionFinder.Mode.transit
var模式集=驱动
var directions=Maps.newDirectionFinder()
.setOrigin(origin)
.setDestination(目的地)
.setMode(modeSet)
.设定点(真)
.getDirections()
var结果=方向
返回结果;
}
函数GoogleMaps(){
//获得距离
var sheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName(“ABC”);
var outputSheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName(“EFG”);
var lastrow=sheet.getLastRow();
var lastcolumn=sheet.getLastColumn();
var范围=sheet.getRange(2,3,lastrow-1,3);
//var范围=sheet.getRange(2,3,3,3);
//原点位于第2行第3列
var values=range.getValues();
变量输出=[]
对于(变量i=0;i}
这可能并不比您的性能好多少,但请尝试将其分解为一个更模块化的解决方案,然后您可以通过一次在某个子集中进行优化来决定要优化的部分

函数getValuesArray(值){
设valueArray=[];
for(设i=0;iitems.map(item=>Array.isArray(item)?clone(item):{…item
});
//可能只需要列表1,但为了清晰起见,这里使用两个
const list2=克隆(list1);
常量列表=[];
对于(var a=0;a}
您要做的第一件事是减少在
for
循环中执行的操作数。因此,让我们先从算法角度分析这一点

在当前的实现中,您基本上是在一组90个值上计算值,以生成一个由8100个值组成的新集

但是,该结果集中存在许多冗余值,因此:

  • 结果集包括使用相同地址作为起始和结束位置的计算

  • 两个地址之间的距离计算两次;这样地址A是起始地址,地址B是结束地址,在另一次迭代中,地址A是结束地址,地址B是起始地址

    警告:我假设在两个地址之间的传输过程中,无论一个地址的传输方式如何,您都覆盖相同的距离 方向(即A-to-B或B-to-A)。你的情况可能不是这样 情景。

  • 您可以通过使用一个称为组合学的离散数学领域来消除这些冗余;更具体地说,使用这个可爱的公式:

    如果我们让n=90r=2得到以下结果:

    这意味着,在我们最理想的情况下,我们需要一个生成不超过4005个地址对的算法

    以此作为我们的目标,[断指]做到这一点