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

JavaScript生成多组独立随机排列(Leaflet TSP研究场景)

问题分析

你的代码问题出在两个核心点:

  1. 仅对原数组执行一次洗牌操作,所有子数组复用的是同一个洗牌后的数组引用,导致所有排列完全相同
  2. 直接修改了传入的原数组,会永久改变原数组顺序,干扰后续逻辑
解决方案

要生成多组独立随机排列,需为每个排列单独执行洗牌,且每次洗牌基于原数组的副本操作,避免影响原数组和其他排列。

步骤1:实现独立洗牌函数

先写一个通用的Fisher-Yates洗牌函数,每次调用返回原数组的新随机排列副本,不修改原数组:

function shuffleArray(arr) {
  // 创建原数组的浅拷贝,避免修改原数组
  const copy = [...arr];
  for (let i = copy.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    // ES6解构赋值交换元素
    [copy[i], copy[j]] = [copy[j], copy[i]];
  }
  return copy;
}

步骤2:改写种群生成函数

函数接收原数组和需要生成的排列数量,循环调用洗牌函数生成独立排列:

function createPopulation(originalArray, populationSize) {
  const population = [];
  for (let i = 0; i < populationSize; i++) {
    // 每次生成独立的随机排列并加入种群
    population.push(shuffleArray(originalArray));
  }
  return population;
}

使用示例

// 你的原始Waypoint数组
let array = [wp1, wp2, wp3, wp4, wp5];
// 生成5组独立随机排列
const result = createPopulation(array, 5);
console.log(result);

预期输出

此时result中的每个子数组都是独立的随机排列,示例如下:

0: [wp2, wp4, wp3, wp5, wp1]
1: [wp1, wp4, wp3, wp5, wp2]
2: [wp3, wp1, wp5, wp2, wp4]
3: [wp5, wp2, wp1, wp4, wp3]
4: [wp4, wp3, wp2, wp1, wp5]
关键说明
  • 用[...arr]创建原数组的浅拷贝,L.Routing.Waypoint作为对象,浅拷贝足够保证每个排列的引用独立
  • 每次循环调用洗牌函数,确保每个子数组都是全新的随机排列
  • 不修改原数组,保留原始数据的完整性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 01:36:59