DP問題で、考察のためにタップルにして答えを返したいのですが、メイン関数の下の方の
outcomes[j][1]
をタップルとして挿入すると解にエラーが生じます。色々と試行錯誤しているのですが、何がエラーの原因か特定できませんので、もし分かる方はご教授いただけないでしょうか。
outcomes[j][1]を入れなければ、解は返ってくるので、コード自体に間違いはなく、タップル化するとうまくループできずに、エラーになっているようです。
メインの関数がこちらで、stateには[1,1,1,1,0,0,0,0,0]を入れます。
_V = {} def V(state): if state.count(0)==0: return 0 if tuple(state) not in _V: nextSites = NextSite(state) outcomes = newOutcomes1(state) _V[tuple(state)] = max((ExpectedSpecies(state, nextSites[j][1])+ sum(outcomes[j][0][i][0]*V(list(outcomes[j][0][i][1])) for i in range(len(outcomes[j][0]))),outcomes[j][1]) for j in range(len(outcomes))) return _V[tuple(state)]
エラーの原因となっている行は、V(state)の下から2行目、
”for i in range(len(outcomes[j][0]))),outcomes[j][1]) for j in range(len(outcomes)))”です。
エラーメッセージは以下が返ってます。
for i in range(len(outcomes[j][0]))), outcomes[j][1]) for j in range(len(outcomes)))
TypeError: can't multiply sequence by non-int of type 'float'
試した修正としては、
・ブランケットの位置を確認。
・オリジナルの、”for i in range(len(outcomes[j][0]))) for j in range(len(outcomes)))”は正しく動いている。
・for i in range(len(outcomes[j][0]))), j ) for j in range(len(outcomes)))では同様のエラー。
・for i in range(len(outcomes[j][0]))), "1" ) for j in range(len(outcomes)))でも同様のエラーであるため、タップルにしてるのが原因かと推定。
・max([ExpectedSpecies(state, nextSites[j][1])+
sum(outcomes[j][0][i][0]*V(list(outcomes[j][0][i][1]))
for i in range(len(outcomes[j][0]))),outcomes[j][1]) for j in range(len(outcomes)))
for i in range(len(outcomes[j][0]))), i] ) for j in range(len(outcomes)))をリスト型にしてみるがエラーを解決できず。
といった状況です。
上記コードを補佐する関数が下記になります。
from itertools import combinations def NextSite(state): outcomes = GenerateOutcomes(state, [0.2 for j in Sites]) outcomes = [[outcomes[i][0], list(outcomes[i][1]), j] for i in range(len(outcomes)) for j in Sites if outcomes[i][1][j] == 0] for i in range(len(outcomes)): outcomes[i][1][outcomes[i][2]] = 1 return [[outcomes[i][1], outcomes[i][2]]for i in range(len(outcomes))] def newOutcomes1(state): nextSites = NextSite(state) outcomes = [] for i in range(len(nextSites)): outcomes.append([GenerateOutcomes(nextSites[i][0], [0.2 for j in Sites]),nextSites[i][1]]) return outcomes def SavedSpeciesList(state): SavedSpeciesList = [] for i in Sites: if state[i] == 1: SavedSpeciesList = SavedSpeciesList+[j for j in Species[i] if j not in SavedSpeciesList] return (SavedSpeciesList) def ExpectedSpecies(state, i): return (len(list(set(Species[i]) - set(SavedSpeciesList(state))))) Species={ 0:[10,15], 1:[4,8,17], 2:[18], 3:[0,10,17], 4:[1,9,11], 5:[0,5,16], 6:[14], 7:[0,9,12,16], 8:[1,7,19] } Sites = range(9) def GenerateOutcomes(State, LossProb): ans = [] tempSites = [j for j in Sites if State[j]==0] n = len(tempSites) for i in range(n+1): for tlist in combinations(tempSites, i): p = 1.0 slist = list(State) for j in range(n): if tempSites[j] in tlist: p *= LossProb[tempSites[j]] slist[tempSites[j]] = -1 else: p *= 1-LossProb[tempSites[j]] ans.append((p, tuple(slist))) return ans
乱雑なコードで恐縮ですが、どうぞよろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー