xxxxxxxxxx
156
let towns = [];
let NunberOfWheels = 6;
let rader = 10
let record_Dist
let best_Ever
let order = []
let counter = 1
function setup() {
//frameRate(100)
createCanvas(windowWidth, windowHeight);
for (let i = 0; i < NunberOfWheels; i++) {
let v = createVector(random(width),random(55,height-55));
towns[i] = v
order[i] = i
}
let d = calDist(towns, order)
record_Dist = d
best_Ever = order.slice()
}
function draw() {
background(28);
for (let i = 0; i < towns.length; i++) {
show(towns[i].x,towns[i].y)
}
totalPermutation = factorial(towns.length)
complete = (counter/totalPermutation)*100
stroke(255)
strokeWeight(0.25)
noFill()
beginShape()
for (let i = 0; i < order.length; i++) {
n = order[i]
vertex(towns[n].x,towns[n].y)
}
endShape()
stroke(255,0,0)
strokeWeight(4)
noFill()
beginShape()
for (let i = 0; i < order.length; i++) {
n = best_Ever[i]
vertex(towns[n].x,towns[n].y)
}
endShape()
next_Order()
let d = calDist(towns,order)
if( d < record_Dist){
record_Dist = d
best_Ever = order.slice()
}
textSize(25)
let s = ""
for(let i = 0; i < order.length; i++){
s += order[i]
}
noStroke()
fill(255)
//text("Current Permutation: "+s,0,25)
text("Complete: "+nf(complete,0,2)+"%",width-225,25)
text("Best Distance: "+nf(record_Dist,0,2),0,25)
// record_Dist = d
}
function show(x,y) {
noStroke();
fill(220);
circle(x, y, rader);
}
function mousePressed() {
loop()
let r = rader;
counter = 1
let v = createVector(mouseX,mouseY)
towns.push(v);
order = []
for (let i = 0; i < towns.length; i++) {
order[i] = i
}
let d = calDist(towns,order)
record_Dist = d
best_Ever = order.slice()
}
function swap(a, k, j){
let temp = a[k]
a[k] = a[j]
a[j] = temp
}
function calDist(points,order){
let sum = 0
for(let i = 0; i < order.length-1; i++){
let cityAIndex = order[i]
let cityA = points[cityAIndex]
let cityBIndex = order[i+1]
let cityB = points[cityBIndex]
let d = dist(cityA.x , cityA.y, cityB.x , cityB.y)
sum += d
}
return sum
}
function next_Order(){
counter++
let largest_I = -1
let largest_J = -1
for(let i = 0; i < order.length-1; i++){
if(order[i] < order[i+1]){
largest_I = i
}
}
if(largest_I == -1){
noLoop()
console.log("Finished")
}
for(let j = 0; j < order.length; j++){
if(order[largest_I] < order[j]){
largest_J = j
}
}
swap(order, largest_I, largest_J)
let endArray = order.splice(largest_I+1)
endArray.reverse()
order = order.concat(endArray)
}
function factorial(n){
if(n == 1){
return 1
}else{
return n * factorial(n-1)
}
}