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

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

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

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

Q&A

解決済

1回答

698閲覧

classで設定した初期値のエラーについて

HGK

総合スコア29

Python

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

0グッド

0クリップ

投稿2021/09/19 14:40

編集2021/09/26 09:24

pythonで学級の様子をマルチエージェントシミュレーションを行おうと考えています
その際に、あるエージェントの他のエージェントに対する好感度というパラメータを設定しています
それを用いてエージェントの会話相手を次の式があります、

(会話相手)
=(自分から相手への好感度)+(相手からの好感度) /
{(自分から他のそれぞれエージェントの好感度)+(他のそれぞれエージェントから自分の好感度)の総和}

このように会話相手をルーレット方式で決めます
この式を表現するために次のようなコードを組みました

Python

1class Agent: 2 def __init__(self): 3 self.lp = [] #自分から他のエージェントの好感度 4 self.lagent = [] #他のエージェントからの好感度 5 6 for i in range(32): 7 if i == self: #自分から自分への好感度はないのでスキップがしたい 8 self.lp.append(0) 9 else: 10 self.lp.append(np.random.uniform(low=-0.1, high=0.1, size=None)) 11 self.lagent.append(np.random.uniform(low=-0.1, high=0.1, size=None)) 12 13class Simulation: 14 def generate_agents(self,average_degree): 15 network = nx.barabasi_albert_graph(n, average_degree) 16 agents = [Agent() for id in range(n)] 17 return agents 18 19 def decide_talk_man(self): 20 ilist=[] 21 rlist=[] 22 for i in range(n): 23 if i == self: 24 pass 25 else: 26 h = self.lp[i]+self.lagent[i] 27 h = (h+0.8)/1.6 #正規化 28 z += h 29 for i in range(n): 30 if i == self: #自分から自分への好感度はないのでスキップ 31 pass 32 else: 33 h = self.lp[i]+self.lagent[i] 34 h = (h+0.8)/1.6 #正規化 35 g = h/z 36 ilist.append(agent[i]) 37 rlist.append(g) 38 39 agents = random.choice(ilist,wights = rlist) 40 return agents 41

このときAttributeError: 'Simulation' object has no attribute 'lp'とエラーが出てきました
コードのどこを修正すべきかが分かりません
また、if i == self:では自分から自分への設定をスキップすることができませんでした
以上のことを教えていただければ幸いです

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

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

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

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

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

etherbeg

2021/09/25 15:10

それでコードは全部ですか? クラスを定義しただけではプログラムは動かないはずですが。 あと「自分の好感度」「他のそれぞれエージェントの好感度」って何ですか? その直前に「自分から相手への好感度」「相手からの好感度」と書かれているように、好感度は特定の個体から特定の個体に対するものと思っていましたが。
HGK

2021/09/25 16:02

コードは抜粋したものです。その後のコードがかなり長くなるためエラーを起こしている箇所を抜粋しました。 好感度への認識はetherbeg様の認識で間違いありません。 好感度はある個体から、特定の個体に対するものです。
etherbeg

2021/09/25 16:21

ではエラーの全文を質問文に追記してください。全文というのは "Traceback (most recent call last):" から始まって、最後の行までです。もしユーザ名などで個人情報などが含まれる場合はそこは伏せ字にするか別の名前に書き換えるなどしてください。
etherbeg

2021/09/25 17:50 編集

それと、プログラム全体でどんなシミュレーションを行おうとしているのか、プログラムではなく日本語でいいので、説明していただけますか。このプログラムを実行すると、どういうプロセスを経て、何が結果として得られるのか。(質問に追記してください)
etherbeg

2021/09/25 17:55

Simulationというクラスを定義されていますが、これをクラスにしようと思われたのはなぜですか。もし参考にしたコードがあるのなら、インターネットで見られるものであれば、リンクを質問に追記してください。
etherbeg

2021/09/26 03:07

その後のコードがかなり長くなるとはどの程度の長さでしょうか。全文が無理ならと、回答に必要な情報は何かと考えながら上にコメントをしてきましたが、やっぱりコードの全体がないと無理です。抜粋されると書かれていない部分を推測する手間がかかりますし、その推測が間違っていたら全てが無駄になります。長くなってもいいのでプログラムの全部を貼ってください。
guest

