Optimização dos algoritmos. - página 9

 
Andrey Dik:
Sim, foi o que eu fiz.
mas há frequentemente carraças no mesmo personagem com o mesmo tempo, quando há várias carraças num milissegundo
É aí que eu fico preso na lógica.

para efeitos práticos, devo provavelmente considerar o pior cenário

 

Existem números desde o StartN até ao EndN inclusive.

É necessário fazer combinações de CondeN em cada

Escrevi este guião para o número de números numa combinação de 3:

input int      StartN = 0;
input int      EndN   = 1;
input int      CountN = 5;

void OnStart()
{
  string str = "";
  
  //уровень 0
  for (int i = StartN; i <= EndN; i++)
  {
    //str = StringSubstr (str, 0, 0);
    //str += (string)i;
    str = (string)i;
    
    //уровень 1
    for (int k = StartN; k <= EndN; k++)
    {
      str = StringSubstr (str, 0, 1);
      str += (string)k;
      
      //уровень 2
      for (int l = StartN; l <= EndN; l++)
      {
        str = StringSubstr (str, 0, 2);
        str += (string)l;
        
        Print (str);
      }
    }
  }
}

que produz:

2020.07.12 21:48:47.763 sProbCandlComb XAUUSD...,H4: 111

2020.07.12 21:48:47.763 sProbCandlComb XAUUSD...,H4: 110

2020.07.12 21:48:47.763 sProbCandlComb XAUUSD...,H4: 101

2020.07.12 21:48:47.762 sProbCandlComb XAUUSD...,H4: 100

2020.07.12 21:48:47.762 sProbCandlComb XAUUSD...,H4: 011

2020.07.12 21:48:47.762 sProbCandlComb XAUUSD...,H4: 010

2020.07.12 21:48:47.762 sProbCandlComb XAUUSD...,H4: 001

2020.07.12 21:48:47.762 sProbCandlComb XAUUSD...,H4: 000

Estou confuso, como posso fazê-lo funcionar com um número especificado de CondeN?

 

A representação binária de um número...

 
Aliaksandr Hryshyn:

Representação binária de um número...

não é essa a questão, são apenas os parâmetros que eu tomei, de 0 a 1 inclusive.

Tomar [0;2].

e obtém-se:

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD...,H4: 222

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD...,H4: 221

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD...,H4: 220

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD...,H4: 212

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD...,H4: 211

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD...,H4: 210

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD...,H4: 202

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD...,H4: 201

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD...,H4: 200

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD...,H4: 122

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD...,H4: 121

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD...,H4: 120

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD...,H4: 112

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD...,H4: 111

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD...,H4: 110

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD...,H4: 102

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD...,H4: 101

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD...,H4: 100

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD...,H4: 022

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD...,H4: 021

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD...,H4: 020

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD...,H4: 012

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD...,H4: 011

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD...,H4: 010

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD...,H4: 002

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD...,H4: 001

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD...,H4: 000

 
Andrey Dik:

Existem números desde o StartN até ao EndN inclusive.

Preciso de fazer combinações de CondeN em cada

Estou tão confuso, como fazê-lo funcionar com um determinado número de CondeN?

Penso que já fiz isto antes, aqui está o tópico

https://www.mql5.com/ru/forum/335077

 
Andrey Dik:

não é isso, é apenas que eu tomei parâmetros de 0 a 1 inclusive.

tomar [0;2]

e obtemos:

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD...,H4: 222

2020.07.12 22:16:57.703 sProbCandlComb XAUUSD...,H4: 221

...

Assim, o problema resume-se a converter o número do laço principal para outro sistema numérico, mais uma correcção para StartN

 
Aliaksandr Hryshyn:

Assim, o problema resume-se a converter o número do laço principal para outro sistema numérico, mais uma correcção para StartN

Pode dar-me o código?

 
Igor Makanu:

Acho que já fiz isto antes, aqui está o fio da meada

https://www.mql5.com/ru/forum/335077

Nem tudo está bem com o código, mas parece ser o que eu preciso, vou arranjá-lo, vou afixá-lo aqui.

agora o código não gera as combinações de comprimento total

 
Igor Makanu:

Acho que já fiz isto antes, aqui está um fio

