我最近用其他语言移植了这段代码。它应该通过一些概率估计并继续运行它们直到它收敛于解决方案。收敛性由任何低于某个阈值的概率的最大变化决定。这在另一种语言中完美运行。在第一次迭代中,最大概率变化应该是50%,第二次,它应该是22%等等,它应该相当快地收敛。
然而,在javascript中,它只会进行两次迭代才能获得"卡住"并无限循环。我确定这里有一个非常简单的错误,但我似乎无法在我的生命中找到它。知道发生了什么吗?
这是一个小提琴:http://jsfiddle.net/LxLhuc0k/
var probs = new Array();
for (i=0; i<=99; i++) {
for (j=0; j<=99; j++) {
for (k=0; k<=99; k++){
probs[i,j,k]=.5;
}
}
}
var maxChange=100;
while (maxChange>.01) {
maxChange=0;
for (i=0; i<=99; i++) {
for (j=0; j<=99; j++) {
for (k=0; k<=99; k++){
oldValue=probs[i,j,k];
probs[i,j,k]=Math.max(
.2125*getValue(i,j,k+1)
+.3900*getValue(i,j,k+5)
+.0920*getValue(i,j,k+10)
+.0370*getValue(i,j,k+15)
+.0560*getValue(i,j,k+20)
+.0008*getValue(i,j,k+25)
+.0016*getValue(i,j,k+40)
+.0001*getValue(i,j,k+60)
+.2100*(1-getValue(j,i,0))
,1-getValue(j,i+k,0)
);
if (Math.abs(probs[i,j,k]-oldValue)>maxChange) maxChange=Math.abs(probs[i,j,k]-oldValue);
}
}
}
alert(maxChange);
}
alert('Done!');
function getValue(x, y, z) {
if (x+z>99) return(1);
if (y>99) return(0);
return(probs[x,y,z]);
}