negmas.genius¶
The genius module manages connections to the Genius platform and provides both Java-bridge and Python-native negotiators based on the Genius BOA (Bidding, Opponent modeling, Acceptance) architecture.
Overview¶
This module provides three ways to use Genius agents in NegMAS:
GeniusNegotiator - Connect to Java-based Genius agents through the JVM bridge
Python-Native BOA Negotiators (G-prefix) - Pure Python implementations of classic Genius agents
BOA Components - Individual components (offering, acceptance, opponent modeling) for building custom negotiators
Python-Native BOA Negotiators (Recommended)¶
These negotiators are Python implementations of classic Genius agents that do NOT require the Java bridge.
They use components from negmas.gb.components.genius and are recommended for most use cases due to
better performance and simpler setup. All names are prefixed with G to distinguish them from Java versions.
Classic Time-Dependent Agents
Negotiator |
Description |
|---|---|
|
Conservative strategy (e=0.2), concedes slowly near deadline |
|
Accommodating strategy (e=2.0), concedes quickly early on |
|
Constant concession rate (e=1.0) |
|
Never concedes (e=0), always offers best outcome |
ANAC Competition Winners and Notable Agents
Negotiator |
Year |
Description |
|---|---|---|
|
2011 |
Winner. Boulware-style with frequency-based opponent modeling |
|
2010 |
Top performer. Time-dependent with combined acceptance conditions |
|
2010 |
Notable. Time-dependent with constant threshold acceptance |
|
2010 |
Competitive. Boulware-style with previous-offer acceptance |
|
2010 |
Faculty of CS agent. Conceder with constant threshold |
|
2012 |
Winner. Conservative time-dependent with frequency opponent model |
|
2012 |
Notable. Time-dependent with max-based combined acceptance |
|
2015 |
Notable. Adaptive time-dependent with window-based acceptance |
|
— |
Random offers and accepts everything (baseline agent) |
Usage Example¶
from negmas.genius import GHardHeaded, GConceder
from negmas.sao import SAOMechanism
from negmas.preferences import LinearAdditiveUtilityFunction
from negmas.outcomes import make_issue
# Create a simple negotiation scenario
issues = [make_issue(10, "price"), make_issue(5, "quantity")]
# Create utility functions for each negotiator
ufun1 = LinearAdditiveUtilityFunction.random(issues=issues, reserved_value=0.0)
ufun2 = LinearAdditiveUtilityFunction.random(issues=issues, reserved_value=0.0)
# Create negotiators
n1 = GHardHeaded(name="buyer", ufun=ufun1)
n2 = GConceder(name="seller", ufun=ufun2)
# Run negotiation
mechanism = SAOMechanism(issues=issues, n_steps=100)
mechanism.add(n1)
mechanism.add(n2)
mechanism.run()
Java Bridge (GeniusNegotiator)¶
For access to the full ~200 Genius agents, you can use the Java bridge. This requires:
Java JRE 8 or higher installed
Running
negmas genius-setupto download the bridgeStarting the bridge with
negmas geniusbefore using Java agents
- class negmas.genius.GeniusNegotiator(preferences: UtilityFunction | None = None, name: str | None = None, parent: Controller | None = None, owner: Agent = None, java_class_name: str | None = None, domain_file_name: str | Path | None = None, utility_file_name: str | Path | None = None, can_propose=True, auto_load_java: bool = True, port: int = 25337, genius_bridge_path: str | None = None, strict: bool | None = None, none_offer_response: str = 'latest', id: str | None = None, **kwargs)[source]¶
Bases:
SAOPRNegotiatorEncapsulates a Genius Negotiator
- Parameters:
preferences – The ufun of the negotiator [optional]
name – Negotiator name [optional]
parent – Parent
Controllerowner – The agent that owns the negotiator (if any)
java_class_name – The java class name of the Geinus underlying agent
domain_file_name – Optional domain file name (containing the negotiation issues or agenda)
utility_file_name – Optional ufun file name (xml) from which a ufun will be loaded for the agent
can_propose – The negotiator can propose
auto_load_java – Load the genius bridge if needed
port – The port to load the genius bridge to (or use if it is already loaded)
genius_bridge_path – The path to the genius bridge
strict – If True, raise exceptions if any exception is thrown by the agent or the bridge (or if the agent could not choose an action). If false, ignore these exceptions and assume a None return. If None use strict for n_steps limited negotiations and not strict for time_limit limited ones.
none_offer_response – How to respond when receiving a None offer. Options are: - “latest”: Respond with the latest offer made by this negotiator (default) - “best”: Respond with the best offer according to this negotiator’s ufun If “latest” is selected but no previous offer exists, falls back to “best”.
- cancel(reason=None) None[source]¶
Cancels the negotiation and notifies the Java-side agent.
- Parameters:
reason – Optional explanation for why the negotiation was cancelled
- destroy_java_counterpart(state=None) None[source]¶
Destroys the Java-side Genius agent and cleans up temporary files.
- Parameters:
state – The final mechanism state, used to report agreement if any
- join(nmi, state, *, preferences=None, ufun=None, role='negotiator') bool[source]¶
Joins a negotiation mechanism and initializes the Java-side agent.
- Parameters:
nmi – The negotiation mechanism interface providing negotiation context
state – The current mechanism state at join time
preferences – Optional utility function for this negotiator
ufun – Alias for preferences (deprecated)
role – The role this negotiator plays in the mechanism
- Returns:
True if successfully joined, False otherwise
- classmethod negotiators(agent_based=True, party_based=True) list[str][source]¶
Returns a list of all available agents in genius 8.4.0
- Parameters:
agent_based – Old agents based on the Java class Negotiator
party_based – Newer agents based on the Java class AbstractNegotiationParty
Returns:
- on_negotiation_end(state: MechanismState) None[source]¶
called when a negotiation is ended
- on_negotiation_start(state: MechanismState) None[source]¶
Called when the info starts. Connects to the JVM.
- on_none_offer(state: SAOState, source: str | None = None) SAOResponse[source]¶
Called when the negotiator receives a None offer.
Override this method to customize behavior when a None offer is received. The default implementation uses
none_offer_responsesetting to decide whether to respond with the latest offer or the best offer.- Parameters:
state – The current SAO negotiation state
source – The ID of the negotiator who made the None offer
- Returns:
SAOResponse with the action and offer to respond with
- parse(action: str) tuple[ResponseType, tuple | None][source]¶
Parses an action into a ResponseType and an Outcome (if one is included) :param action:
Returns:
- propose(state: GBState, dest: str | None = None) tuple | None[source]¶
Generates a proposal for General Bargaining (GB) mechanisms.
- Parameters:
state – The current GB negotiation state
dest – Optional target negotiator ID for the proposal
- Returns:
The proposed outcome, or None if ending/accepting
- propose_sao(state: SAOState, dest: str | None = None) SAOResponse[source]¶
Generates a new proposal or response for SAO mechanisms.
- Parameters:
state – The current SAO negotiation state
dest – Optional target negotiator ID for the proposal
- Returns:
The response containing the action type and proposed outcome
- classmethod random_negotiator(agent_based=True, party_based=True, port: int = 25337, domain_file_name: str | None = None, utility_file_name: str | None = None, auto_load_java: bool = False, can_propose=True, name: str | None = None) GeniusNegotiator[source]¶
Returns an agent with a random class name
- Parameters:
name – negotiator name
can_propose – Can this negotiator propose?
auto_load_java – load the JVM if needed
utility_file_name – Name of the utility xml file
domain_file_name – Name of the domain XML file
port – port number to use if the JVM is to be started
agent_based – Old agents based on the Java class Negotiator
party_based – Newer agents based on the Java class AbstractNegotiationParty
- Returns:
GeniusNegotiator an agent with a random java class
- classmethod random_negotiator_name(agent_based=True, party_based=True)[source]¶
Returns a randomly selected Genius negotiator class name.
- Parameters:
agent_based – Include older agents based on the Java Negotiator class
party_based – Include newer agents based on AbstractNegotiationParty
- property relative_time: float | None[source]¶
The relative negotiation time as reported by the Genius agent (0.0 to 1.0).
- Returns:
The relative time between 0 and 1, or None if unavailable
- respond(state: GBState, source: str | None = None) ResponseType[source]¶
Responds to an offer in General Bargaining (GB) mechanisms.
- Parameters:
state – The current GB negotiation state
source – The ID of the negotiator who made the offer (required)
- Returns:
The response type (accept, reject, or end negotiation)
- respond_sao(state: SAOState, source: str | None = None) None[source]¶
Processes an incoming offer and prepares a response for SAO mechanisms.
- Parameters:
state – The current SAO negotiation state containing the offer
source – The ID of the negotiator who made the current offer
Bridge Management¶
- class negmas.genius.GeniusBridge[source]¶
Bases:
objectGeniusBridge implementation.
- classmethod agent_exists(uuid: str, port: int = 25337) bool[source]¶
Checks if a specific agent exists in the bridge.
- Parameters:
uuid – The UUID of the agent to check
port – The port at which the bridge is listening in Java
- Returns:
True if the agent exists, False otherwise
- Remarks:
Thread-safe via ConcurrentHashMap on the Java side
- classmethod clean(port=25337) bool[source]¶
Removes all agents and runs garbage collection on the bridge
- classmethod clean_all() bool[source]¶
Removes all agents and runs garbage collection on all bridges.
- classmethod close_gateway(port=25337)[source]¶
Closes the gateway.
- Parameters:
port – The port the gateway is connected to. If None, DEFAULT_JAVA_PORT is used.
- classmethod connect(port: int = 25337) JavaObject[source]¶
Connects to a running genius-bridge
- Parameters:
port – The port at which the bridge in listening in Java
- Remarks:
The difference between this method and start() is that this one does not attempt to start a java bridge if one does not exist.
- classmethod gateway(port=25337, force=False) JavaGateway | None[source]¶
Finds and returns a gateway for a genius bridge on the given port
- Parameters:
port – The port used by the Jave genius bridge.
force – If true, a new gateway is created even if one exists in the list of gateways available in
GeniusBridge.gateways.
- Returns:
The gateway if found otherwise an exception will be thrown
- Remarks:
this method does NOT start a bridge. It only connects to a running bridge.
- classmethod get_active_agents(port: int = 25337) list[str][source]¶
Gets all active agent UUIDs from the bridge.
- Parameters:
port – The port at which the bridge is listening in Java
- Returns:
A list of agent UUIDs currently active in the bridge
- Remarks:
Thread-safe via ConcurrentHashMap on the Java side
Returns empty list if bridge is not running or connection fails
- classmethod get_agent_count(port: int = 25337) int[source]¶
Gets the number of active agents in the bridge.
- Parameters:
port – The port at which the bridge is listening in Java
- Returns:
The number of active agents, or 0 if bridge is not running
- Remarks:
Thread-safe via ConcurrentHashMap on the Java side
- classmethod is_running(port: int) bool[source]¶
Returns true if a geniusbridge.jar is running on the given port
- classmethod kill(port: int = 25337, wait: bool = True) bool[source]¶
Kills the java bridge connected to this port by asking it to exit
- classmethod kill_forced(port: int = 25337, wait: bool = True) bool[source]¶
Kills the java bridge connected to this port forcibly.
- Remarks:
The java bridge process must have been started by this process.
- classmethod kill_threads(port: int = 25337, wait_time: float = 0.5) bool[source]¶
kills all threads in the given java bridge
- classmethod restart(port: int = 25337, *args, **kwargs) bool[source]¶
Starts or restarts the genius bridge
- Parameters:
port – port number to use
- Returns:
True if successful
- classmethod shutdown(port: int = 25337, wait: bool = True) bool[source]¶
Attempts to shutdown the bridge on that port.
- Parameters:
port – The port to shutdown.
- Remarks:
This is the cleanest way to close a java bridge and it simply sends a message to the bridge to shut itself down and cleanly shuts down the py4j bridge.
- classmethod start(port: int = 25337, path: str | None = None, debug: bool = False, timeout: float = 0, force_timeout: bool = True, save_logs: bool = False, log_path: PathLike | None = None, die_on_exit: bool = False, use_shell: bool = False, verbose: bool = False, allow_agent_print: bool = False) int[source]¶
Initializes a genius connection
- Parameters:
port – port number to use. A value <= 0 means get any free tcp port.
path – The path to a JAR file that runs negloader
debug – If true, passes –debug to the bridge
timeout – If positive and nonzero, passes it as the global timeout for the bridge. Note that currently, the bridge supports only integer timeout values and the fraction will be truncated.
force_timeout – if false, no timeout will be forced by the bridge
save_logs – If false, the brige is instructed not to save any logs
log_path – the path to store logs from the bridge. Onle effective if
save_logsIf not given, defaults to ~/negmas/geniusbridge/logs/{port}-{datetime}.txtdie_on_exit – If given, the bridge will be closed when this process is ended
use_shell – If given, the bridge will be started in a subshell.
- Returns:
The port number used by the java process. 0 for failure
- Remarks:
if a bridge is running, it will return its port and it does not matter whether or not the bridge is started from this process or any other way.
it is recommended not to change the defaults for this function.
- classmethod stop(port: int = 25337) bool[source]¶
Stops a running bridge
- Parameters:
port – port number to use
- Returns:
True if successful
- Remarks:
You should use this method to stop bridges.
- It tries the following in order:
shutdown the java bridge by calling its shutdown() method.
killing the java bridge by calling its kill() method.
killing the java bridge forcibly by killing the process
This method always waits for a short time to allow each process to complete. If it returns True then the bridge is no longer listening on the given port.
- classmethod wait_until_listening(port: int = 25337, timeout: float = 0.5) bool[source]¶
waits until a genius bridge is listening to the given port
- Parameters:
port – The port to test
timeout – Maximum time to wait before returning (in seconds)
- Returns:
True if the genius bridge is running any more (success).
- classmethod wait_until_not_listening(port: int = 25337, timeout: float = 0.5) bool[source]¶
waits until the genius bridge is not listening to the given port
- Parameters:
port – The port to test
max_sleep – Maximum time to wait before returning (in seconds)
- Returns:
True if the genius bridge is NOT running any more (success).
- negmas.genius.init_genius_bridge(path: Path | str | None = None, port: int = 25337, debug: bool = False, timeout: float = 0, force_timeout: bool = True, save_logs: bool = False, log_path: PathLike | None = None, die_on_exit: bool = False, use_shell: bool = False, verbose: bool = False, allow_agent_print: bool = False) int[source]¶
Initializes a genius connection
- Parameters:
path – The path to a JAR file that runs negloader
port – port number to use
debug – If true, passes –debug to the bridge
timeout – If positive and nonzero, passes it as the global timeout for the bridge. Note that currently, the bridge supports only integer timeout values and the fraction will be truncated.
- Returns:
Port if started. -1 if a bridge is already running on this port. 0 if failed
- negmas.genius.genius_bridge_is_running(port: int = 25337) bool[source]¶
Checks whether a Genius Bridge is running. A genius bridge allows you to use
GeniusNegotiatorobjects.Remarks:
You can start a Genius Bridge in at least three ways:
execute the python function
init_genius_bridge()in this modulerun “negmas genius” on the terminal
execute
GeniusBridge.start()
Constants¶
- negmas.genius.DEFAULT_JAVA_PORT = 25337[source]¶
int([x]) -> integer int(x, base=10) -> integer
Convert a number or string to an integer, or return 0 if no arguments are given. If x is a number, return x.__int__(). For floating-point numbers, this truncates towards zero.
If x is not a number or if base is given, then x must be a string, bytes, or bytearray instance representing an integer literal in the given base. The literal can be preceded by ‘+’ or ‘-’ and be surrounded by whitespace. The base defaults to 10. Valid bases are 0 and 2-36. Base 0 means to interpret the base from the string as an integer literal. >>> int(‘0b100’, base=0) 4
- negmas.genius.DEFAULT_PYTHON_PORT = 25338[source]¶
int([x]) -> integer int(x, base=10) -> integer
Convert a number or string to an integer, or return 0 if no arguments are given. If x is a number, return x.__int__(). For floating-point numbers, this truncates towards zero.
If x is not a number or if base is given, then x must be a string, bytes, or bytearray instance representing an integer literal in the given base. The literal can be preceded by ‘+’ or ‘-’ and be surrounded by whitespace. The base defaults to 10. Valid bases are 0 and 2-36. Base 0 means to interpret the base from the string as an integer literal. >>> int(‘0b100’, base=0) 4
- negmas.genius.DEFAULT_GENIUS_NEGOTIATOR_TIMEOUT = 9223372036854775807[source]¶
int([x]) -> integer int(x, base=10) -> integer
Convert a number or string to an integer, or return 0 if no arguments are given. If x is a number, return x.__int__(). For floating-point numbers, this truncates towards zero.
If x is not a number or if base is given, then x must be a string, bytes, or bytearray instance representing an integer literal in the given base. The literal can be preceded by ‘+’ or ‘-’ and be surrounded by whitespace. The base defaults to 10. Valid bases are 0 and 2-36. Base 0 means to interpret the base from the string as an integer literal. >>> int(‘0b100’, base=0) 4
- negmas.genius.ANY_JAVA_PORT = -1[source]¶
int([x]) -> integer int(x, base=10) -> integer
Convert a number or string to an integer, or return 0 if no arguments are given. If x is a number, return x.__int__(). For floating-point numbers, this truncates towards zero.
If x is not a number or if base is given, then x must be a string, bytes, or bytearray instance representing an integer literal in the given base. The literal can be preceded by ‘+’ or ‘-’ and be surrounded by whitespace. The base defaults to 10. Valid bases are 0 and 2-36. Base 0 means to interpret the base from the string as an integer literal. >>> int(‘0b100’, base=0) 4
- negmas.genius.RANDOM_JAVA_PORT = 0[source]¶
int([x]) -> integer int(x, base=10) -> integer
Convert a number or string to an integer, or return 0 if no arguments are given. If x is a number, return x.__int__(). For floating-point numbers, this truncates towards zero.
If x is not a number or if base is given, then x must be a string, bytes, or bytearray instance representing an integer literal in the given base. The literal can be preceded by ‘+’ or ‘-’ and be surrounded by whitespace. The base defaults to 10. Valid bases are 0 and 2-36. Base 0 means to interpret the base from the string as an integer literal. >>> int(‘0b100’, base=0) 4
Python-Native BOA Negotiator Classes¶
- class negmas.genius.GBoulware(**kwargs)[source]
Bases:
BOANegotiatorPython-native Boulware negotiator.
A time-dependent agent with e < 1 (typically e=0.2), which concedes slowly and only makes significant concessions near the deadline. This is a conservative negotiation strategy.
The Boulware strategy is named after the labor negotiator Lemuel Boulware, known for making “take it or leave it” offers.
- Uses:
Offering: GBoulwareOffering (e=0.2)
Acceptance: GACNext (accepts if opponent’s offer >= next planned offer)
Model: None (no opponent modeling)
- class negmas.genius.GConceder(**kwargs)[source]
Bases:
BOANegotiatorPython-native Conceder negotiator.
A time-dependent agent with e > 1 (typically e=2.0), which concedes quickly early in the negotiation. This is an accommodating negotiation strategy.
- Uses:
Offering: GConcederOffering (e=2.0)
Acceptance: GACNext (accepts if opponent’s offer >= next planned offer)
Model: None (no opponent modeling)
- class negmas.genius.GLinear(**kwargs)[source]
Bases:
BOANegotiatorPython-native Linear negotiator.
A time-dependent agent with e = 1, which concedes at a constant rate throughout the negotiation.
- Uses:
Offering: GLinearOffering (e=1.0)
Acceptance: GACNext (accepts if opponent’s offer >= next planned offer)
Model: None (no opponent modeling)
- class negmas.genius.GHardliner(**kwargs)[source]
Bases:
BOANegotiatorPython-native Hardliner negotiator.
A time-dependent agent with e = 0, which never concedes and always offers its best outcome. This is the most aggressive negotiation strategy.
- Uses:
Offering: GHardlinerOffering (e=0)
Acceptance: GACNext (accepts if opponent’s offer >= next planned offer)
Model: None (no opponent modeling)
- class negmas.genius.GHardHeaded(e: float = 0.2, **kwargs)[source]
Bases:
BOANegotiatorPython-native HardHeaded agent (ANAC 2011 Winner).
HardHeaded (KLH) won the ANAC 2011 competition. It uses a Boulware-style time-dependent offering strategy combined with frequency-based opponent modeling to estimate the opponent’s preferences.
The agent tracks which issues remain unchanged in opponent offers to infer which issues are most important to the opponent.
- Uses:
Offering: GTimeDependentOffering (e=0.2, Boulware-style)
Acceptance: GACNext (accepts if opponent’s offer >= next planned offer)
Model: GHardHeadedFrequencyModel (frequency-based opponent modeling)
References
van Krimpen, T.,”;”; man, D.;”; Hindriks, K. (2011). “HardHeaded”. ANAC 2011.
- class negmas.genius.GAgentK(e: float = 0.2, **kwargs)[source]
Bases:
BOANegotiatorPython-native AgentK (ANAC 2010).
AgentK was one of the top performers in ANAC 2010. It uses a time-dependent offering strategy with adaptive acceptance based on a combination of conditions (AC_Combi).
- Uses:
Offering: GTimeDependentOffering (e=0.2)
Acceptance: GACCombi (combined acceptance conditions)
Model: GDefaultModel (basic opponent model)
References
Kawaguchi, S.; Fujita, K.; Ito, T. (2010). “AgentK: Compromising Strategy based on Estimated Maximum Utility for Automated Negotiating Agents”. ANAC 2010.
- class negmas.genius.GAgentSmith(e: float = 0.3, c: float = 0.8, **kwargs)[source]
Bases:
BOANegotiatorPython-native AgentSmith (ANAC 2010).
AgentSmith was a notable agent in ANAC 2010, using a time-dependent strategy with frequency-based opponent modeling. It uses AC_Const acceptance which accepts any offer above a fixed utility threshold.
- Uses:
Offering: GTimeDependentOffering (e=0.3)
Acceptance: GACConst (accepts above fixed threshold)
Model: GSmithFrequencyModel (Smith-style frequency model)
References
de Jonge, D. (2010). “AgentSmith”. ANAC 2010.
- class negmas.genius.GNozomi(e: float = 0.2, **kwargs)[source]
Bases:
BOANegotiatorPython-native Nozomi agent (ANAC 2010).
Nozomi was a competitive agent in ANAC 2010. It uses a Boulware-style time-dependent offering with AC_Previous acceptance, which accepts if the opponent’s offer is better than their previous offer.
- Uses:
Offering: GTimeDependentOffering (e=0.2)
Acceptance: GACPrevious (accepts if better than opponent’s previous offer)
Model: GDefaultModel (basic opponent model)
References
Fujita, K. (2010). “Nozomi”. ANAC 2010.
- class negmas.genius.GFSEGA(c: float = 0.7, **kwargs)[source]
Bases:
BOANegotiatorPython-native FSEGA agent (ANAC 2010).
AgentFSEGA (Faculty of Computer Science Agent) from ANAC 2010 uses a conceding strategy with constant threshold acceptance.
- Uses:
Offering: GConcederOffering (e=2.0)
Acceptance: GACConst (accepts above fixed threshold)
Model: GDefaultModel (basic opponent model)
References
Zaharia, G.; et al. (2010). “AgentFSEGA”. ANAC 2010.
- class negmas.genius.GCUHKAgent(e: float = 0.15, **kwargs)[source]
Bases:
BOANegotiatorPython-native CUHKAgent (ANAC 2012 Winner).
CUHKAgent won ANAC 2012. It uses a sophisticated time-dependent strategy with combined acceptance conditions. The agent is particularly good at handling domains with discount factors.
- Uses:
Offering: GTimeDependentOffering (e=0.15, more conservative)
Acceptance: GACCombi (combined acceptance conditions)
Model: GHardHeadedFrequencyModel (frequency-based opponent modeling)
References
Hao, J.; Leung, H. (2012). “CUHKAgent: A Strategy for Bilateral Multi-issue Negotiation”. ANAC 2012.
- class negmas.genius.GAgentLG(e: float = 0.25, **kwargs)[source]
Bases:
BOANegotiatorPython-native AgentLG (ANAC 2012).
AgentLG was a notable agent in ANAC 2012. It uses a time-dependent strategy with AC_CombiMax acceptance which considers both the opponent’s best offer and the time remaining.
- Uses:
Offering: GTimeDependentOffering (e=0.25)
Acceptance: GACCombiMax (maximum-based combined acceptance)
Model: GHardHeadedFrequencyModel (frequency-based opponent modeling)
References
ANAC 2012 AgentLG.
- class negmas.genius.GAgentX(e: float = 0.3, t: float = 0.98, **kwargs)[source]
Bases:
BOANegotiatorPython-native AgentX (ANAC 2015).
AgentX was a notable agent in ANAC 2015. It uses adaptive time-dependent offering with window-based acceptance and exponential smoothing opponent modeling.
- Uses:
Offering: GTimeDependentOffering (e=0.3, adaptive)
Acceptance: GACCombiMaxInWindow (window-based maximum acceptance)
Model: GAgentXFrequencyModel (exponential smoothing opponent model)
References
ANAC 2015 AgentX.
- class negmas.genius.GRandom(**kwargs)[source]
Bases:
BOANegotiatorPython-native Random negotiator.
A simple agent that makes random offers and accepts any offer. Useful for testing and as a baseline.
- Uses:
Offering: GRandomOffering (random bid selection)
Acceptance: GACTrue (accepts any offer)
Model: None (no opponent modeling)
See Also¶
negmas.gb.components.genius- BOA components used by these negotiatorsnegmas.sao- SAO mechanism for running negotiationsnegotiate CLI - CLI documentation for
negotiatecommand
BOA Components¶
The G-prefixed negotiators are built from modular BOA (Bidding, Opponent modeling, Acceptance)
components available in negmas.gb.components.genius. These can be used to build custom
negotiators or mixed with other components.
Opponent Models¶
Opponent models predict the opponent’s utility function based on their bidding behavior. NegMAS includes both frequency-based and Bayesian opponent models transcompiled from Genius.
Bayesian Models
Model |
Description |
|---|---|
|
Full Bayesian inference with hypothesis maintenance |
|
Scalable Bayesian with online learning (better for large domains) |
Frequency-Based Models
Model |
Description |
|---|---|
|
Tracks unchanged issues between bids (from ANAC 2011 winner) |
|
Simple frequency model (from AgentSmith, ANAC 2010) |
|
Advanced model with exponential smoothing (ANAC 2015) |
|
Frequency model biased toward Nash-optimal outcomes |
Utility Models
Model |
Description |
|---|---|
|
No-op model, returns constant 0.5 utility |
|
Random but consistent utility for each outcome |
|
Assumes opponent has opposite preferences (1 - our_utility) |
Bayesian Opponent Model Usage¶
Example using a Bayesian opponent model with a custom negotiator:
from negmas.gb.negotiators.modular import BOANegotiator
from negmas.gb.components import (
GTimeDependentOffering,
GACTime,
)
from negmas.sao import SAOMechanism
from negmas.preferences import LinearAdditiveUtilityFunction
from negmas.outcomes import make_issue
# Create scenario
issues = [make_issue(10, "price"), make_issue(5, "quantity")]
ufun = LinearAdditiveUtilityFunction.random(issues=issues, reserved_value=0.0)
# Create negotiator with BOA components
negotiator = BOANegotiator(
name="boa_agent",
ufun=ufun,
offering=GTimeDependentOffering(e=0.5),
acceptance=GACTime(t=0.95),
)
The GBayesianModel maintains multiple hypotheses about opponent preferences and
updates their probabilities using Bayes’ rule after each opponent bid. The GScalableBayesianModel
uses online learning for better scalability with large outcome spaces.
Opponent Model Classes¶
- class negmas.gb.components.genius.GBayesianModel(n_hypotheses: int = 10, rationality: float = 5.0, issue_weight_hypotheses: list[dict[int, float]] = NOTHING, hypothesis_probs: list[float] = NOTHING, value_utils: dict[int, dict] = NOTHING, *, negotiator: GBNegotiator | None = None)[source]
Bases:
GeniusOpponentModelBayesian opponent model from Genius.
Uses Bayesian inference to update beliefs about opponent’s utility function based on their bids. Maintains probability distributions over possible opponent preferences and updates them using Bayes’ rule.
This is a simplified version that assumes the opponent is rational and only offers bids above some threshold.
- Parameters:
n_hypotheses – Number of hypotheses to consider (default 10).
rationality – Assumed opponent rationality - higher values assume opponent is more likely to make utility-maximizing bids (default 5.0).
Transcompiled from: negotiator.boaframework.opponentmodel.BayesianModel
- eval(offer: Outcome | None) Value[source]
Evaluate opponent utility as weighted average over hypotheses.
- Parameters:
offer – The outcome to evaluate.
- Returns:
Estimated opponent utility (0 to 1).
- eval_normalized(offer: Outcome | None, above_reserve: bool = True, expected_limits: bool = True) Value[source]
Return normalized utility.
- on_partner_proposal(state: GBState, partner_id: str, offer: Outcome) None[source]
Update hypothesis probabilities using Bayes’ rule.
- on_preferences_changed(changes: list[PreferencesChange]) None[source]
Reset the model when preferences change.
- class negmas.gb.components.genius.GScalableBayesianModel(learning_rate: float = 0.1, issue_weights: dict[int, float] = NOTHING, value_utils: dict[int, dict] = NOTHING, *, negotiator: GBNegotiator | None = None)[source]
Bases:
GeniusOpponentModelScalable Bayesian opponent model from Genius.
A Bayesian model optimized for large outcome spaces. Uses a more efficient representation that scales better with domain size.
Instead of maintaining full hypothesis distributions, it tracks sufficient statistics and uses approximate inference.
- Parameters:
learning_rate – Rate of belief updates (default 0.1).
Transcompiled from: negotiator.boaframework.opponentmodel.ScalableBayesianModel
- eval(offer: Outcome | None) Value[source]
Evaluate opponent utility.
- Parameters:
offer – The outcome to evaluate.
- Returns:
Estimated opponent utility (0 to 1).
- eval_normalized(offer: Outcome | None, above_reserve: bool = True, expected_limits: bool = True) Value[source]
Return normalized utility.
- on_partner_proposal(state: GBState, partner_id: str, offer: Outcome) None[source]
Update beliefs using online learning.
- on_preferences_changed(changes: list[PreferencesChange]) None[source]
Reset the model when preferences change.
- class negmas.gb.components.genius.GHardHeadedFrequencyModel(learning_coef: float = 0.2, learning_value_addition: int = 1, default_value: int = 1, issue_weights: dict[int, float] = NOTHING, value_weights: dict[int, dict] = NOTHING, *, negotiator: GBNegotiator | None = None)[source]
Bases:
GeniusOpponentModelHard-Headed Frequency-based opponent model from Genius.
This model estimates the opponent’s utility function by tracking which issues remain unchanged between consecutive opponent bids. Issues that don’t change are assumed to be more important to the opponent.
The model works by: 1. Tracking bid frequencies for each issue value 2. When an issue value stays the same between consecutive bids,
increasing its weight (the opponent likely cares about that issue)
Computing opponent utility as a weighted sum of issue value frequencies
- Parameters:
learning_coef – Learning coefficient controlling how fast weights adapt. Higher values mean faster adaptation (default 0.2).
learning_value_addition – Value added to unchanged issue weights (default 1).
default_value – Default value for unseen issue values (default 1).
Transcompiled from: negotiator.boaframework.opponentmodel.HardHeadedFrequencyModel
- eval(offer: Outcome | None) Value[source]
Evaluate the estimated opponent utility for an outcome.
- Parameters:
offer – The outcome to evaluate.
- Returns:
Estimated opponent utility (0 to 1).
- eval_normalized(offer: Outcome | None, above_reserve: bool = True, expected_limits: bool = True) Value[source]
Evaluate normalized opponent utility.
- Parameters:
offer – The outcome to evaluate.
above_reserve – Whether to normalize above reserve value.
expected_limits – Whether to use expected limits.
- Returns:
Normalized opponent utility (0 to 1).
- on_partner_proposal(state: GBState, partner_id: str, offer: Outcome) None[source]
Update the model based on the opponent’s offer.
- Parameters:
state – Current negotiation state.
partner_id – ID of the partner who made the offer.
offer – The opponent’s offer.
- on_preferences_changed(changes: list[PreferencesChange]) None[source]
Reset the model when preferences change.
- Parameters:
changes – List of preference changes.
- class negmas.gb.components.genius.GSmithFrequencyModel(default_value: int = 1, value_counts: dict[int, dict] = NOTHING, *, negotiator: GBNegotiator | None = None)[source]
Bases:
GeniusOpponentModelSmith frequency-based opponent model from Genius.
From AgentSmith (ANAC 2010). Similar to HardHeadedFrequencyModel but with a simpler weight update mechanism based purely on value frequencies.
The model tracks how often each value appears in opponent bids and assumes higher frequency = higher importance.
- Parameters:
default_value – Default value for unseen issue values (default 1).
Transcompiled from: negotiator.boaframework.opponentmodel.SmithFrequencyModel
- eval(offer: Outcome | None) Value[source]
Evaluate opponent utility based on value frequencies.
- Parameters:
offer – The outcome to evaluate.
- Returns:
Estimated opponent utility (0 to 1).
- eval_normalized(offer: Outcome | None, above_reserve: bool = True, expected_limits: bool = True) Value[source]
Return normalized utility.
- on_partner_proposal(state: GBState, partner_id: str, offer: Outcome) None[source]
Update value frequencies based on opponent’s offer.
- on_preferences_changed(changes: list[PreferencesChange]) None[source]
Reset the model when preferences change.
- class negmas.gb.components.genius.GAgentXFrequencyModel(learning_rate: float = 0.25, default_value: int = 1, issue_weights: dict[int, float] = NOTHING, value_counts: dict[int, dict] = NOTHING, *, negotiator: GBNegotiator | None = None)[source]
Bases:
GeniusOpponentModelAgentX frequency-based opponent model from Genius.
From AgentX (ANAC 2015). An advanced frequency model that uses both value frequencies and issue weight learning based on bid patterns.
Tracks issue weights by observing which issues change less frequently, and uses exponential smoothing for weight updates.
- Parameters:
learning_rate – Learning rate for weight updates (default 0.25).
default_value – Default value for unseen issue values (default 1).
Transcompiled from: negotiator.boaframework.opponentmodel.AgentXFrequencyModel
- eval(offer: Outcome | None) Value[source]
Evaluate opponent utility.
- Parameters:
offer – The outcome to evaluate.
- Returns:
Estimated opponent utility (0 to 1).
- eval_normalized(offer: Outcome | None, above_reserve: bool = True, expected_limits: bool = True) Value[source]
Return normalized utility.
- on_partner_proposal(state: GBState, partner_id: str, offer: Outcome) None[source]
Update model based on opponent’s offer.
- on_preferences_changed(changes: list[PreferencesChange]) None[source]
Reset the model when preferences change.