产品介绍

旅行商问题(travel salesman problem,TSP)指给定一系列地点(若地点有时间窗,则为含时间窗的旅行商问题,TSPTW),求从指定点出发经过每一个地点的最短路径。本产品提供基于API形式的TSP/TSPTW问题求解服务。

欢迎留下联系方式咨询或获取免费使用权,我们将于2个工作日内与您取得联系。

单用户单日调用优化次数上限为1000次,单次优化规模上限为50个地点。如果有更大用量和规模需求,请联系我们进一步咨询与购买。

申请使用

欢迎您在下方留下咨询信息,我们将于两个工作日内与您联系

路径优化TSP/TSPTW问题API
最后更新时间:2019-07-08

协议

HTTP协议;POST请求方式;调用和返回的数据均为Json格式。

基本规范
请求地址

请联系杉数获取访问地址、令牌等信息。

公共请求参数

为保障API接口的权限及安全等要求,服务平台所有的API接口在http请求的header中均需包含如下信息:

Header参数 备注 示例
reqTimestamp 系统时间System.currentTimeMillis() 1560331308386
key 服务平台发给用户的key
keyToken 服务平台发给用户的KeyToken
sign 签名信息, 用户根据服务平台发给用户的Secret对API中的请求信息参数按规则生成签名。生成签名的规则参考下文
x-access-token 根据key+keyToken在平台上申请的令牌
Content-Type application/json application/json
Sign签名规则

按参数的字符串进行从小到大排序,并用“&”连接

连接后字符串的结尾拼接时间戳

最终连接后的字符串转成大写

用MD5对此字符串进行加盐加密

post参数及值按key的字符串顺序从大到小排序,如果post的json结果有多层级,只对第一层级进行排序。并按以上规则进行签名。

例如:
请求body:
{"age":12,"list":[{"age":12,"name":"杉数"}],"name":"杉数","user":{"id":1,"name":"小明"}}
则签名串为:
按照第一层key进行排序,然后拼接。拼接后的待加密的明文:
age=12&list=[{"name":"杉数","age":12}]&name=杉数&user={"id":1,"name":"小明"}
请求参数
参数结构/名称 说明 类型 必填 范围 默认值
params 参数集以二级名称下为其属性 Object
isTSPTW 是否考虑时间窗,考虑时间窗:true;不考虑时间窗:false Boolean true/false false
isCloseLoop 回程是否回到出发点,回到出发点:true;不回出发点:false Boolean true/false false
mapVender 距离矩阵提供商, 经纬度距离:euclidean String euclidean euclidean
velocity 平均时速单位:km/h Double 0-100
departureTime 起点出发时间,格式:hhmm String
depotAddr 起点明文地址 String
locations 数组,以下二级名称为其数组对象中的属性 Array<Object>
locationId 除起点外的其他地点,地点代码不可重复,不可叫depot String
serviceTimeWindow 地点的工作时间窗,格式:hhmm:hhmm。结束时间必须大于开始时间 String 0000:2400
serviceDuration 地点的服务时长,单位:秒 Integer 0-100000 0
priority 地点优先级,1-10:优先级高到低。优化时,priority将会首先被考虑,在满足优先级的前提下,时间窗可以被打破 Integer 1-10 10
locationAddr 地点的明文地址,输入至少精确到省、市、区 String
参数示例:
{
 "params": {
  "isTSPTW": false,
  "isCloseLoop": false,
  "mapVender": "euclidean",
  "velocity": 0,
  "departureTime": "0930",
  "depotAddr": "上海市杨浦区纪念路8号"
},
 "locations": [
  {
  "locationId": "DD002",
  "serviceTimeWindow": "0000:2400",
  "serviceDuration": 0,
  "priority":10,
  "locationAddr": "北京市东城区歌华大厦"
  }
 ]
}
请求结果说明
结果结构/名称 说明 类型
code 状态代码,成功为0,详见状态码说明列表 String
message 状态描述 String
data Object
requestId 优化请求的唯一ID String
TSPResult 请求结果数据 Object
startDateTime 车次的出发时间,即输入参数中的departureTime,格式:hhmm String
endDateTime 车次的结束时间,格式:hhmm,跨天时间输出时做格式处理 String
totalDistance 该车次行驶的总距离, 单位:m Integer
endDateTimeDaySpan 全部完成所需跨天数,0表示没有跨天 Integer
TSPStops 以下为其参数,发生错误时为null Array<Object>
stopLocationId 停靠的站点Id String
seq 该停靠点在车次中的次序 Integer
plannedTimeOfArrival 该停靠点的计划到达时间,格式:hhmmss,不做跨天表示处理 String
plannedTimeOfArrivalDaySpan 该停靠点的计划时间(跨天天数),0表示没有跨天 Integer
plannedTimeOfDeparture 该停靠点的计划离开时间,格式:hhmmss,不做跨天表示处理 String
plannedTimeOfDepartureDaySpan 该停靠点的计划离开时间(跨天天数), 0表示没有跨天 Integer
handlingDuration 服务时长,单位:秒 Integer
waitingDuration 等待时长,单位:秒 Integer
distanceFromPreviousStop 该停靠点距离前一个停靠点的行驶距离,单位:米 Integer
drivingDurationFromPreviousStop 该停靠点距离前一个停靠点的行驶时间,单位:秒 Integer
timeWindowFulfilled 是否满足时间窗约束 Boolean
TSPError TSP计算错误信息 Object
params 参数集校验结果描述 String
location 地点列表校验结果描述 String
结果示例:
{
 "code": "0",
 "message": "操作成功",
 "data": {
  "requestId": "20180818001001",
  "TSPResult": {
   "startDateTime": "0700",
   "endDateTime": "1800",
   "totalDistance": 98710,
   "endDateTimeDaySpan": 0,
   "TSPStops": [
    {
    "stopLocationId": "depot",
    "seq": 1,
    "plannedTimeOfArrival": "073501",
    "plannedTimeOfArrivalDaySpan": 0,
    "plannedTimeOfDeparture": "074215",
    "plannedTimeOfDepartureDaySpan": 1,
    "handlingDuration": 300,
    "waitingDuration": 180,
    "distanceFromPreviousStop": 2556,
    "drivingDurationFromPreviousStop": 690,
    "timeWindowFulfilled": false
    }
   ]
  },
  "TSPError": {
   "params": " velocity值不能为空",
   "location": "locationId值不能为空"
   }
  }
}
状态码说明列表
状态代码 说明
0 成功
10011000 签名不合法
11001101 用户公司信息失效
10011002 api资源路径不存在
10011003 key令牌参数为空
10011004 key 令牌不合法
10011005 key 令牌过期,请重新获取
10011006 时间额度已过期,请重新购买
10011007 调用次数额度已无,请重新购买
10011008 时间戳不合法
10011009 key是无效的
110011010 请求超频
10121012 参数集信息错误 具体错误信息查看 TSPError.params
10122012 地点列表信息错误 具体错误信息查看 TSPError.location
10122013 地址解析数量超过50个限制

提示信息: