http://ru.wikipedia.org/wiki/%D0%90%...81%D0%B8%D1%8F
это арифметическая прогрессия, единственное число 1 как то выпадает из определения, |
Shaci,
Для арифметической прогрессии первого порядка нужно строго ДВА элемента (определяют две степени свободы: смещение относительно нуля и шаг). Тут этого ограничения явно нет. *чешет подбородок* |
Цитата:
p.s. мне одному слово ИИ режет слух?, почему то я под ним воспринимаю что-то фантастическое, а не алгоритм полного перебора компьютерного игрока в шашки) |
Цитата:
Задача класса P налицо, какой тут нафиг ИИ... |
Цитата:
там нолик затесался, с прошлой прогрессии. не знаю, почему он там остался. вот почему задача такой ажиотаж вызвала :) Цитата:
|
Цитата:
|
Цитата:
Пожалуй даже для такой суперфункции до какой-то степени можно обойтись без ИИ :) к примеру Если есть два образаца последовательности в одном массиве, и образцы операций. То можно отсеять только те операции которые дадут один результат в обоих последовательностях. Затем свести все обнаруженные операции в один паттерн, и по этому паттерну возвращать значения. Вот набросал пример (с двумя образцами операций). demo ( [0,1,2,3,4] ); demo ( [10,8,6,4,2] ); demo ( [1,2,3,2, 3,4,3] ); demo ( [1,10,100,1000,10000,100000,1000000] ); demo ( [1,2,3,30,31,32,320] ); demo ( [8192,4096,2048,1024,512] ); function demo(data){ var z =continueSequence( data ); for (var i=1;i<10;i++) var ret=z(); alert(ret); } function continueSequence(data){ matrix=[]; var matrix=zakon1(); mergeMatrix(matrix,zakon2()); console.log(matrix); var step=0; cnt=data.length; return function(){ var ret=matrix[step].calc() step++; if (step>=matrix.length) step=0; return ret; } function mergeMatrix(matrix,matrix2){ for(var i=0;i<matrix.length;i++){ if (matrix[i]==false ) matrix[i]=matrix2[i]; } } //арифметическая последовательность с шагом function zakon1(){ var res=[]; var pattern=[]; //вычислим все разницы for (var i=1;i<data.length;i++){ res[i-1]= data[i]-data[i-1] ; } pattern=helper(res,act); function act(step){ return { name:"zakon1", step:step, calc:function(){ var r=data[data.length-1]; r=r+this.step; data.push(r); return data; } }; } console.log(data); console.log(res); console.log(pattern); return pattern; } //арифметическая последовательность с шагом function zakon2(){ var res=[]; var pattern=[]; //вычислим все разницы for (var i=1;i<data.length;i++){ res[i-1]= data[i]/data[i-1] ; } pattern=helper(res,act); function act(step){ return { name:"zakon2", step:step, calc:function(){ var r=data[data.length-1]; r=r*this.step; data.push(r); return data; } }; } console.log(data); console.log(res); console.log(pattern); return pattern; } function helper(res,act){ var pattern=[]; for (var i=0;i<res.length/2;i++){ if (res[i] == res[i+res.length/2] ){ pattern[i]=act(res[i]); } else { pattern[i]=false; } } return pattern; } } В перспективе думаю можно и отойти от двух образцов, но в этом случае мы можем получить несколько обьяснений одного числа, придётся перебирать комбинации этих конкурирующих обьяснений, сводить в один паттерн, и искать повторяющийся кусок в этой комбинации. Самый короткий но наиболее часто повторяющийся из всех кусков это и будет тот набор правил что мы ищем. |
Цитата:
DjDiablo, основная проблема с тем что последовательность может иметь бесконечно паттернов обьясняющих её. А так же проблема в том что алгоритм должен понимать отношения чисел друг к другу. ключивое слово ПОНИМАТЬ.. ну если я ошибаюсь сделайте это без ии. |
Ой не спроста у тебя 666 кармы. :D :D :D
Речь о том что какой-то алгоритм превзойдёт человека или хотябы нейронную сеть не идёт. Я постарался приблизится к решению настолько насколько получилось, и предложил более совершенный алгоритм как развитие идеи. Если кол-во паттернов бесконечно это уже хаос, и закономерности там не найти, ни человеку ни компьютеру. да и вообще непонятно откуда там возьмётся бесконечное кол-во паттернов, если данная последовательность небесконечна, а кол-во операций в математике ограничено. Даже мой пример обнаруживающий + - * /, будет работать с любой комбинацией этих операций. другое дело если вместо паттерна набор правил. к примеру: 1-2-4-8-10-15-30-35-70-75-150-300-600 тоесть. числа умножаюся на два Но если они меньше 100 и делятся на 10 без остатка то к ним прибавляется 5 в прочем думаю обнаружение правил формирующих эту закономерность это тоже разрешимая задача. |
\
Цитата:
0 /* + 1 */ 1 /* + 2 */ 3 /* + 3 */ 6 /* + 4*/ 7 ... continueSequence () // после этого : ... /* + 5*/ 12 /* + 6 */ 18 /* + 7 */ 25 элементарные ряды, можно сказать. не думаю, что для решения рядов нужен ИИ - для нахождения первообразной даже есть код (на хабре была программа для решения матановой капчи) тут нужна комбинаторика и алгоритмы :) вперёд, за Кнутом*! * всё ещё собираюсь его книжку прочитать. |
Часовой пояс GMT +3, время: 01:47. |