2017-11-15 15 views
0

지도상의 다양한 점을 플로팅하는 TSP 응용 프로그램에서 작업하고 있습니다. 한 번에 한 번만 플롯 할 수있는 각각의 가능한 조합이 필요합니다. 아래의 코드는 논리적으로 나에게 의미가 있지만, 몇 번 돌릴 수는 없지만, 의미가있는 것보다 몇 배나 적습니다.JavaScript 함수가 몇 번의 실행 후에 여러 숫자 조합의 모든 다른 조합을 그릴 수있는 이유

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; 

} 

나는이 코드에 주석을 달았으며, 읽을 수 있으면 좋겠다. 어떤 공백도 채우면 기쁠 것이다.

+0

차례를 구성하는 코드를 표시 할 수 있습니까? draw 기능을 무엇이라고 부릅니까? 또한 타원, 정점 등의 기능을 게시 할 가치가 있습니다. 따라서 캔버스 그리기 코드가 올바르게 작동하는지 확인할 수 있습니다. – agmcleod

+0

'개'가 비어있는 것처럼 보입니다. 어디서나 '개'로 밀고가는 것을 볼 수 없습니다. 루프에서 console.log는 진행 상황을 추적하는 데 유용합니다. – mjwatts

+0

실제로 draw 함수를 호출하는 것이 확실치 않습니다. JS에 매우 익숙하며 그리기 함수가 호출되는 방식이 특이하다고 생각했습니다. 실제로 아무데도 불리지 않고 있음에도 불구하고. 이것은 단순히 완전히 다른 빈 색인 페이지에 링크 된 자바 스크립트 스크립트 파일입니다. 당신이 언급 한 그림 함수에 p5 자바 스크립트 라이브러리를 사용합니다. – jamezyx

답변

0

내가 정확하게 당신이 뭘하려는 건지 이해한다면, 나는이 문제가 오히려 전체 시퀀스보다 (prevComps에서) 스왑을 기억하고 있다는 생각 ..

것은 그래서 어쩌면 작업하려고 미리 감사드립니다 indices = [0, 1, 2, 3, ...]으로 시작하여 dogs[i]이 아닌 dogs[indices[i]]을 통해 선을 그리고 나서 ( dogs을 수정하는 대신) 인덱스를 교체 한 다음 전체 인덱스의 사본을 두 개의 숫자 ( ij)가 아닌 prevComps에 저장하십시오. 한 번의 반복으로 바뀌 었습니다.