Распознавание образов в двоичных числах (псевдокод или MQL5)

0  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17 
.  .  1  1  1  1  1  0  0  0  1   1   1   1   1   0   0   0

Распознавание начинается с 17 и идет назад к 0. Можно увидеть самый простой шаблон.

  1. Шаблон начинается как минимум с трех нулей или трех единиц, но может быть и больше каждого, но не смешивается!

  2. Затем за первым шаблоном следуют как минимум пять нулей или пять единиц, в зависимости от того, что было в первом шаблоне. Поскольку первый шаблон содержит три 0, должно быть не менее пяти единиц и наоборот.

  3. Затем мы снова хотим увидеть первый паттерн. Не менее трех нулей или трех единиц, опять же, в зависимости от того, были ли единицы или нули до этого.

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

Я пытался использовать циклы for и счетчики, но не смог. Что меня беспокоит, так это тот факт, что шаблон не имеет фиксированного размера, так как может быть более трех или пяти 0 и 1 подряд.

Кто-нибудь может предоставить какой-нибудь псевдокод, как реализовать этот или даже какой-нибудь код MQL5?


person trader    schedule 29.06.2019    source источник
comment
Если вы хотите снова увидеть первый шаблон, значит ли это, что он должен иметь такое же количество нулей и единиц, как и в первый раз, или просто по крайней мере три 0 или три единицы, независимо от того, сколько было в первый раз (второй шаблон аналогично).   -  person Reinhard Männer    schedule 29.06.2019
comment
Привет! спасибо за ваш вопрос. Всего не менее трех или более, например. От 17 до 15 может быть 0 0 0, затем 1 1 1 1 1, затем 0 0 0 0 0, затем 1 1 1 1 1   -  person trader    schedule 29.06.2019


Ответы (1)


Следующий код Swift не является оптимальным. Это должно просто дать вам подсказки, как вы могли бы реализовать это.

Функция для соответствия одному шаблону:

func matchPattern(numbers: [Int], startIndex: Int, number: Int) -> Int {
    var actualIndex = startIndex
    while numbers[actualIndex] == number && actualIndex > 0 {
        actualIndex = actualIndex - 1
    }
    return startIndex - actualIndex
}  

Функция, соответствующая 4 шаблонам:

        func match(binNrs: [Int]) -> Bool {
            let firstPatternNr = binNrs[17]
            let secondPatternNr = firstPatternNr == 0 ? 1 : 0
            let pattern1Length = matchPattern(numbers: binNrs, 
                                             startIndex: 17, 
                                             number: firstPatternNr)
            if pattern1Length < 3 { return false }
            let pattern2Length = matchPattern(numbers: binNrs, 
                                              startIndex: 17 - pattern1Length, 
                                              number: secondPatternNr)
            if pattern2Length < 5 { return false }
            let pattern3Length = matchPattern(numbers: binNrs, 
                                              startIndex: 17 - pattern1Length - pattern2Length,
                                              number: firstPatternNr)
            if pattern3Length < 3 { return false }
            let pattern4Length = matchPattern(numbers: binNrs, 
                                              startIndex: 17 - pattern1Length - pattern2Length - pattern3Length, 
                                              number: secondPatternNr)
            return pattern4Length >= 5
        }  

Некоторые тестовые шаблоны с результатами:

let match1 = match(binNrs: [0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0]) // true
let match2 = match(binNrs: [1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]) // false (4th sequence < 5)
let match3 = match(binNrs: [0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0]) // false (1st sequence < 3)
let match4 = match(binNrs: [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1]) // false (2nd sequence < 5)
person Reinhard Männer    schedule 29.06.2019