質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

661閲覧

辞書の数字を使うときのTypeErrorの解決法

HGK

総合スコア29

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/01/17 09:59

現在、pythonで学級の人間関係の様子のシュミレーションを行っています
そのコードは次のようになります
流れは
初期設定→会話相手選択→話題対象選択→会話相手と話題対象の好感度更新→影響力更新→会話相手から話題対象の好感度更新
で1ターンです

Python

1import numpy as np 2import random 3import math 4 5a = 0.4 6b = 0.4 7c = 0.2 8v1 = 0.3 9v2 = 0.3 10v3 = 0.6 11w1 = 0.2 12w2 = 0.2 13w3 = 0.6 14ap = 0.3 15rm = 0.1 16q = 0.3 17K = 10 18issues =10 19 20def sign(x,y): 21 if x*y>0: 22 sign = 1 23 if x*y == 0: 24 sign = 0 25 if x*y<0: 26 sign = -1 27 return sign 28 29def gij(x,y,z): 30 change = v1*(sign(x,y)*(abs(x*y)**0.5)-z) 31 return change 32 33 34class Agent: 35 def __init__(self,agent_id): 36 self.id = agent_id 37 self.talk = [] 38 self.topic = [] 39 self.f = np.random.uniform(low=0.0, high=0.1, size=None) #影響力 40 self.s = {} #影響力更新で使用 41 self.friend_list = [] #友人リンク 42 self.hi_friend_list = [] #被友人リンク 43 self.exclusion_list = [] #排斥リンク 44 self.hi_exclusion_list = [] #被排斥リンク 45 self.lp = {} #lpi iu 自分からuへの好感度 46 self.lc = {} #lc iu 実際の好感度 47 self.lagent = {} #lpi ui uからの好感度 48 self.lpi = {} #lpi uj u→j 自分が思うuからjへの好感度 49 self.lx = {} #lpi ix 自分の話題xへの好感度 50 self.lxagent = {} #lpi ux 自分が思うuの話題xへの好感度 51 self.lpiux = {} #lpi ux 自分のuの話題xへの好感度 52 53 def First_set(self,agents): #初期設定 54 for agent in agents: 55 kari = {} 56 if agent is self: 57 continue 58 likability = np.random.uniform(low=-0.1, high=0.1, size=None) 59 self.lp[agent.id] = likability 60 self.lc[agent.id] = likability 61 like = np.random.uniform(low=-0.1, high=0.1, size=None) 62 self.lagent[agent.id] = like 63 for t in agents: 64 if t is agent: 65 continue 66 interested = np.random.uniform(low=-0.1, high=0.1, size=None) 67 kari[t.id] = interested 68 self.lpi[agent.id] = kari 69 70 for issue in range(issues): 71 instinct = np.random.uniform(low=-0.1, high=0.1, size=None) 72 self.lx[issue] = instinct 73 kari = {} 74 for agent in agents: 75 if issue is agent: 76 continue 77 instinct = np.random.uniform(low=-0.1, high=0.1, size=None) 78 kari[agent.id] = instinct 79 self.lxagent[issue] = kari 80 81 for agent in agents: 82 kari = {} 83 if agent is self: 84 continue 85 for issue in range(issues): 86 if agent.id is issue: 87 continue 88 likability = np.random.uniform(low=-0.1, high=0.1, size=None) 89 kari[issue] = likability 90 self.lpiux[agent.id] = kari 91 92 def decide_talk_man(self,agents): #会話相手選択 93 agents_except_me = {} 94 weights_for_me = [] 95 z = 0 96 for agent in agents: 97 if agent is self: 98 continue 99 h = a*self.lp[agent.id]+b*self.lagent[agent.id]*(1-(self.f-agent.f))+c*(self.f-agent.f) 100 h = (h+0.8)/1.6 101 z += h 102 for agent in agents: 103 if agent is self: 104 continue 105 h = a*self.lp[agent.id]+b*self.lagent[agent.id]*(1-(self.f-agent.f))+c*(self.f-agent.f) 106 h = (h+0.8)/1.6 107 weight = h / z 108 agents_except_me[agent.id] = agent.id 109 weights_for_me.append(weight) 110 self.talk = random.choices(list(agents_except_me.values()), weights=weights_for_me) 111 return self.talk 112 113 def decide_topic(self,agents,talk): #話題選択 114 talks = self.talk[0] 115 topic_except_me = {} 116 weights_for_me = [] 117 zz = 0 118 119 for agent in agents: 120 if agent is self: 121 continue 122 if agent.id == talks: 123 for age in agents: 124 talk_f = agent.f 125 if age is agent or age is self: 126 continue 127 zz += abs(self.lp[age.id]*(1-(talk_f-self.f))+self.lpi[agent.id][age.id]*(1-(self.f-talk_f))) 128 129 for issue in range(issues): 130 for agent in agents: 131 if agent is self: 132 continue 133 if agent.id ==talks: 134 zz += abs(self.lx[issue]*(1-(talk_f-self.f))+self.lxagent[issue][agent.id]*(1-(self.f-talk_f))) 135 136 for agent in agents: 137 if agent is self: 138 continue 139 if agent.id == talks: 140 for age in agents: 141 if age is agent or age is self: 142 continue 143 r = abs(self.lp[age.id]*(1-(talk_f-self.f))+self.lpi[agent.id][age.id]*(1-(self.f-talk_f)))/zz 144 topic_except_me[age.id] = age.id 145 weights_for_me.append(r) 146 147 for issue in range(issues): 148 for agent in agents: 149 if agent is self: 150 continue 151 if agent.id ==talks: 152 r = abs(self.lx[issue]*(1-(talk_f-self.f))+self.lxagent[issue][agent.id]*(1-(self.f-talk_f)))/zz 153 issue += 31 154 topic_except_me[issue] = issue 155 weights_for_me.append(r) 156 157 self.topic = random.choices(list(topic_except_me.values()), weights=weights_for_me) 158 return self.topic 159 160 def update_like1(self,agents,talk,topic): #好感度更新 161 talks = talk[0] 162 topics = topic[0] 163 if topics <= 30: 164 x = self.lp[talks] 165 y = self.lp[topics] 166 ran = random.choices(("A","B")) 167 if ran == "A": 168 z = self.lpi[talks][topics] 169 else: 170 z = self.lpi[topics][talks] 171 else: 172 topics -= 31 173 x = self.lx[topics] 174 y = self.lp[talks] 175 z = self.lxagent[topics][talks] 176 topics += 31 177 l = x*y*z 178 if l>=0: 179 dlu1 = gij(y,z,x) 180 dlx1 = gij(x,z,y) 181 else: 182 A = random.choices((x,y)) 183 if A == x: 184 dlu1 = gij(x,z,0) 185 dlx1 = 0 186 else: 187 dlu1 = 0 188 dlx1 = gij(y,z,0) 189 for agent in agents: 190 if agent.id is talks: 191 r = w1*self.lp[talks]+w2*self.lagent[talks]*(1-(self.f-agent.f))+w3*(self.f-agent.f) 192 r = (r+0.8)/1.6 193 break 194 weights_for_stra = {r,1-r} 195 kinds_of_stra = ["mini","same"] 196 stra = random.choices(kinds_of_stra, weights=weights_for_stra) 197 if stra == "mini": 198 dlu2 = v2*(self.lagent[talks]-self.lp[talks]) 199 else: 200 dlu2 = v3*sign(1,(self.lagent[talks]))*(abs(self.lagent[talks]+self.lp[talks])) 201 202 dlu = dlu1+dlu2 203 dlx = dlx1 204 return dlu,dlx 205 206 def update_like2(self,talk,topic,dlu,dlx): #好感度更新2 207 talks = self.talk[0] 208 topics = self.topic[0] 209 self.lp[talks] += dlu/(math.e**(K*abs(self.lp[talks]))) 210 211 if self.lp[talks] > 1.0: 212 self.lp[talks] = 1.0 213 elif self.lp[talks] < -1.0: 214 self.lp[talks] = -1.0 215 216 self.lc[talks] = self.lp[talks] 217 218 if topics <= 30: 219 self.lp[topics] += dlx/(math.e**(K*abs(self.lp[topics]))) 220 221 if self.lp[topics] > 1.0: 222 self.lp[topics] = 1.0 223 elif self.lp[topics] < -1.0: 224 self.lp[topics] = -1.0 225 else: 226 topics -= 31 227 self.lx[topics] += dlx/(math.e**(K*abs(self.lx[topics]))) 228 229 if self.lx[topics] > 1.0: 230 self.lx[topics] = 1.0 231 elif self.lx[topics] < -1.0: 232 self.lx[topics] = -1.0 233 234 235 def link(self,agents): #友人リンク、排斥リンクの設定 236 for agent in agents: 237 if agent is self: 238 continue 239 if self.lc[agent.id] >= 0.3: 240 if agent.id in self.friend_list: 241 continue 242 self.friend_list.append(agent.id) 243 agent.hi_friend_list.append(self.id) 244 elif self.lc[agent.id] <= -0.3: 245 if agent.id in self.exclusion_list: 246 continue 247 self.exclusion_list.append(agent.id) 248 agent.hi_exclusion_list.append(self.id) 249 else: 250 pass 251 252 if self.lc[agent.id] < 0.3 and agent.id in self.friend_list: 253 self.friend_list.remove(agent.id) 254 agent.hi_friend_list.remove(self.id) 255 elif self.lc[agent.id] > -0.3 and agent.id in self.exclusion_list: 256 self.exclusion_list.remove(agent.id) 257 agent.hi_exclusion_list.remove(self.id) 258 259 def update_f(self,turn): #影響力更新 260 self.s[turn] = (len(self.hi_friend_list)-len(self.hi_exclusion_list)) 261 if turn > 0: 262 dr = rm*(self.s[turn]-self.s[turn-1]) 263 self.f += dr 264 265 if self.f > 1.0: 266 self.f = 1.0 267 elif self.f < 0: 268 self.f = 0 269 270 271 def updete_Pnet(self,agents,talk,topic): #会話相手から話題対象の好感度更新 272 talks = talk[0] 273 topics = topic[0] 274 E = np.random.uniform(low=-0.3, high=0.3, size=None) 275 for agent in agents: 276 if agent.id is talks: 277 if topics <= 30: 278 dlp = ap*(agent.lpi[topics]-self.lpi[talks][topics])+E 279 self.lpi[talks][topics] += dlp 280 281 if self.lpi[talks][topics] > 1.0: 282 self.lpi[talks][topics] = 1.0 283 elif self.lpi[talks][topics] < -1.0: 284 self.lpi[talks][topics] = -1.0 285 286 else: 287 topics -= 31 288 dlp = ap*(agent.lpiux[self.id][topics]-self.lxagent[topics][agent.id])+E 289 self.lxagent[topics][agent.id] += dlp 290 if self.lxagent[topics][agent.id] > 1.0: 291 self.lxagent[topics][agent.id] = 1.0 292 elif self.lxagent[topics][age.id] < -1.0: 293 self.lxagent[topics][agent.id] = -1.0 294 295class Simulation: 296 def __init__(self): 297 self.agents = [] 298 299 def generate_agents(self, agents_num): 300 self.agents = [Agent(agent_id) for agent_id in range(agents_num)] 301 for agent in self.agents: 302 agent.First_set(self.agents) 303 304 def play_the_game(self,episode,turns): 305 num_agents = 31 306 self.generate_agents(num_agents) 307 for turn in range(turns): 308 for agent in self.agents: 309 self.talk = agent.decide_talk_man(self.agents) 310 self.topic = agent.decide_topic(self.agents,self.talk) 311 dlu,dlx = agent.update_like1(self.agents,self.talk,self.topic) 312 agent.update_like2(self.talk,self.topic,dlu,dlx) 313 agent.link(self.agents) 314 agent.ijime_link(self.agents) 315 agent.update_f(turn) 316 agent.updete_Pnet(self.agents,self.talk,self.topic) 317 318def run(): 319 num_episode = 10 320 turns = 4000 321 sim = Simulation() 322 for episode in range(num_episode): 323 print(episode+1,"ゲーム目") 324 random.seed() 325 sim.play_the_game(episode,turns) 326 327 328run()

この時、def updete_Pnet(self, agents, talk, topic)のしきの
dlp = ap*(agent.lpi[topics]-self.lpi[talks][topics])+Eと
dlp = ap*(agent.lpiux[self.id][topics]-self.lxagent[topics][agent.id])+E
でTypeError: unsupported operand type(s) for -: 'dict' and 'float'
というエラーがでます
このエラーの解決法を教えてください

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2022/01/17 10:10 編集

憶測になりますが、最初のエラー部分は、 dlp = ap*(agent.lpi[topics][talks]-self.lpi[talks][topics])+E とするのではないでしょうか。
HGK

2022/01/17 10:19

解答ありがとうございます! おかげで解決できました
guest

回答2

0

自己解決

誤字及び初期設定のミス

投稿2022/01/17 13:14

HGK

総合スコア29

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

数値と違うのでその演算はできない、とおっしゃってますんで、
数値でないやつをどうにかする必要があります

投稿2022/01/17 10:33

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問