1 | from geniusweb.opponentmodel import FrequencyOpponentModel
|
---|
2 | from decimal import Decimal
|
---|
3 | from geniusweb.issuevalue.Domain import Domain
|
---|
4 | from geniusweb.issuevalue.Bid import Bid
|
---|
5 | from typing import Dict, Optional
|
---|
6 | from geniusweb.issuevalue.Value import Value
|
---|
7 | from geniusweb.utils import val
|
---|
8 | import numpy as np
|
---|
9 |
|
---|
10 |
|
---|
11 | class FreqModelWeighted(FrequencyOpponentModel.FrequencyOpponentModel):
|
---|
12 |
|
---|
13 | def __init__(self, domain: Optional[Domain],
|
---|
14 | freqs: Dict[str, Dict[Value, int]], total: int,
|
---|
15 | resBid: Optional[Bid]):
|
---|
16 | super.__init__(domain, freqs, total, resBid)
|
---|
17 |
|
---|
18 | # Override
|
---|
19 | def getUtility(self, bid: Bid) -> Decimal:
|
---|
20 | if self._domain == None:
|
---|
21 | raise ValueError("domain is not initialized")
|
---|
22 | if self._totalBids == 0:
|
---|
23 | return Decimal(1)
|
---|
24 | sum = Decimal(0)
|
---|
25 |
|
---|
26 | for issue in val(self._domain).getIssues():
|
---|
27 | if issue in bid.getIssues():
|
---|
28 | sum = sum + Decimal(self._issueWeights[issue]) * self._getFraction(issue, val(bid.getValue(issue)))
|
---|
29 | return round(sum / len(self._bidFrequencies), FrequencyOpponentModel.FrequencyOpponentModel._DECIMALS)
|
---|
30 |
|
---|
31 | """
|
---|
32 | Find issue weights by considering count of most occurring value in each domain and scaling their sum to be 1
|
---|
33 | """
|
---|
34 | def updateIssueWeights(self):
|
---|
35 | self._issueWeights = {}
|
---|
36 | totalWeights = 0.0
|
---|
37 | for issue in val(self._domain).getIssues():
|
---|
38 | freqs = []
|
---|
39 |
|
---|
40 | for value, count in self._bidFrequencies.get(issue).items():
|
---|
41 | freqs.append(count)
|
---|
42 |
|
---|
43 | if len(freqs) <= 1:
|
---|
44 | self._issueWeights[issue] = 1
|
---|
45 | else:
|
---|
46 | freqs = np.array(freqs) / self._totalBids
|
---|
47 | self._issueWeights[issue] = np.max(freqs)
|
---|
48 | totalWeights += self._issueWeights[issue]
|
---|
49 |
|
---|
50 | for issue, weight in self._issueWeights.items():
|
---|
51 | self._issueWeights[issue] = weight / totalWeights
|
---|
52 |
|
---|
53 | return self._issueWeights
|
---|
54 |
|
---|