[74] | 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 |
|
---|