You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript实现旅行商问题(TSP)时路径优化if判断未生效问题求助

问题根因

  • 数组属于引用类型,你编写的swap2RandomCities函数直接修改了传入的原城市数组,没有做拷贝操作。当交换后的路径更长时,你以为返回的是未修改的原路径,实际上原路径已经被交换操作改动了,这是路径偶尔变长的核心原因。
  • 次要问题:drawPath函数中最后闭合路径、计算展示路径长度时,错误使用了全局city变量而非传入的cityarray参数,存在逻辑不一致的隐患。

修复方案

1. 修改swap2RandomCities函数,先拷贝数组再做修改,不改动原数组

function swap2RandomCities(cityarray) {
  // 深拷贝传入的城市数组,所有修改都在拷贝后的数组上操作
  const newCityArray = cityarray.map(item => [...item]);
  var city1 = 1;
  var city2 = 2;
  do {
    city1 = parseInt(Math.random() * numberofCities);
    city2 = parseInt(Math.random() * numberofCities);
  } while (city1 == city2);
  // 交换拷贝数组内的两个城市
  [newCityArray[city1], newCityArray[city2]] = [newCityArray[city2], newCityArray[city1]];
  return newCityArray;
}

2. 修复drawPath函数的参数引用错误

function drawPath(cityarray) {
  ctx.moveTo(cityarray[0][0], cityarray[0][1]);
  for (i = 0; i < cityarray.length; i++) {
    if (i != 0) {
      ctx.lineTo(cityarray[i][0], cityarray[i][1]);
      ctx.stroke();
    }
    ctx.beginPath();
    ctx.arc(cityarray[i][0], cityarray[i][1], 2, 0, Math.PI * 2, true);
    ctx.fill();
  }
  // 把原来的city[0]改为传入的cityarray[0]
  ctx.lineTo(cityarray[0][0], cityarray[0][1]);
  ctx.stroke();
  ctx.font = "30px Arial";
  // 把原来计算长度用的city改为传入的cityarray
  ctx.fillText("Path Length: " + parseInt(calculatePathLength(cityarray)), 10, 50);
}

修复后每次交换操作都不会改动原城市数组,只有新生成的路径更短时才会替换全局的城市数组,不会再出现路径随机变长的问题。

内容的提问来源于stack exchange,提问作者Simon Hayes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 19:24:02