source: CSE3210/agent41/graphs.py

Last change on this file was 74, checked in by wouter, 21 months ago

#6 Added CSE3210 parties

File size: 4.5 KB
Line 
1import json
2
3import plotly.graph_objects as go
4
5
6def get_pareto_frontier(data):
7 x = []
8 y = []
9 pareto = data["pareto_front"]
10 for case in pareto:
11 print(case)
12 x.append(case['utility'][0])
13 y.append(case['utility'][1])
14 return x, y
15
16
17def get_kalai(data):
18 kalai = data["kalai"]
19 return kalai["utility"][0], kalai["utility"][1]
20
21
22def get_nash(data):
23 nash = data["nash"]
24 return nash["utility"][0], nash["utility"][1]
25
26
27def sketch_domain(domain):
28 """
29 Sketch the domain, including the Nash product, Kalai-Smorodinsky and Pareto frontier.
30 """
31 with open(f"domains/{domain}/specials.json") as specials:
32 data = json.load(specials)
33
34 # sketch pareto frontier
35 pareto_coords = get_pareto_frontier(data)
36 pareto_trace = go.Scatter(x=pareto_coords[0], y=pareto_coords[1],
37 mode='lines',
38 name='Pareto Frontier')
39 # sketch kalai-smorodinsky
40 kalai_coords = get_kalai(data)
41 kalai_trace = go.Scatter(x=[kalai_coords[0]], y=[kalai_coords[1]], mode='markers',
42 name='Kalai-Smorodinsky')
43 # sketch nash product
44 nash_coords = get_nash(data)
45 nash_trace = go.Scatter(x=[nash_coords[0]], y=[nash_coords[1]], mode='markers',
46 name="Nash Product")
47
48 # set up the graph
49 fig = go.Figure(pareto_trace)
50 fig.add_trace(kalai_trace)
51 fig.add_trace(nash_trace)
52 fig.update_layout(xaxis_title="profile B utility",
53 yaxis_title="profile A utility",
54 font=dict(size=18),
55 showlegend=True,
56 legend=dict(x=0.85, y=1, font=dict(size=16, color="black")), )
57 fig.update_yaxes(range=[0, 1])
58 fig.update_xaxes(range=[0, 1])
59 fig.update_traces(marker=dict(size=18,
60 line=dict(width=2,
61 color='DarkSlateGrey')),
62 selector=dict(mode='markers')
63 )
64 return fig
65
66
67def sketch_negotiations(domain_fig, result_trace):
68 """
69 Sketch the utilities of the bids offered by both agents during the negotiations.
70 """
71 with open(result_trace) as results:
72
73 agent1_coords = [[], []]
74 agent2_coords = [[], []]
75 final_coords = [[], []]
76 results_data = json.load(results)
77
78 agent1 = results_data['connections'][0]
79 agent1_name = agent1[:-2].rpartition('_')[2]
80 agent2 = results_data['connections'][1]
81 agent2_name = agent2[:-2].rpartition('_')[2]
82
83 for action in results_data['actions']:
84 if 'Offer' in action.keys():
85 offer = action['Offer']
86 if offer['actor'] == agent1:
87 agent1_coords[0].append(list(offer["utilities"].values())[0])
88 agent1_coords[1].append(list(offer["utilities"].values())[1])
89 else:
90 agent2_coords[0].append(list(offer["utilities"].values())[0])
91 agent2_coords[1].append(list(offer["utilities"].values())[1])
92 else:
93 final_coords[0] = list(action['Accept']['utilities'].values())[0]
94 final_coords[1] = list(action['Accept']['utilities'].values())[1]
95 agent1_trace = go.Scatter(x=agent1_coords[0], y=agent1_coords[1], mode='markers+lines',
96 name=agent1_name)
97 agent2_trace = go.Scatter(x=agent2_coords[0], y=agent2_coords[1], mode='markers+lines',
98 name=agent2_name)
99 final_point = go.Scatter(x=[final_coords[0]], y=[final_coords[1]], mode='markers',
100 name="Accepted offer", marker=dict(size=15,
101 line=dict(width=2,
102 color='DarkSlateGrey')), )
103 domain_fig.add_trace(agent1_trace)
104 domain_fig.add_trace(agent2_trace)
105 domain_fig.add_trace(final_point)
106 domain_fig.update_layout(xaxis_title=f"{agent1_name} utility",
107 yaxis_title=f"{agent2_name} utility", )
108 domain_fig.show()
109
110 return domain_fig
111
112
113if __name__ == "__main__":
114 domain_fig = sketch_domain("domain02")
115 final_fig = sketch_negotiations(domain_fig, "results/results_trace.json")
Note: See TracBrowser for help on using the repository browser.