Не могу проинициализировать массив (задача на комбинаторику) - страница 3

 
Nikolai Semko:
Но Вы упорно не хотите говорить, зачем этот массив нужен. Какая его функция?

я сомневаюсь, что сумею более подробно ответить, функиця - проинициализировать массив, пусть паттернов (хотя это мат.модели) 

у меня скрипт сам формирует вот этот массив паттернов (приатачил пару постов выше) на первом проходе, на втором проходе будет считать ко=во повторений

причем первый проход скрипта по истории сразу отсеивает повторения - специально описал структуру в которой перегрузил операторы == и != и скрипт путем "эксгибизионистких действий" - я понимаю, что Вы это так рассматриваете )))) на первом проходе отсеивает повторы паттернов

на втором проходе уже считает общее кол-во повторений этих паттернов?

так вот - чтобы уменьшить время расчета, мне нужно проинициализировать массив паттернов - именно вот эти комбинации цифр я и приатачил, сейчас я инициализирую массив путем явной инициализации массива при объявлении, все работает, но вид кода ужасен!

вот поэтому и хочу найти алгоритм формирования этих паттернов - на вид все просто (мои примеры в атаче), а реально я не смог :(

хелпми,хелпми...

))))

 
Igor Makanu:

я сомневаюсь, что сумею более подробно ответить, функиця - проинициализировать массив, пусть паттернов (хотя это мат.модели) 

у меня скрипт сам формирует вот этот массив паттернов (приатачил пару постов выше) на первом проходе, на втором проходе будет считать ко=во повторений

причем первый проход скрипта по истории сразу отсеивает повторения - специально описал структуру в которой перегрузил операторы == и != и скрипт путем "эксгибизионистких действий" - я понимаю, что Вы это так рассматриваете )))) на первом проходе отсеивает повторы паттернов

на втором проходе уже считает общее кол-во повторений этих паттернов?

так вот - чтобы уменьшить время расчета, мне нужно проинициализировать массив паттернов - именно вот эти комбинации цифр я и приатачил, сейчас я инициализирую массив путем явной инициализации массива при объявлении, все работает, но вид кода ужасен!

вот поэтому и хочу найти алгоритм формирования этих паттернов - на вид все просто (мои примеры в атаче), а реально я не смог :(

хелпми,хелпми...

))))

Да я не против помочь, но формулировки задачи или вопроса так и не увидел. 
 
Nikolai Semko:
Да я не против помочь, но формулировки задачи или вопроса так и не увидел. 

ОК, вот скрипт который сделает, то что я не могу сделать своей головой )))))

в итоге он посчитает и сохранит в файл .csv необходимые мне массивы, которые я вывожу со скобками {} чтобы мне было удобно их скопировать в код самого индикатора

я хочу сгенерировать эти массивы путем перебора? комбинаторики? подстановки? ... ну хоть "на ездовых собаках" - лишь бы получить результирующие:

как то так

Файлы:
arr_tst.mq4  7 kb
 
for(int i=0;i<ic;i++){
        for(int j=0;j<jc;j++){
                for(int k=0;k<kc;k++){
                        a[i][j][k]=1+MathRand()%(j+1);
                }
        }
}
 
Dmitry Fedoseev:

спасибо, соответствует поставленной задаче, но подозреваю повторений много, вот с выводом в файл, чтобы посмотреть

#property strict

#define MAXARR  8
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   int filehandle;
   string s;
   int ic = 10000;
   int jc = MAXARR;
   int kc  = 2;
   
   filehandle=FileOpen(StringConcatenate("InitArr.csv"),FILE_WRITE|FILE_CSV);
   if(filehandle!=INVALID_HANDLE)
     {
      Print("FileOpen OK");
      for(int i=0;i<ic;i++)
        {
         s = "{ ";
         for(int j=0;j<jc;j++)
           {
            s += " { ";
            for(int k=0;k<kc;k++)
              {
               s += (string)(1+MathRand()%(j+1)) + " , ";
              }
            s+=" }, ";   
           }
         s+=" }";
         FileWrite(filehandle,s);
        }
      FileClose(filehandle);
      Print("FileClose....");
     }
   else Print("Операция FileOpen неудачна, ошибка ",GetLastError());
  }
//+------------------------------------------------------------------+
 

нашел решение своей задачи, ибо вчера сам себя перемудрил, на незамыленный свежий взгляд моя задача должна так решаться:

#property strict
#define MAXARR1  6000
#define MAXARR2  8
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   int i,j,filehandle;
   string s="";
   int arr[MAXARR1][MAXARR2][2];
   for(i=0;i<MAXARR2;i++)
     {
      column(i,arr);
     }
