# Exemple resolu : Comparaison ABT vs AWC sur coloration aleatoire
def _random_coloring_problem(n_agents: int, domain_size: int, density: float, rng: random.Random):
"""Retourne (edges, constraint_func, domain)."""
edges = [(i, j) for i in range(n_agents) for j in range(i + 1, n_agents)
if rng.random() < density]
edge_set = {(min(a, b), max(a, b)) for a, b in edges}
def constraint(v1, val1, v2, val2):
if (min(v1, v2), max(v1, v2)) in edge_set:
return val1 != val2
return True
return edges, constraint, list(range(domain_size))
def _run(agent_cls, n_agents, edges, constraint_func, domain, max_iter=2000):
agents = {}
for i in range(n_agents):
neighbors = [other for e in edges for other in e if i in e and other != i]
agents[i] = agent_cls(i, list(domain), constraint_func, neighbors)
system = ABTSystem(agents)
solution = system.run(max_iterations=max_iter)
return {
'solved': solution is not None,
'messages': system.total_messages,
'nogoods': system.total_nogoods,
}
def compare_abt_awc(n_agents=6, domain_size=3, densities=(0.3, 0.5, 0.7), runs=5, seed=42):
"""Compare ABT et AWC sur plusieurs densites."""
rng = random.Random(seed)
summary = []
for d in densities:
abt_stats = {'solved': 0, 'messages': [], 'nogoods': []}
awc_stats = {'solved': 0, 'messages': [], 'nogoods': []}
for _ in range(runs):
edges, cons, dom = _random_coloring_problem(n_agents, domain_size, d, rng)
r_abt = _run(ABTAgent, n_agents, edges, cons, dom)
r_awc = _run(AWCAgent, n_agents, edges, cons, dom)
for stats, r in ((abt_stats, r_abt), (awc_stats, r_awc)):
stats['solved'] += int(r['solved'])
stats['messages'].append(r['messages'])
stats['nogoods'].append(r['nogoods'])
summary.append({
'density': d,
'abt_success': abt_stats['solved'] / runs,
'awc_success': awc_stats['solved'] / runs,
'abt_msgs': np.mean(abt_stats['messages']),
'awc_msgs': np.mean(awc_stats['messages']),
'abt_nogoods': np.mean(abt_stats['nogoods']),
'awc_nogoods': np.mean(awc_stats['nogoods']),
})
return summary
results = compare_abt_awc()
header = f"{'density':>8} {'abt_suc':>8} {'awc_suc':>8} {'abt_msgs':>9} {'awc_msgs':>9} {'abt_ng':>8} {'awc_ng':>8}"
print(header)
print("-" * len(header))
for r in results:
print(f"{r['density']:>8.2f} {r['abt_success']:>8.0%} {r['awc_success']:>8.0%} "
f"{r['abt_msgs']:>9.1f} {r['awc_msgs']:>9.1f} "
f"{r['abt_nogoods']:>8.1f} {r['awc_nogoods']:>8.1f}")