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

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

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

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

Q&A

解決済

1回答

773閲覧

結果をヒートマップで可視化する方法

HGK

総合スコア29

Python

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

0グッド

0クリップ

投稿2021/12/17 06:24

編集2021/12/18 04:03

pythonで学級の様子をマルチエージェントシミュレーションを行っています
その結果をヒートマップで生徒から生徒への好感度を表したいです
現在次のコードを組んでいます

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

これを実行後、生徒同士の好感度をヒートマップで表すにはどのようなコードを組めばいいでしょうか?

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

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

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

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

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

guest

回答1

0

自己解決

netowokxをうまく使う

投稿2021/12/20 09:17

HGK

総合スコア29

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問