Peter Leow
В этом решении всего три части, читайте их с терпением. :zzz:
+++ + + [Часть 1]+++++
Это поиск грубой силы с помощью следующего алгоритма:
1. GET a list of integers
1. SET GCD = 1
2. SET DIVISOR = 2
3. WHILE DIVISOR <= the smallest integer
3.1 Divide each integers by the DIVISOR, starting with the smallest integer and proceed in ascending order
3.2 IF ALL divisions result in no remainder
3.2.1 SET GCD = DIVISOR
3.3 DIVISOR = DIVISOR + 1
4. DISPLAY GCD
Затем реализуйте его в простом старом JavaScript:
var integers = [247, 8645, 1216, 3648];
var gcd = 1;
var divisor = 2;
while(divisor <= integers[0]){
var isAllDivisible = true;
for(i=0;i<integers.length;i++){
if(integers[i] % divisor != 0){
isAllDivisible = false;
break;
}
}
if(isAllDivisible){
gcd = divisor; // continue to search
}
divisor++;
}
alert(gcd);
Edit fiddle - JSFiddle[
^]
+++ + + [Часть 2]+++++
Основным недостатком приведенного выше алгоритма поиска грубой силы является то, что он должен исчерпать поиск от 1 до наименьшего целого числа, даже если число оказывается делимым на все целые числа на этом пути.
Лучшим способом будет сделать обратное, то есть начать поиск с наименьшего целого числа и двигаться к нулю, таким образом, первое число, которое окажется делимым на все элементы, будет ответом, и поиск может быть остановлен. Этот способ потенциально может сократить пространство поиска и, как следствие, стать более эффективным. Фрагмент кода показан ниже:
var integers = [247, 8645, 1216, 3648];
var gcd = divisor = Math.min.apply(Math, integers);
while(divisor > 0){
var isAllDivisible = true;
for(i=0;i<integers.length;i++){
if(integers[i] % divisor != 0){
isAllDivisible = false;
break;
}
}
if(isAllDivisible){
gcd = divisor; // GCD found and stop searching
break;
}
divisor--;
}
alert(gcd);
Edit fiddle - JSFiddle[
^]
+++ + + [Часть 3]+++++
Это последняя часть. Как насчет того, чтобы попробовать его с помощью некоторых
Стохастическая Оптимизация.
Оптимизация-это процесс поиска оптимальных решений для проблем, которые не имеют воспринимаемого способа поиска решений (конечно, эта вещь GCD не является одной из них). Процесс оптимизации развивает оптимальные решения путем поиска случайных решений-кандидатов в пространстве поиска, отсеивая более слабые, но сохраняя более сильные на основе их пригодности. Эволюция продолжается до тех пор, пока не будут выполнены определенные конечные критерии, такие как воспринимаемая оптимальность решений или количество итераций.
Хватит болтать, давайте вернемся к этому вопросу GCD, я разработал алгоритм следующим образом:
First things first, set up the necessary parameters:
search space: lowerBound = 1, upperBound = min(integers) = 247
population size p = 10
candidates = c0,c1, ...c9
number of iteration i = 10
fitness of candidate = max(candidates)
The actual optimization process:
1. Randomly picked a population of candidate GCD's lowerBound <= c0,c1, ...c9 <= upperBound
2. Divide each integers with each candidate GCD's
r0=247/c0, ... r9=247/c9
r0=8645/c0, ... r9=8645/c9
...and so on
3. Discard those candidates that produce non-zero remainders.
4. Assign the candidate that have the best fitness to be the lowerBound of the search space. (This will reduce the search space and lead to eventual convergence to the optimal solution.)
5. Rejuvenate the population by replacing candidates that are discarded or fall below the lowerBound.
6. REPEAT step 2 UNTIL the number of iteration is reached.
Перевод всего этого в JS код:
/*
Stochastic Optimization in Search of Greatest Common Divisor (GCD)
By Peter Leow the stochastic coder
*/
var integers = [247, 8645, 1216, 3648];
// Setting parameters
var lowerBound = 1;
var upperBound = Math.min(...integers);
var populationSize = 10; // increase this for better chance
var population = [];
var maxIteration = 20; // increase this for better chance
function generatePopulation(population, populationSize, lowerBound, upperBound) {
for (var i = 1; i < populationSize; i++) {
population[i] = Math.floor((Math.random() * upperBound) + lowerBound);
}
return population;
}
var desc = ""
population[0] = lowerBound;
for (var i = 0; i < maxIteration; i++) {
desc += "Iteration: " + (i + 1) + "<br>";
// Randomly generate candidate GCD's within bound
population = generatePopulation(population, populationSize, lowerBound, upperBound);
desc += "Candidates at start: " + population + "<br>";
// Test candidates and weep out the failure
for (var j = 0; j < population.length; j++) {
for (var k = 0; k < integers.length; k++) {
if (integers[k] % population[j] != 0) {
population.splice(j, 1); // remove failed candidate from the population
j--;
break; // and break out!
}
}
}
desc += "Candidates left: " + population + "<br>";
// Find the new lower bound of the search space
if (population.length != 0) {
lowerBound = Math.max(...population);
population = [];
population[0] = lowerBound;
}
desc += "Best candidate so far: " + lowerBound + "<br>";
desc += "====================================" + "<br>";
}
document.getElementById("desc").innerHTML = desc;
И HTML-тег для отображения прогресса и результата:
<div id="desc"></div>
Edit fiddle - JSFiddle[
^]
Запустите его, и вы можете не получить правильный ответ 19, запустите его несколько раз, вы должны получить его. Если вы увеличите количество итераций или размер популяции, шансы получить правильный ответ на проблему GCD также возрастут. Мельком взгляните на пример запуска в течение 20 итераций:
Iteration: 1
Candidates at start: 1,213,240,185,219,247,207,216,160,179
Candidates left: 1
Best candidate so far: 1
====================================
Iteration: 2
Candidates at start: 1,125,159,51,177,154,134,149,78,64
Candidates left: 1
Best candidate so far: 1
====================================
Iteration: 3
Candidates at start: 1,84,153,237,234,52,5,24,43,23
Candidates left: 1
Best candidate so far: 1
====================================
Iteration: 4
Candidates at start: 1,9,195,181,46,228,14,84,235,129
Candidates left: 1
Best candidate so far: 1
====================================
Iteration: 5
Candidates at start: 1,103,241,72,22,44,30,166,109,203
Candidates left: 1
Best candidate so far: 1
====================================
Iteration: 6
Candidates at start: 1,174,4,235,3,205,23,199,190,181
Candidates left: 1
Best candidate so far: 1
====================================
Iteration: 7
Candidates at start: 1,53,139,131,180,180,222,128,181,45
Candidates left: 1
Best candidate so far: 1
====================================
Iteration: 8
Candidates at start: 1,31,136,55,168,218,101,51,94,48
Candidates left: 1
Best candidate so far: 1
====================================
Iteration: 9
Candidates at start: 1,127,133,136,19,121,171,6,96,200
Candidates left: 1,19
Best candidate so far: 19
====================================
Iteration: 10
Candidates at start: 19,65,204,241,222,63,56,116,141,38
Candidates left: 19
Best candidate so far: 19
====================================
Iteration: 11
Candidates at start: 19,47,225,41,199,222,226,239,109,209
Candidates left: 19
Best candidate so far: 19
====================================
Iteration: 12
Candidates at start: 19,243,32,120,243,25,132,168,191,235
Candidates left: 19
Best candidate so far: 19
====================================
Iteration: 13
Candidates at start: 19,218,162,78,170,159,215,137,193,165
Candidates left: 19
Best candidate so far: 19
====================================
Iteration: 14
Candidates at start: 19,141,263,247,94,49,216,146,135,181
Candidates left: 19
Best candidate so far: 19
====================================
Iteration: 15
Candidates at start: 19,224,128,252,93,48,248,172,110,78
Candidates left: 19
Best candidate so far: 19
====================================
Iteration: 16
Candidates at start: 19,48,155,179,258,190,221,142,70,48
Candidates left: 19
Best candidate so far: 19
====================================
Iteration: 17
Candidates at start: 19,51,81,231,21,135,219,93,245,124
Candidates left: 19
Best candidate so far: 19
====================================
Iteration: 18
Candidates at start: 19,81,102,46,123,166,68,159,203,239
Candidates left: 19
Best candidate so far: 19
====================================
Iteration: 19
Candidates at start: 19,203,123,219,44,24,56,200,35,226
Candidates left: 19
Best candidate so far: 19
====================================
Iteration: 20
Candidates at start: 19,129,152,22,205,248,174,131,44,121
Candidates left: 19
Best candidate so far: 19
====================================
Вы только что узнали, что решения, предлагаемые оптимизацией, могут отличаться. Заметим, что качество решений, получаемых в результате оптимизации, будет зависеть от многих факторов, некоторые из которых-размер популяции и количество итераций.
Все доро