Как избежать множества вложенных условных операторов if-elif-else для оценки быстрого ответа во многих ситуациях? - PullRequest
1 голос
/ 01 мая 2019

Я работаю над проектом мехатроники, где я получаю доступ к данным тока (Amps) из нескольких источников и должен рассчитать отклик (поступающий на механическую систему) на основе изменения тренда значений внутри и среди (увеличение / уменьшение значений и увеличение / уменьшение относительных различий). Существует много условий для доступа (уникальный или смешанный ответ на каждое) и множество переменных, от которых они зависят, поэтому у меня остается множество вложенных if-elif-else операторов, каждое из которых оценивает несколько условий и флагов, таким образом, требуется время для ответа, пока данные течет быстро (до 85 Гц).

Модуль является частью более крупного проекта и должен быть сделан только с использованием Python. Вот как выглядит эта часть моего текущего кода -

def function(args):
    if flag1 and flag2 and condition1 and not condition2:
        if condition3 and not flag3:
            response += var1
            flag4 = True
        elif -- :
            response = var2
            flag3 = False
        elif -- :
            ------------
        else :
            ------------
     if not flag_n and flag_m and condition_p and condition_q and not condition_r:
        if.. elif ... else :
            flags... response changes..
     more IFs

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

Ответы [ 2 ]

2 голосов
/ 01 мая 2019

Вы можете использовать двоичный файл, возможно:

flag_bits = {flag1: 0b0000000001, 
             flag2: 0b0000000010, 
             flag3: 0b0000000100, 
             flag4: 0b0000001000, 
             condition1: 0b0000010000,
             condition2: 0b0000100000,
             ...}

Затем, когда вы получите флаги и условия, оцените их поразрядно и получите словарь результатов или методов для вычисления результатов на его основе:

def add_response(response, add_value):
    return response += add_value

def subtract_response(response, subtract_value):
    return response -= subtract_value

response_actions = {0b0000110011: ('add', var1, 0b0000001000), ...}
response_methods = {'add': add_response, 'sub': subtract_response, ...}

response_action = response_actions[0b0000110011]
response_method = response_action[0]
response = response_method(response, respnose_action[1])
flag_bits = response_action[2]

Очевидно, что не совсем идеально, но это исключит множество операций и превратит действия в поиск и , надеюсь, сэкономит время.

0 голосов
/ 02 мая 2019

Исходя из вашего вопроса, я не мог понять, является ли ваша проблема выражениями if-else, увеличивающимися и запутывающими со временем, или же они требуют значительных вычислительных ресурсов.

В любом случае, любой тип машинного обучения или глубокоерамки обучения, вероятно, будут гораздо медленнее, чем у других, и более запутанными, потому что очень трудно понять, почему именно AI-Deep-Learning-алгоритм-что-то делает.Что если ваш робот перевернется? Вы никогда не узнаете, почему .Но вы можете отследить операторы if-else ... Я бы настоятельно рекомендовал не идти по маршруту AI, если ваши деревья if-else не похожи на ... 3000-5000 строк, они сохраняютменяйте ежедневно 100-200 строк или что-то в этом роде.

Разработчики программного обеспечения обычно стараются следовать хорошим принципам проектирования, чтобы не попасть в такие ситуации, как это, однако, если уже слишком поздно менять архитектуру, Чтолучший способ заменить или заменить if..sese if..sese деревья в программах? (полиморфизм) может прийти вам на помощь.

Как говорится, я много работал надСенсорные / математические проекты, и они росли всегда одинаково: проект начинается красиво и медленно, затем наступает приятное улучшение, затем наступает крайний срок, и вы в конечном итоге получаете спагетти «если что-то еще».Всегда одно и то же.По крайней мере для меня.Итак, в настоящее время я делаю то, что когда у меня есть улучшение, я пытаюсь добавить его в исходный код, чтобы общая архитектура оставалась в такте.

Другой способ решения этой проблемы - написание блок-схем, как вSimlaink от Matlab, и ясно показывает ваше общее представление о том, как проект будет работать / как он фактически реализуется и т. Д.

...