回答1

0

ベストアンサー

修正したコード例です。
クラス設計を変更した他、変数名・メソッド名も適当に変更した箇所があります。
このクラスがプラグラムの他の部分でどう使われているのか分からないので、この修正で良いかどうかは分かりません。あくまで参考程度に考えて、実際の修正はご自分で行ってください。

python

1import random 2import numpy as np 3 4 5class Agent: 6 def __init__(self, agent_id): 7 self.id = agent_id 8 self.likability_of_agents = {} # 他のエージェントの好感度 9 self.agents_talk_to = [] # 話しかけるエージェントのID 10 11 def set_likability_of_agents(self, agents): 12 """自分から見た他のエージェントの好感度を設定する""" 13 for agent in agents: 14 if agent is self: 15 continue 16 likability = np.random.uniform(low=-0.1, high=0.1, size=None) 17 self.likability_of_agents[agent.id] = likability 18 19 def decide_agents_talk_to(self, agents, num_of_talk_to): 20 """話しかける相手を決める 21 num_of_talk_to: 話しかける人数 22 注:random.choices の選択は重複あり 23 """ 24 agents_except_me = [] 25 weights_for_me = [] 26 z = 0 27 for agent in agents: 28 if agent is self: 29 continue 30 h = self.likability_of_agents[agent.id] + agent.likability_of_agents[self.id] 31 h = (h + 0.8) / 1.6 32 z += h 33 for agent in agents: 34 if agent is self: 35 continue 36 h = self.likability_of_agents[agent.id] + agent.likability_of_agents[self.id] 37 h = (h + 0.8) / 1.6 38 weight = h / z 39 agents_except_me.append(agent.id) 40 weights_for_me.append(weight) 41 self.agents_talk_to = random.choices(agents_except_me, weights=weights_for_me, k=num_of_talk_to) 42 43 44class Simulation: 45 def __init__(self): 46 self.agents = [] 47 48 def generate_agents(self, agents_num): 49 self.agents = [Agent(agent_id) for agent_id in range(agents_num)] 50 for agent in self.agents: 51 agent.set_likability_of_agents(self.agents) 52 53 def update_agents_talk_to(self, num_of_talk_to): 54 for agent in self.agents: 55 agent.decide_agents_talk_to(self.agents, num_of_talk_to) 56 57 58agents_num = 10 # エージェントの人数 59num_of_talk_to = 3 # 話しかける相手の人数 60 61simulation = Simulation() 62simulation.generate_agents(agents_num) 63simulation.update_agents_talk_to(num_of_talk_to) 64 65for agent in simulation.agents: 66 print("Likabilities for Agent", agent.id, ":") 67 for agent_id in agent.likability_of_agents: 68 print(" agent", agent_id, ":", agent.likability_of_agents[agent_id]) 69 print("Agent", agent.id, "talk to agents:", agent.agents_talk_to) 70 print()

実行結果例:

sh

