// Exemple resolu : Comparaison ABT vs AWC sur plusieurs densites
var rngCmp = new Random(42);
int nCmp = 6;
int domainSizeCmp = 3;
var densitiesCmp = new[] { 0.3, 0.5, 0.7 };
int runsCmp = 5;
List<(int, int)> GenerateEdges(double density, Random rng)
{
var edges = new List<(int, int)>();
for (int i = 0; i < nCmp; i++)
for (int j = i + 1; j < nCmp; j++)
if (rng.NextDouble() < density) edges.Add((i, j));
return edges;
}
Func<int, object, int, object, bool> MakeColoringCons(List<(int, int)> edges)
{
var edgeSet = edges.Select(e => (Math.Min(e.Item1, e.Item2), Math.Max(e.Item1, e.Item2))).ToHashSet();
return (v1, val1, v2, val2) =>
{
var edge = (Math.Min(v1, v2), Math.Max(v1, v2));
if (edgeSet.Contains(edge)) return !val1.Equals(val2);
return true;
};
}
Dictionary<string, object> RunAgent(Func<int, List<object>, Func<int, object, int, object, bool>, List<int>, ABTAgent> agentCtor,
List<(int, int)> edges,
List<object> domain)
{
var agents = new Dictionary<int, ABTAgent>();
for (int i = 0; i < nCmp; i++)
{
var nbrs = edges.Where(e => e.Item1 == i || e.Item2 == i)
.Select(e => e.Item1 == i ? e.Item2 : e.Item1).Distinct().ToList();
agents[i] = agentCtor(i, domain.ToList(), MakeColoringCons(edges), nbrs);
}
var sys = new ABTSystem(agents);
// Pour AWCAgent : on doit injecter la reference system pour les promotions.
// Detect via reflection sur la propriete "System" (specificque a AWCAgent).
foreach (var ag in agents.Values) sys.RegisterAwcAgent(ag);
var sol = sys.Run(maxIterations: 2000);
return new Dictionary<string, object>
{
["solved"] = sol != null,
["messages"] = sys.TotalMessages,
["nogoods"] = sys.TotalNogoods
};
}
Console.WriteLine($"{"density":>8} {"abt_suc":>8} {"awc_suc":>8} {"abt_msgs":>9} {"awc_msgs":>9} {"abt_ng":>8} {"awc_ng":>8}");
Console.WriteLine(new string('-', 60));
foreach (var d in densitiesCmp)
{
int abtSolved = 0, awcSolved = 0;
long abtMsgs = 0, awcMsgs = 0, abtNg = 0, awcNg = 0;
for (int r = 0; r < runsCmp; r++)
{
var edges = GenerateEdges(d, rngCmp);
var domain = Enumerable.Range(0, domainSizeCmp).Cast<object>().ToList();
var rAbt = RunAgent((id, dom, cf, nbrs) => new ABTAgent(id, dom, cf, nbrs), edges, domain);
var rAwc = RunAgent((id, dom, cf, nbrs) => new AWCAgent(id, dom, cf, nbrs), edges, domain);
if ((bool)rAbt["solved"]) abtSolved++;
if ((bool)rAwc["solved"]) awcSolved++;
abtMsgs += (int)rAbt["messages"]; awcMsgs += (int)rAwc["messages"];
abtNg += (int)rAbt["nogoods"]; awcNg += (int)rAwc["nogoods"];
}
Console.WriteLine($"{d,8:F2} {abtSolved/(double)runsCmp,8:P0} {awcSolved/(double)runsCmp,8:P0} "
+ $"{abtMsgs/(double)runsCmp,9:F1} {awcMsgs/(double)runsCmp,9:F1} "
+ $"{abtNg/(double)runsCmp,8:F1} {awcNg/(double)runsCmp,8:F1}");
}