Есть ли какие-либо большие ошибки / неэффективности в этом решении, чтобы найти минимальное количество требуемых итераций? - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь написать немного кода для проверки минимального количества итераций, необходимого для последовательного возврата правильного результата для проблемы.

В частности, я использую проблему Монти Холла как свою рабочую проблему для решения (в идеале я обобщу ее позже). Я хочу создать систему, которая принимает вмененный целевой уровень доверия и стремится найти минимальное число итераций задачи (с известным решением), необходимых для получения решения, по крайней мере, для целевого% времени.

Мой подход к этому заключается в создании функции, которая запускает проблему до тех пор, пока ее решение не окажется в пределах одного стандартного отклонения от ожидаемого решения. Он считает, сколько итераций это потребовало. Этот процесс повторяется, сохраняя наибольшее количество итераций в качестве текущего ответа. Каждый раз, когда текущий ответ не меняется, его оценка увеличивается (это рассчитывается с учетом процента прогонов, в которых текущий ответ не изменился). Как только эта оценка равна или превышает целевой показатель, он должен вернуть этот текущий ответ.

Ниже приведен фрагмент псевдокода, который, по моему мнению, должен работать:

function runTester(runningMax, countRunningMax, countTotal){    %Tests for Max #of iterations required
        test = probIterator();                            %probIterator is a function running the Monty Hall problem
        if (test > runningMax){                                 %Max #of iterations
            runningMax = test;
        }

        countRunningMax += 1;                                   %#of tests this Max has survived
        countTotal += 1;                                     %Total #of Tests performed

        return(runningMax, countRunningMax, countTotal);
}

main(goal){

        name(3) = [0,0,0];

        for(i=0;1;10){                                      %No way Min<10
            name = runTester(name[0], name[1], name[2]);
        }

        score = name[1]/name[2];

        while(score < goal){                        %Hopefully this doesn't run on forever...
            name = runTester(name[0], name[1], name[2]);
            score = name[1]/name[2];
        }

        statement =     ('With a certainty of '
                + (score * 100)
                + '%, minimum number of iterations required to consistently
                    succesfully numerically solve the Monty Hall Problem: '
                + name[0]
                + '.');
        print(statement);
}

Если я, кажется, допустил какие-либо серьезные ошибки в моем подходе или если вы видите какие-либо явные недостатки, пожалуйста, сообщите мне.

...