Почему моя функция JavaScript позволяет отображать все различные комбинации различных номеров, останавливаясь только после нескольких прогонов

92
5

Я работаю над приложением TSP, которое включает в себя нанесение различных точек на карту. Мне нужно, чтобы каждая возможная комбинация была построена один раз и только один раз. Код ниже логически имеет смысл для меня, однако он не проходит несколько поворотов, что много, во много раз меньше, чем нужно.

var dogs = [];
var totalDogs = 9;
var prevComps = [];
var count = 0;

function setup() {

//Define the canvas
createCanvas(700, 575);

//Generate a random vector position for each dog
for (var i = 0; i < totalDogs ; i++){
var vectorPoints = createVector(random(width), random(height));
dogs[i] = vectorPoints;
}
}

function draw() {

//Sets the background to black and the circles (ellipses) to white
background(0);
fill(255);
for (var i = 0; i < dogs.length; i++){
ellipse(dogs[i].x, dogs[i].y, 8, 8);
}

//Defines the lines/paths
stroke(255);
strokeWeight(2);
noFill();
beginShape();

//Draw every dog on the map at their randomly generated vector point
for (var i = 0; i < dogs.length; i++){
vertex(dogs[i].x, dogs[i].y);
}

endShape();

//Creates two random numbers within the range of our array and swaps them
var i = floor(random(dogs.length));
var j = floor(random(dogs.length));

//Creates an array, stores the random numbers there to be compared and creates an "isNew" bool to determine if this pair has already been created
var comp = [];
comp.push(i);
comp.push(j);
var isNew = true;

//Checks to see if the new combo has been used before and thus stored in our previous comparison array
for(l = 0; l < prevComps.length; l++){
if(prevComps[l][0] == comp[0] && prevComp[l][1] == comp[1]){
isNew = false;
}
}

//If isNew is still true, the combination must be unique and so increase our count, add it to the prevComp array and finally swap the elements
if(isNew == true){

count++;
prevComps.push(comp);

//testing purposes
document.getElementById("demo").innerHTML = count;

swap(dogs, i, j)

}

}

//Simple swap function
function swap(a, i, j){

var tempVar = a[i]
a[i] = a[j];
a[j] = tempVar;

}

Надеюсь, я прокомментировал этот код, и он читаем, если бы я не был счастлив заполнить любые пробелы. заранее спасибо

спросил(а) 2020-04-04T01:40:21+03:00 3 месяца назад
1
Решение
68

Если я правильно понимаю, что вы пытаетесь сделать, я думаю, проблема в том, что вы помните свопы (в prevComps), а не полные последовательности.

Поэтому, возможно, попытайтесь работать с индексными массивами - начиная с indices = [0, 1, 2, 3,...], нарисуйте линию через dogs[indices[i]] а не на dogs[i], а затем поменяйте индексы вокруг ( вместо того, чтобы модифицировать dogs), затем хранить копии целых индексов в prevComps, а не только два числа (i и j), которые были заменены на одной итерации.

ответил(а) 2020-04-04T01:52:38.506720+03:00 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема