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
相关产品推荐
相关产品推荐

