2011-06-01 40 views
1

請參閱下面的數據矩陣從傳感器獲得,只是詮釋數字,沒有什麼特別的。尋求一個更好的設計建議在python中的試錯機制?

A B C D E F G H I J K 
1 25 0 25 66 41 47 40 12 69 76 1 
2 17 23 73 97 99 39 84 26 0 44 45 
3 34 15 55 4 77 2 96 92 22 18 71 
4 85 4 71 99 66 42 28 41 27 39 75 
5 65 27 28 95 82 56 23 44 97 42 38 
…           
10 95 13 4 10 50 78 4 52 51 86 20 
11 71 12 32 9 2 41 41 23 31 70 
12 54 31 68 78 55 19 56 99 67 34 94 
13 47 68 79 66 10 23 67 42 16 11 96 
14 25 12 88 45 71 87 53 21 96 34 41 

水平的A到K是傳感器名稱,垂直是傳感器按照定時器方式的數據。

現在我想分析試錯法這些數據,我定義的一些概念來解釋什麼,我想:

Ø源

來源是所有原始數據,我得到

O條目

一個條目的一組所有A至K的傳感器,取垂直第一行例如:該表項是

25 0 25 66 41 47 40 12 69 76 1 

Ø規則

的規則是斷言返回值是「假設」的功能,至今只是「真」或「假」。 例如,我假設傳感器A,E和F的值在一個情況下永遠不會相同,如果一個條目的A = E = F,它會觸發違規行爲,並且此規則函數將返回false。

O範圍:

的範圍是用於選擇垂直條目,例如,前5項

然後功能,基本思想是:

o source + range = subsource(s) 
o subsource + rules = valiation(s) 

將最終餘想要得到一份清單可能看起來像這樣:

rangeID ruleID violation 
1 1 Y 
2 1 N 
3 1 Y 
1 2 N 
2 2 N 
3 2 Y 
1 3 N 
2 3 Y 
3 3 Y 

但是問題是我在這裏定義的規則和範圍很快會變得很複雜,如果你看起來更深一些,它們有太多可能的組合,比如說「A = E = F」,可以定義「B = E = F 「,」C = E = F「,」C> F「......

所以很快我需要一個規則/範圍發生器,它可以接受那些」核心參數「,如」A = E = F 「作爲輸入參數,以後再使用正則表達式字符串。這太複雜了剛剛擊敗了我,獨自離開我可能需要持久化規則的唯一ID,數據存儲問題,規則自窩組合問題......

所以我的問題是:

  1. 任何人都知道是否有一些模塊/軟適合這種試錯法計算或我想要的規則定義?

  2. 任何人都可以與我分享我描述的更好的規則/範圍設計嗎?

感謝您的任何提示。

RGS,

KC

回答

1

如果我明白你的要求是正確的,我可能甚至不會冒然敲定Numbpy的路徑,因爲我不認爲你的描述是真正需要的。下面是我怎麼可能去解決具體問題的樣本實現你呈現:

l = [\ 
     {'a':25, 'b':0, 'c':25, 'd':66, 'e':41, 'f':47, 'g':40, 'h':12, 'i':69, 'j':76, 'k':1},\ 
     {'a':25, 'b':0, 'c':25, 'd':66, 'e':41, 'f':47, 'g':40, 'h':12, 'i':69, 'j':76, 'k':1}\ 
] 
r = ['a=g=i', 'a=b', 'a=c'] 
res = [] 

# test all given rules 
for n in range(0, len(r)): 
     # i'm assuming equality here - you'd have to change this to accept other operators if needed 
     c = r[n].split('=') 
     vals = [] 
     # build up a list of values given our current rule 
     for e in c: 
       vals.append(l[0][e]) 
     # using len(set(v)) gives us the number of distinct values 
     res.append({'rangeID': 0, 'ruleID':n, 'violation':'Y' if len(set(vals)) == 1 else 'N'}) 

print res 

輸出:

[{'violation': 'N', 'ruleID': 0, 'rangeID': 0}, {'violation': 'N', 'ruleID': 1, 'rangeID': 0}, {'violation': 'Y', 'ruleID': 2, 'rangeID': 0}]

http://ideone.com/zbTZr

這裏有做幾個假設(例如平等是您規則中唯一使用的運算符),並省略了一些功能(例如將輸入解析爲list o我用過,但我希望你可以自己弄清楚。

當然,也有可能是基於NumPy的解決方案,它比這一點,我只是不是現在想的(它的晚,現在我要睡覺;)更簡單),但希望這無論如何你都會幫助你。

編輯:

Woops,錯過了別的東西(忘記它在之前發佈補充) - 我只測試在l的第一個元素(給定的範圍內)..你只需要堅持在另一個for循環中,而不是使用硬編碼0索引。

+0

謝謝,德米安布萊希特,你指出了一條解決問題的道路。 – user478514 2011-06-02 02:17:20

0

你想看看NumPy的矩陣狀矩陣等它暴露的是矩陣操作工作的功能列表數據結構。

至於規則/範圍生成器,恐怕你將不得不建立你自己的領域特定的語言來實現這一點。

+0

感謝您的快速回復,Numpy可以簡化矩陣操縱,但主要問題是規則/範圍設計,關於特定領域的語言,任何樣本都可以與我分享? – user478514 2011-06-01 05:53:13

+0

好的Antlr允許你創建簡單的基於語法的規則http://www.antlr.org/ ...如果你閱讀Antlr書籍的前4章,你將能夠創建你的規則引擎,可以與給定的martix =,<, >是運營商。你也可以看看http://pragprog.com/titles/tpdsl/language-implementation-patterns – 2011-06-01 11:46:36

相關問題