Уважаемые знатоки Mql4 и Mql5, есть вопросик насчет реализации алгоритма... - страница 3

 
PapaYozh >>:


используйте функцию:


ок, сейчас проверю! не заметил что Вы уже ответили!
 
int F1(int i, int arrsize)
{
   int i1;
   string str;
   
   for( ; i<minIndx; i++ )
      ;
   
   if ( i > maxIndx )
      return(arrsize);
      
   if ( i < minIndx || i > maxIndx )
      continue;
      
   for( i1=0; i1<minIndx; i1++ )
      arr[i1] = 0;
      
   for( i1=0; i1<(maxIndx-minIndx+1); i1++ )
      arr[i1+minIndx] = ( i >> i1 ) & 1;
      
   for( i1=0; i1<(arrsize-maxIndx+1); i1++ )
      arr[i1+maxIndx] = 0;
      
   // массив заполнен, проверим это
   str = "";
   for( i1=0; i1<arrsize; i1++ )
      str = StringConcatenate(str,arr[i1]);
   Print("arr: ",str);
      
   return(i);
}
Вот эту бы функцию на mql5! да еще и немного комментариев к коду... ;) для особо тупых...:)
 
Fast писал(а) >>


:) Вроде немного стал понимать Ваш код. Вы уж извините что я такой недо программист и понимаю наверное с 10 раза....
За что у Вас отвечают переменные maxIndx и minIndx? Если я правильно понял то за отрывок в массиве который подвергается перебору?
Если да, то минимальное значение не нужно использовать, так как оно всегда равно 0 (это первый элемент массива), а вот размер максимального элемента меняется по нарастающей тоесть в начале он равен 5, что значит в используемом мною массиве arr[15] последним элементом будет считаться 4й. Затем количество элементов увеличивается и последний элемент уже 5й. затем 6й и так далее...
Перебирать нужно с 2го элемента (тоесть это всегда arr[1]) до пред последнего arr[tek_raz-1] (tek_raz это текущий используемый последний элемент массива). Вот в общемто что мне нужно сделать.ТОесть например если это будет функция то нужно перебрать все эелементы в массиве arr учитывая его текущий размер tek_raz.


в maxIndx должен находиться минимальный индекс (для Вашего случая maxIndx=1), в minIndx - максимальный (т.е. последовательно 5, 6, ..., tek_raz-2)

 
Fast писал(а) >>
Вот эту бы функцию на mql5! да еще и немного комментариев к коду... ;) для особо тупых...:)

я пока не писал на MQL5, нет причин.
В принципе, на MQL5 можно написать код лучше, но надо вникнуть в особенности языка, а мне пока не до того.
Вам лучше с этим кодом обратиться на форум MQL5
--
PS. А комментировать тут не чего, такое только в учебниках комментируют.
 
Fast писал(а) >>

В функции, по-моему, надо

return(i);
заменить на
return(i+1);
и тогда работа с фунцией будет выглядеть так:
int i;

for ( i=0; true; )
{
   i = F1( i );

   if ( i >= tek_raz )
      break;
   
   //
   // работаем с заполненным массивом arr[]
   //
}
Вроде так. Тестируйте.
 
PapaYozh >>:

В функции, по-моему, надо

заменить на
и тогда работа с фунцией будет выглядеть так:
Вроде так. Тестируйте.


Благодарю Вас за помощь! Да на мкьюл5 немного по проще, попробую переписать... в целом впринципе разобрался, Если maxIndex унас отвечает за 1й элемент то тогда его не обязательно использовать и можно использовать просто 1.
 
Fast писал(а) >>
Сам я пишу программу на mql5, но тут не столь важна разница в языках, так как задача алгоритма такая:
Есть некий 1мерный массив данных, например (0,0,0,0,0,0) мы имеем 6 элементов, мне нужно перебрать все возможные варианты изменения каждого элемента массива с 0 на 1. Нужно перебрать все уникальные значения массива, но не надо брать 1й и последний элементы, перебираем всегда от 2го до пред последнего, должны получиться вроде таких вариантов:

1. (0,0,0,0,0,0)
2. (0,1,0,0,0,0)
3. (0,1,1,0,0,0)
4. (0,1,0,1,0,0)
.......... .......... .
5. (0,1,1,1,1,0)

Вот что то сидел, думал и никак не додумался, сам я не прогреммер, а так… самоучка, поэтому не судите строго, если алгоритм простой, просто прошу помощи у тех кто знает как это решить.
Реализовать алгоритм, желательно используя циклы: while, do while, for. И чтобы была совместимость с mql5 но если что, я сам подредактирую.

* Дело еще в том, что количество элементов массива изменяется, и может достигать до 10-15 элементов, поэтому даже не знаю как все это реализовать.
** первый и последний элементы всегда равны 0, и их изменения не просчитываем.


А в пятерке есть возможность работать с двоичными числами? Если есть, то тогда всё просто: N размер массива (в вашем примере 6) (N-2)^2-1 даст число, которое в двоичном виде будет состоять из необходимого количества единиц. Уменьшая это число на 1 получим все варианты.
 
Я бы вообще сделал всё строками (или чарами) в шестнадцатеричке (0-F), или цифрами, написать функцию которая извлекает любой бит как два пальца. Перебор элементарный.
Кстати если хочется массивы можно сделать наоборот... устроить перебор цифр от 0 до 2^n (где n разрядность массива), и число раскладывать в двоичную систему запихивая в элементы массива.
 
splxgf >>:
Я бы вообще сделал всё строками (или чарами) в шестнадцатеричке (0-F), или цифрами, написать функцию которая извлекает любой бит как два пальца. Перебор элементарный.
Кстати если хочется массивы можно сделать наоборот... устроить перебор цифр от 0 до 2^n (где n разрядность массива), и число раскладывать в двоичную систему запихивая в элементы массива.


  Если Вы разбираетесь в кодинге на mql5, то я был бы очень рад такой функции которая бы просчитывала данные варианты по описанным мною правилам..., "PapaYozh" дал неплохой вариант решения задачи, и если есть возможно сделать более быстроее ее решение то было бы супер, так как обьем производимых вычеслений очень и очень не мал, то любое улучшение быстродействия было бы очень кстати!
 
mql5 не знаю,
приведенный выше вариант можно чуть ужать для облегчения понимания.

for(int a=0;a<(MaxIndx-MinIndx)-2;a++)
arr[MinIndx+1+a]=i&(2^a);

заполняет массив вариантом i
где ^ - возведение в степень, для двоичной системы заменяется сдвиговыми операциями << (к примеру если есть число 467 и тебе его нужно умножить на 10, ты же не будешь его реально умножать, а просто дорисуешь нолик, в двоичной системе все аналогично, а сдвиг это очень быстрая операция)
i число в диапазоне о 0 до (MaxIndx-MinIndx)^2 - означает нужный вариант заполнения, перебираешь их все.

повкуривай
https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F
https://ru.wikipedia.org/wiki/%D0%94%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%B0%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F
посиди с бумажкой и ручкой переводя числа в двоичную систему и обратно и все получится, успехов в изучении.
Причина обращения: