我正在从事一个机电一体化项目,在该项目中,我访问来自多个来源的电流(Amps)数据,并且必须根据内部和之间的值变化趋势(增加/减少值和增加/减少相对差异)来计算响应(馈送到机械系统)。有许多需要访问的a条件(对每个条件的唯一或混合响应)和它们所依赖的许多a变量,所以我留下了许多嵌套的if-elif-else语句,每个语句都计算多个条件和标志,从而在数据流快速(高达85 Hz)时花费时间进行响应。
该模块是大型项目的一部分,只需使用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我需要一种更好和更有效的方式来做这件事,或者是一种完全不同的方法,例如一些适合上述用途的机器学习或深度学习算法或框架。
发布于 2019-05-02 04:09:15
你可以使用二进制,也许:
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]显然,它不是完全完美的,但它将消除大量的if,并将操作转换为查找,希望能节省时间。
发布于 2019-05-02 09:10:29
从你的问题中,我不能理解你的问题是if-else语句随着时间的推移变得越来越大和更混乱,还是它们是计算密集型的。
在任何一种情况下,任何类型的机器学习或深度学习框架都可能比你的if-else慢得多,而且更令人困惑,因为很难知道为什么-AI-深度学习-算法-做什么。如果你的机器人翻了怎么办?你永远不会知道为什么。但是,您可以跟踪if-else语句...我强烈建议不要走AI路线,如果你的if-else树不是这样的话……3000-5000行,他们每天都在改变100-200行,或者类似的东西。
软件开发人员通常会尝试遵循良好的设计原则,以避免陷入这种情况,然而,如果更改架构为时已晚,What is the best way to replace or substitute if..else if..else trees in programs? (多态性)可以为您提供帮助。
话虽如此,我在很多传感器/数学重量级项目上工作过,它们总是一样的:项目开始很好,很慢,然后是很好的改进,然后是最后期限,最后你会得到一个假使否则的意大利面。总是一样的。至少对我来说是这样。所以,我现在所做的就是每当我有改进的时候,我都会尝试把它添加到源代码中,这样一般的架构就会保持得体。
处理这个问题的另一种方法是编写流程图,就像在Matlab的Simulink中一样,并清楚地显示您对项目将如何工作/如何实际实现等的总体想法。
https://stackoverflow.com/questions/55941283
复制相似问题