2015-10-25 45 views
1

所以我試圖檢查是否所有可能的排列之一,我會得到一個形式,其中矩陣是對角佔優,但當試圖檢查它時,我得到一個錯誤如何將元組轉換爲整數python

import numpy 
from itertools import product 
A = numpy.array([[10., -1., 2., 0.], 
    [2., -1., 10., -1.], 
    [-1., 11., -1., 3.], 
    [0.0, 3., -1., 8.]]) 

def dominance(A): 
    dominance=True 
    n=4 
    sumC=numpy.sum(numpy.absolute(A),axis=0) 
    sumR=numpy.sum(numpy.absolute(A),axis=1) 
    resC = [0 for i in range(n)] 
    resR= [0 for i in range(n)] 
    for i in range(n): 
     resC[i]=sumC[i]-A[i,i] 
     resR[i]=sumR[i]-A[i,i] 
     if A[i,i]<resC[i] or A[i,i]<resR[i]: 
      dominance=False 
      break 

    return dominance 

def permutate(iterable, r=None): 
    pool = tuple(iterable) 
    n = len(pool) 
    r = n if r is None else r 
    for indices in product(range(n), repeat=r): 
     if len(set(indices)) == r: 
      yield tuple(pool[i] for i in indices) 


if dominance(A): 
    print "Es dominante" 
else: 
    for i in permutate(A): 
     if dominance(list(i)): 
      print "this way is dominant" 
      print i 
      break 

這這裏是錯誤

Traceback (most recent call last): 
    File "Prueba.py", line 37, in <module> 
     if dominance(list(i)): 
    File "Prueba.py", line 16, in dominance 
     resC[i]=sumC[i]-A[i,i] 
TypeError: list indices must be integers, not tuple 
+3

您不需要「將元組轉換爲整數」,您需要弄清楚爲什麼要在需要整數的地方使用元組。 – TigerhawkT3

+1

'A [我,我]'你不能像那樣索引。使用'A [i] [i]' – hellpanderrr

+0

@hellpanderrr:實際上,您可以並應該使用NumPy數組。問題是這段代碼混合了列表和數組,而沒有理解這兩者之間的區別。 – user2357112

回答

1

您定義A作爲列表的列表。當你把它傳遞給dominance你得到這個錯誤:

In [87]: dominance(A) 
--------------------------------------------------------------------------- 
... 
     8   for i in range(n): 
----> 9     resC[i]=sumC[i]-A[i,i] 
    10     resR[i]=sumR[i]-A[i,i] 
    11     if A[i,i]<resC[i] or A[i,i]<resR[i]: 

TypeError: list indices must be integers, not tuple 

但如果你先A的陣列,它運行的罰款:

In [94]: dominance(np.array(A)) 
Out[94]: False 

我不會深入探討爲什麼dominance有問題,但看起來dominance是用numpy數組編寫的,而不是列表列表。 sumC=numpy.sum(numpy.absolute(A),axis=0)A視爲一個數組(它與列表A一起使用,因爲absolute將其轉換爲數組)。

dominance第二個呼叫也必須得到一個數組:

dominance(np.array(i)) 
0

您正在接近這一效率很低!


如果您正在尋求嚴格對角優勢:

  • 矩陣中的每一行只能有0或1嚴格主流價值觀

  • 矩陣中的每一列只能有0或1個嚴格的主導值

  • 如果任何行或列有0嚴格多米諾nt值,則矩陣不存在嚴格的對角佔優置換:如果每一行和每一列都嚴格具有1個嚴格的主導值,則恰好有1個嚴格對角佔優的置換矩陣:對於原始矩陣的每一行,占主導地位的項目的列索引指定在置換後的結果矩陣

這導致的O的行的折射率(n^2)算法,而不是爲O(n^2 * N!) - 爲一個10 * 10的矩陣,應該是300萬倍快。


如果您正在尋找非嚴格對角優勢:

  • 矩陣中的每一行只能有0,1或2主流價值觀

  • 的每一列矩陣只能有0,1或2個主導值

  • 如果任何行或列有0個主導值,那麼是矩陣沒有對角佔優的排列

  • (減少:)如果一行恰好具有1個主導值,並且該值的列包含2個主導值,那麼該列中的另一個主導值可以平凡地被忽略(並且副 - 如果每一行和每一列恰好有一個主導值,那麼恰好有一個對角佔優排列矩陣:對於原始矩陣的每一行,主導項的列索引指定行的索引在置換結果矩陣中

  • 具有2個主導值的行集合可組合形成電路,其中每個電路具有0,1或2個對角佔優解(並且選擇一行的主導值強制選擇電路中的所有其他行)。分枝和剪枝方法可以快速找到所有有效的解決方案。

對於具有與2個顯性值噸行的矩陣,這導致爲O(n^2 * 2^t)的算法,而不是爲O(n^2 * N!) - 對於10×10矩陣,它應該快3到3百萬倍(取決於具有2個主導值的行數)。