-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathvirtuousAgent.py
More file actions
84 lines (58 loc) · 2.22 KB
/
virtuousAgent.py
File metadata and controls
84 lines (58 loc) · 2.22 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#Virtue : Reliability
import random
import numpy as np
from ethicalAgent import ethicalAgent
from miscFunctions import *
class virtuousAgent(ethicalAgent):
def __init__(self, attrs= {}):
'''
default values
virtue Cost = 2*message Cost
Max Virtue Utility = 2*message utility
'''
super().__init__("Virtue", attrs)
if('virtueChange' in attrs):
self.virtueChange = attrs['virtueChange']
else:
self.virtueChange = 2*self.msgCost
if('maxVirtueUtility' in attrs):
self.maxVirtueUtility = attrs['maxVirtueUtility']
else:
self.maxVirtueUtility = 2*self.msgUtility
if('delta' in attrs):
self.delta = attrs['delta']
else:
self.delta = 0.01
self.virtuePoints=0
def initNeig(self, neigs):
super().initNeig(neigs)
self.virtuePoints = 0
def forwardMessage(self, source, dest):
# self.msgRecvFrom[source] += 1
cost = self.delta*(self.getNodeCost()-self.getNodeUtility())+self.msgCost
# print("cost : ", cost, " virtue points: ", self.virtuePoints )
forwardUtility = -cost + min(self.virtueChange, self.maxVirtueUtility-self.virtuePoints)
# forwardUtility = -cost + self.virtueChange
# print("forward utility ", forwardUtility)
if self.virtuePoints <= 0:
dropUtility = -3*self.virtueChange
else:
dropUtility = -self.virtueChange
forwardProb = softmax([forwardUtility, dropUtility])[0]
if(random.random() < forwardProb): #Forward message
self.msgSentInter[dest] += 1
self.msgForwardedOf[source] += 1
self.virtuePoints += self.virtueChange
# print("inter " , self.msgSentInter[dest])
return True
else:
self.virtuePoints -= self.virtueChange
return False
def getVirtuePoints(self):
return self.virtuePoints
def getProperty(self, prop):
if(prop == 'virtuePoints'):
return self.getVirtuePoints()
return super().getProperty(prop)
def isStable(self, prevState):
return 1