1Likabilities for Agent 0 : 2 agent 1 : 0.003593791220430312 3 agent 2 : -0.06671394549157375 4 agent 3 : -0.06401199018940962 5 agent 4 : 0.013920278293366617 6 agent 5 : 0.04516375543511855 7 agent 6 : -0.011912824254704718 8 agent 7 : 0.026153025114075773 9 agent 8 : 0.011868768479560948 10 agent 9 : 0.04240143720637654 11Agent 0 talk to agents: [9, 3, 3] 12 13Likabilities for Agent 1 : 14 agent 0 : -0.09781358022021767 15 agent 2 : -0.03220283667278549 16 agent 3 : 0.09983247539891038 17 agent 4 : 0.020370231363201152 18 agent 5 : -0.052236895694299214 19 agent 6 : -0.041826511490220014 20 agent 7 : 0.07382746158645145 21 agent 8 : -0.019834025506131975 22 agent 9 : -0.037920267500814835 23Agent 1 talk to agents: [9, 9, 5] 24 25Likabilities for Agent 2 : 26 agent 0 : 0.007480112525538596 27 agent 1 : 0.06622925842696986 28 agent 3 : -0.05937665708998981 29 agent 4 : -0.09797388087204717 30 agent 5 : 0.004092525403284336 31 agent 6 : -0.04524524368054875 32 agent 7 : -0.024428248596180008 33 agent 8 : 0.09806301314116633 34 agent 9 : 0.06706246347669592 35Agent 2 talk to agents: [3, 9, 9] 36 37Likabilities for Agent 3 : 38 agent 0 : 0.06318506659488099 39 agent 1 : 0.04154805913455695 40 agent 2 : 0.046824471192876305 41 agent 4 : -0.04841415159437523 42 agent 5 : 0.030412330217516353 43 agent 6 : 0.011326247826077385 44 agent 7 : -0.01947311717839298 45 agent 8 : 0.03953325741188035 46 agent 9 : 0.037230015904898495 47Agent 3 talk to agents: [6, 8, 4] 48 49Likabilities for Agent 4 : 50 agent 0 : 0.035071453810674974 51 agent 1 : 0.007708342806642052 52 agent 2 : 0.09629976405160354 53 agent 3 : 0.047898922319321524 54 agent 5 : -0.08225314707129967 55 agent 6 : 0.0732762172352446 56 agent 7 : -0.03483131375444026 57 agent 8 : -0.09498875689721964 58 agent 9 : 0.04799264995912833 59Agent 4 talk to agents: [9, 9, 1] 60 61Likabilities for Agent 5 : 62 agent 0 : 0.09712575280879204 63 agent 1 : -0.017286012632382164 64 agent 2 : -0.0464031944152709 65 agent 3 : -0.01162986221361706 66 agent 4 : 0.026563041670285753 67 agent 6 : -0.017724797205174656 68 agent 7 : -0.02187775667083669 69 agent 8 : 0.009053454160764349 70 agent 9 : -0.0023210838221180835 71Agent 5 talk to agents: [3, 8, 2] 72 73Likabilities for Agent 6 : 74 agent 0 : -0.01233904663365934 75 agent 1 : -0.08623998475316791 76 agent 2 : 0.08752930090693042 77 agent 3 : 0.03171909263521927 78 agent 4 : 0.06068698765865413 79 agent 5 : 0.03423829116205521 80 agent 7 : 0.02967733664736394 81 agent 8 : 0.08138695922830874 82 agent 9 : -0.01405451600718019 83Agent 6 talk to agents: [7, 4, 5] 84 85Likabilities for Agent 7 : 86 agent 0 : -0.0628985022361885 87 agent 1 : 0.028492129344750927 88 agent 2 : -0.017138207697649246 89 agent 3 : 0.04575839878181304 90 agent 4 : 0.04550300157454565 91 agent 5 : 0.014520931571067042 92 agent 6 : -0.028712286071273296 93 agent 8 : -0.09290597399555577 94 agent 9 : 0.043532811971355 95Agent 7 talk to agents: [8, 6, 1] 96 97Likabilities for Agent 8 : 98 agent 0 : 0.023586100926503414 99 agent 1 : 0.0192945084126281 100 agent 2 : -0.02963447113959075 101 agent 3 : 0.04566196880340906 102 agent 4 : -0.06215453197642884 103 agent 5 : -0.03314459931403349 104 agent 6 : -0.09762054989356109 105 agent 7 : 0.02394935196646117 106 agent 9 : 0.0059884445387679425 107Agent 8 talk to agents: [4, 4, 0] 108 109Likabilities for Agent 9 : 110 agent 0 : -0.05404362270134604 111 agent 1 : 0.09942924969581102 112 agent 2 : -0.014090528960642154 113 agent 3 : 0.07190045452630944 114 agent 4 : 0.054587551771866555 115 agent 5 : 0.010071609749546837 116 agent 6 : -0.08798323916148171 117 agent 7 : -0.04588835725730183 118 agent 8 : 0.07595674818349404 119Agent 9 talk to agents: [4, 8, 7] 120

投稿2021/09/27 04:52

etherbeg

総合スコア1195

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

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

HGK

2021/09/27 12:55

具体的なコードまでありがとうございます! このコード参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問