2017-11-15 14 views
0

Ich arbeite an einer TSP-Anwendung, die das Plotten verschiedener Punkte auf einer Karte beinhaltet. Ich brauche jede mögliche Kombination, um einmal und nur einmal gezeichnet zu werden. Der untenstehende Code ergibt für mich logisch Sinn, allerdings wird er nicht ein paar Mal umgangen, was viel, viel weniger ist, als es eigentlich sein sollte.Warum ist meine JavaScript-Funktion zum Plotten aller verschiedenen Kombinationen von verschiedenen Zahlen stoppen nach nur ein paar Läufe

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; 

} 

Ich hoffe, ich habe diesen Code in Ordnung kommentiert und es ist lesbar, wenn nicht, würde ich gerne alle Lücken ausfüllen. Vielen Dank im Voraus

+0

Kannst du uns den Code zeigen, der eine Wende darstellt? Was ruft die Zeichenfunktion auf? Es kann auch sinnvoll sein, einige der Funktionen wie Ellipse, Scheitelpunkt usw. zu veröffentlichen. So können wir überprüfen, ob der Canvas-Zeichencode korrekt funktioniert. – agmcleod

+0

es sieht aus wie 'Hunde' bleibt leer, ich kann nirgends sehen, wo du in' Hunde' drückst. In Schleifen ist die console.log nützlich, um zu verfolgen, was passiert – mjwatts

+0

Ich bin eigentlich nicht ganz sicher, was die Ziehfunktion aufrufen, ich bin sehr neu in JS und dachte, dass es eigentümlich war, wie die Zeichenfunktion aufgerufen wurde obwohl es nirgendwo tatsächlich aufgerufen wurde. Dies ist nur eine JavaScript-Skriptdatei, die einfach auf einer ansonsten komplett leeren Indexseite verlinkt ist. Es verwendet die JavaScript-Bibliothek p5 für die Zeichenfunktionen, die Sie erwähnt haben. – jamezyx

Antwort

0

Wenn ich richtig verstehe, was Sie zu tun versuchen, ich denke, das Problem ist, dass Sie Swaps sind zu erinnern (in prevComps), anstatt vollen Sequenzen ..

So versucht, vielleicht an der Arbeit mit Index-Arrays - beginnend mit indices = [0, 1, 2, 3, ...], zeichnen Sie die Linie über dogs[indices[i]] anstatt dogs[i], dann tauschen Indizes um (anstatt dogs zu ändern), dann Kopien von ganzen Indizes in prevComps, und nicht nur die beiden Zahlen (i und j), die waren in einer Iteration getauscht.

Verwandte Themen