//-------------------------
//------------------------- Вывод в *.csv
   filehandle=FileOpen(StringConcatenate("InitArr.csv"),FILE_WRITE|FILE_CSV);
   if(filehandle!=INVALID_HANDLE)
     {
      Print("FileOpen OK");
      for(i=0;i<MAXARR1;i++)
        {
         s="";
         for(j=0;j<MAXARR2;j++)
           {
            s+=StringConcatenate("{ ",arr[i,j,0]," , ",arr[i,j,1]," }");
           }
         FileWrite(filehandle,s);
        }
      FileClose(filehandle);
      Print("FileClose....");
     }
   else Print("Операция FileOpen неудачна, ошибка ",GetLastError());
  }
//+------------------------------------------------------------------+
void column(int col,int &a[MAXARR1][MAXARR2][2])
  {
   int value1,value2;
   value1=1;
   value2=1;
   for(int j=0;j<MAXARR1;j++)
     {
      a[j,col,0] = value1;
      a[j,col,1] = value2;
      value2++;
      if(value2>col+1)
        {
         value2=1;
         value1++;
         if(value1>col+1) value1=1;
        }
     }
  }
//+------------------------------------------------------------------+
ЗЫ: проверки размерности массивов не делал, ибо через define быстрее проверить ... отвратительная привычка, как от нее отучиться? ))))
 

Я вообще не уверен, что правильно понял задачу (где не должно быть повторов? стоит ли вообще такое условие?), да вы вроде и сами справились. Ну в общем накидал немного строк перед сном, не выкидывать же:

#define MAXARR1  6000
#define MAXARR2  8
#define MIN_VAL  0

class Digit{
public:
   Digit *m_next;
   uint m_max, m_f, m_s;
   Digit(uint max): m_next(NULL), m_max(max), m_f(MIN_VAL), m_s(MIN_VAL) {}
   ~Digit() {if(m_next!=NULL)delete m_next;}
   void inc(){
      if(++m_f > m_max){
         m_f = MIN_VAL;
         if(++m_s > m_max){
            m_s = MIN_VAL;
            if(m_next != NULL) m_next.inc() else Alert("MAXARR2 is too small")
         }
      }
   }
};

// Если вообще нужно перемешивать столбцы
void shuffle(uint &arr[][MAXARR2][2] ){
   for(uint i2 = 0; i2 < MAXARR2; ++i2)
      for (uint i1 = MAXARR1-1; i1 != (uint)-1; --i1) {
         uint buff = arr[i1][i2][0], bufs = arr[i1][i2][1];
         int rnd = MathRand() % (i1+1);
         arr[i1][i2][0] = arr[rnd][i2][0];
         arr[i1][i2][1] = arr[rnd][i2][1];
         arr[rnd][i2][0] = buff;
         arr[rnd][i2][1] = bufs;
      }
}

void OnStart()
{
   uint arr[MAXARR1][MAXARR2][2];
   Digit value(1);
   {
      Digit *last = &value;
      for(uint i = 2;  i <= MAXARR2;  ++ i)
         last = last.m_next = new Digit(i);
   }
     
   for(uint i1 = 0;  i1 < MAXARR1;  ++ i1)
   {
      Digit *cur = &value;
      for(uint i2 = 0;  i2 < MAXARR2;  ++ i2)
      {
         arr[i1][i2][0] = cur.m_f;
         arr[i1][i2][1] = cur.m_s;
         cur = cur.m_next;
      }
      value.inc();
   }
   
   shuffle(arr);
}

Сумма всех элементов (не математическая, а если слепить разряды в одно число) в каждом MAXARR1 уникальна.

ЗЫ: про уникальность не совсем верно, уникальные комбинации только если не вызывать shuffle().
 
pavlick_:

Я вообще не уверен, что правильно понял задачу (где не должно быть повторов? стоит ли вообще такое условие?), да вы вроде и сами справились. Ну в общем накидал немного строк перед сном, не выкидывать же:

Сумма всех элементов (не математическая, а если слепить разряды в одно число) в каждом MAXARR1 уникальна.

ЗЫ: про уникальность не совсем верно, уникальные комбинации только если не вызывать shuffle().

спасибо!

тут вообщем то проблема у меня была, что не с того конца сам себе задачу определил

ну и в довесок, зачем и почему меня интересует это, сам массив это массив кластеров, каждый кластер должен иметь уникальный признак, в моем случае скрипт сам формировал уникальные признаки и потом считает их повторяемость, но если я вижу, что система формирования признаков довольно простая - то почему бы не инициализировать массивы сразу?, а потом просто посчитать повторяемость этого на истории 

Причина обращения: