アルゴリズムの最適化 - ページ 9

 
Andrey Dik:
ええ、その通りです。
が、同じ文字に同じ時刻の刻みがあることが多く、1ミリ秒に数回刻みがある場合
そこで論理に行き詰まるんです。

現実的には、最悪のケースを想定しておく必要があるだろう。

 

StartNからEndNまでの数字があります。

それぞれのCountNを組み合わせて作る必要があります。

このスクリプトは、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);
      }
    }
  }
}

を出力するものです。

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

迷っているのですが、CountNを指定して動作させるにはどうしたらいいのでしょうか?

 

数値の2進数表現...

 
Aliaksandr Hryshyn:

数値の2進数表現...

ということではなく、0から1までのパラメータを取っただけです。

0;2]を取る。

を取得します。

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:

StartNからEndNまでの数字があります。

それぞれのCountNの組み合わせを作る必要があります。

とても困っています、CountNを指定した数で動作させるにはどうしたらいいのでしょうか?

以前にもやったことがあると思うのですが、こんなトピックがあります。

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

 
Andrey Dik:

ということではなく、パラメータを0から1まで包括的に取っただけです。

を取る [0;2] 。

を取得します。

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

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

...

つまり、問題は、メインループの数を別の数体系に変換することと、StartNに対する補正に行き着くわけです

 
Aliaksandr Hryshyn:

つまり、問題は、メインループの数を別の数体系に変換することと、StartNに対する補正に行き着くわけです

コードを教えてください。

 
Igor Makanu:

以前にもやったと思いますが、こちらのスレッドで

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

このコードですべてがうまくいくわけではありませんが、私が必要としているもののようです、修正してここに掲載します。

このコードでは、全長の組み合わせが生成されません。

 
Igor Makanu:

以前にもやったと思いますが、こちらのスレッドで

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

私が必要とするものは得られなかった。このコードには目的がはっきりしないループが多すぎる。

私の解決策はこれです。

#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;
      }
    }
  }
}

できるだけ少ない反復でこのコードを想定しています。

の結果は、[0;1]の数字で、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

の結果が、4行目の番号を持つ値[0;2]の場合。

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

アルゴリズムのロジックは、桁に1を加え、その桁に最小値として設定した数以上が含まれていれば次の桁に進み、次の桁で「0」がなければ最初の桁に戻る、というシンプルで計算ルールと同じものです。

確かに、私の持っている桁は右側ではなく左側ですが、まあ、おっと。

0000

0001

0010

0011

0100

0101

....

など


再帰を使えばもっときれいなコードができるかもしれませんが、高速化は望めません。

 
Andrey Dik:

あなたの例は、組み合わせではなく、繰り返しのない順列です。

で、私の例は、繰り返しのない組み合わせです。