Source code for negmas.gb.negotiators.tough

from __future__ import annotations
from ..components import AcceptAbove, AcceptBest, AcceptTop, OfferBest, OfferTop
from .modular import MAPNegotiator

__all__ = ["ToughNegotiator", "TopFractionNegotiator"]


[docs] class ToughNegotiator(MAPNegotiator): """ Accepts and proposes only the top offer (i.e. the one with highest utility). Args: name: Negotiator name parent: Parent controller if any can_propose: If `False` the negotiator will never propose but can only accept preferences: The preferences of the negotiator ufun: The ufun of the negotiator (overrides preferences) owner: The `Agent` that owns the negotiator. Remarks: - If there are multiple outcome with the same maximum utility, only one of them will be used. """ def __init__(self, can_propose=True, **kwargs): acceptance = AcceptBest() offering = None if not can_propose else OfferBest() super().__init__(acceptance=acceptance, offering=offering, **kwargs)
[docs] class TopFractionNegotiator(MAPNegotiator): """ Offers and accepts only one of the top outcomes for the negotiator. Args: name: Negotiator name parent: Parent controller if any can_propose: If `False` the negotiator will never propose but can only accept preferences: The preferences of the negotiator ufun: The ufun of the negotiator (overrides preferences) min_utility: The minimum utility to offer or accept top_fraction: The fraction of the outcomes (ordered decreasingly by utility) to offer or accept best_first: Guarantee offering will non-increasing in terms of utility value probabilistic_offering: Offer randomly from the outcomes selected based on `top_fraction` and `min_utility` owner: The `Agent` that owns the negotiator. """ def __init__( self, min_utility=0.95, top_fraction=0.05, best_first=True, can_propose=True, **kwargs, ): acceptance = AcceptAbove(min_utility) and AcceptTop(top_fraction) offering = None if not can_propose else OfferTop(top_fraction) self._best_first = best_first self.__offered = False super().__init__(acceptance=acceptance, offering=offering, **kwargs)
[docs] def propose(self, state, dest: str | None = None): if not self.ufun: return None if not self.__offered: _, best = self.ufun.extreme_outcomes() self.__offered = True return best return super().propose(state)