https://www.mql5.com/ru/forum/335077

Não consegui o que precisava, o código tem demasiados loops de propósito pouco claro.

A minha solução é esta:

#property script_show_inputs

//--- input parameters
input int      StartN = 0;
input int      EndN   = 1;
input int      CountN = 3;

void OnStart ()
{
  string base [];
  
  //алгоритм сочетаний без повторений
  CombinationGenerator (StartN, EndN, CountN, base);

  //выведем полученные комбинации в принт
  for (int i = 0; i < ArraySize (base); i++) Print (base [i]);
}

string CreateString (int &base [])
{
  string s = "";
  for (int i = 0; i < ArraySize (base); i++) s += (string)base [i];

  return s;
}

//Алгоритм сочетаний без повторений
void CombinationGenerator (int startN, int endN, int rowLen, string &base [])
{
  ArrayResize (base, (int)pow (EndN - StartN + 1, CountN));
  int comb [];
  ArrayResize (comb, CountN);
  ArrayInitialize (comb, StartN);
  string str = "";
  int pos = 0;
  base [pos] = CreateString (comb);

  bool flag = true;

  while (flag && !IsStopped ())
  {
    for (int l = 0; l < CountN; l++)
    {
      if (comb [l] + 1 <= EndN)
      {
        comb [l] += 1;

        pos++;
        base [pos] = CreateString (comb);
        break;
      }
      else
      {
        if (l == CountN - 1) flag = false;
        comb [l] = StartN;
      }
    }
  }
}

Assumo este código com o menor número de iterações possível.

resultado em [0;1] números com número na linha 3:

2020.07.13 01:21:41.037 sProbCandlComb EURUSD...,M5: 111

2020.07.13 01:21:41.037 sProbCandlComb EURUSD...,M5: 011

2020.07.13 01:21:41.037 sProbCandlComb EURUSD...,M5: 101

2020.07.13 01:21:41.037 sProbCandlComb EURUSD...,M5: 001

2020.07.13 01:21:41.037 sProbCandlComb EURUSD...,M5: 110

2020.07.13 01:21:41.037 sProbCandlComb EURUSD...,M5: 010

2020.07.13 01:21:41.037 sProbCandlComb EURUSD...,M5: 100

2020.07.13 01:21:41.037 sProbCandlComb EURUSD...,M5: 000

resultado para valores [0;2] com número na linha 4:

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 2222

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 1222

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 0222.

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 2122

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 1122

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 0122

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 2022

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 1022

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 0022.

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 2212

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 1212

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 0212

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 2112

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 1112

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 0112

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 2012

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 1012

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 0012

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 2202

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 1202

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 0202

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 2102

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 1102

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 0102

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 2002

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 1002

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 0002

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 2221

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 1221

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 0221

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 2121

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 1121

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 0121

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 2021

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 1021

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 0021

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 2211

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 1211

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 0211

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 2111

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 1111

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 0111

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 2011

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 1011

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 0011

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 2201

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 1201

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 0201

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 2101

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 1101

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 0101

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 2001

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 1001

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 0001

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 2220

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 1220

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 0220

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 2120

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 1120

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 0120

2020.07.13 01:22:50.851 sProbCandlComb EURUSD..,M5: 2020.

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 1020

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 0020

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 2210

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 1210

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 0210

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 2110

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 1110

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 0110

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 2010

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 1010

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 0010

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 2200

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 1200

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 0200

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 2100

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 1100

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 0100

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 2000

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 1000

2020.07.13 01:22:50.851 sProbCandlComb EURUSD...,M5: 0000

A lógica do algoritmo é simples e igual à regra de cálculo: adicionar 1 ao dígito, se o dígito contiver mais do que o número que definimos como mínimo e ir para o dígito seguinte, se não houver "zeragem" no dígito seguinte, voltamos ao primeiro.

É verdade, os dígitos que tenho não estão à direita, mas à esquerda, bem, opa.

0000

0001

0010

0011

0100

0101

....

etc.


Pode ser possível obter um código ainda mais agradável utilizando a recursividade, mas é pouco provável que seja mais rápido.

 
Andrey Dik:

o seu exemplo não é uma combinação, mas uma permutação sem repetição

e o meu exemplo é uma combinação sem repetição