You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
150 lines
2.7 KiB
150 lines
2.7 KiB
//implemtantion of dijkstra algorithm |
|
|
|
|
|
var max = Number.MAX_SAFE_INTEGER-100; |
|
|
|
|
|
function findNodeWithMinDistAndInQ(list, Q){ |
|
var result = "NaN"; |
|
var dist = max; |
|
for(var i = 0; i < Q.length; i++){ |
|
//console.log(Q[i]); |
|
if(list.get(Q[i]) < dist){ |
|
dist = list.get(Q[i]); |
|
result = Q[i]; |
|
} |
|
} |
|
//console.log("result: "+result); |
|
return result; |
|
} |
|
|
|
function getNeighbours(array, i,j){ |
|
var result = []; |
|
if((i-1) > -1 && (i+1) < array.length && (j-1) > -1 && j+1 < array[i].length){ |
|
for(var k = -1; k < 2; k++){ |
|
for(var l = -1; l < 2; l++){ |
|
var row =i+k; |
|
var coloumn=j+l; |
|
if(array[row][coloumn].accessible){ |
|
result.push(row+"$"+coloumn); |
|
} |
|
} |
|
} |
|
} else { |
|
|
|
for(var k = -1; k < 2; k++){ |
|
for(var l = -1; l < 2; l++){ |
|
var row =i+k; |
|
var coloumn=j+l; |
|
try{ |
|
if(array[row][coloumn].accessible){ |
|
result.push(row+"$"+coloumn); |
|
} |
|
} catch(e){ |
|
////console.log("zugriff auserhalb des feldes"); |
|
} |
|
} |
|
} |
|
} |
|
|
|
return result; |
|
} |
|
|
|
|
|
/** |
|
* |
|
*/ |
|
function dijkstra(array, start_i, start_j, end_i,end_j){ |
|
|
|
var Q = []; |
|
var distance = new Map(); |
|
var pre = new Map(); |
|
|
|
|
|
for(var i = 0; i < array.length; i++){ |
|
for(var j = 0; j < array[i].length; j++){ |
|
var tmp = i+"$"+j; |
|
distance.set(tmp, max); |
|
pre.set(tmp, null); |
|
Q.push(tmp); |
|
} |
|
} |
|
|
|
distance.set(start_i+"$"+start_j, 0); |
|
var t = 0; |
|
while (Q.length !== 0){ |
|
var node = findNodeWithMinDistAndInQ(distance,Q); |
|
if(node === "NaN"){ |
|
console.log(Q); |
|
console.log(distance); |
|
|
|
return null; |
|
} |
|
|
|
Q.splice(Q.indexOf(node),1); |
|
var indices = node.split("$"); |
|
indices[0] = parseInt(10, indices[0]); |
|
indices[1] = parseInt(10, indices[1]); |
|
|
|
var neighbours = getNeighbours(array,indices[0],indices[1]); |
|
//console.log(node+" === "+end_i+"$"+end_j); |
|
|
|
if(node.localeCompare(end_i+"$"+end_j) === 0){ |
|
|
|
console.log("YAY"); |
|
|
|
console.log(t); |
|
console.log(distance); |
|
console.log(pre); |
|
|
|
|
|
|
|
return reverse(end_i+"$"+end_j,start_i+"$"+start_j,pre); |
|
} |
|
for(var i = 0; i < neighbours.length; i++){ |
|
var alt = distance.get(node)+1; |
|
|
|
if(Q.includes(neighbours[i])){ |
|
if(alt < distance.get(neighbours[i])){ |
|
distance.set(neighbours[i], alt); |
|
pre.set(neighbours[i], node); |
|
} |
|
} |
|
} |
|
//console.log(t); |
|
t++; |
|
}// |
|
|
|
console.log(t); |
|
console.log(distance); |
|
console.log(pre); |
|
|
|
return null; |
|
|
|
} |
|
|
|
function reverse(target, source, pre){ |
|
var path = []; |
|
var u = target; |
|
|
|
console.log("target: "+target); |
|
console.log("source: "+source); |
|
if(pre.get(u) != null || u === source){ |
|
console.log("hallo"); |
|
while(u != null){ |
|
console.log("hallo"); |
|
u = pre.get(u); |
|
path = [u].concat(path); |
|
} |
|
} |
|
path.push(target); |
|
path.shift(); |
|
|
|
|
|
console.log("!!!!") |
|
console.log(path); |
|
|
|
return path; |
|
|
|
|
|
} |