Показать сообщение отдельно
  #27 (permalink)  
Старый 08.10.2012, 13:41
Профессор
Отправить личное сообщение для DjDiablo Посмотреть профиль Найти все сообщения от DjDiablo
 
Регистрация: 04.02.2011
Сообщений: 1,815

Сообщение от melky
вот почему задача такой ажиотаж вызвала
думаю ожиотаж вызвала мысль о гибкой функции continueSequence, способной определить множество последовательностей.
Пожалуй даже для такой суперфункции до какой-то степени можно обойтись без ИИ

к примеру
Если есть два образаца последовательности в одном массиве, и образцы операций. То можно отсеять только те операции которые дадут один результат в обоих последовательностях. Затем свести все обнаруженные операции в один паттерн, и по этому паттерну возвращать значения.

Вот набросал пример (с двумя образцами операций).

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, 08.10.2012 в 14:30.
Ответить с цитированием