变量没有收敛......错误在哪里?

时间:2014-09-10 18:46:16

标签: javascript arrays probability

我最近用其他语言移植了这段代码。它应该通过一些概率估计并继续运行它们直到它收敛于解决方案。收敛性由任何低于某个阈值的概率的最大变化决定。这在另一种语言中完美运行。在第一次迭代中,最大概率变化应该是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]);
}

0 个答案:

没有答案