# Demonstration Table : compatibilite de composants
# Trois composants (CPU, RAM, Carte mere) avec des combinaisons compatibles
if HAS_ORTOOLS:
model = cp_model.CpModel()
# Variables : choix de composant (indices)
# CPU : 0=Intel_i5, 1=Intel_i7, 2=AMD_Ryzen5, 3=AMD_Ryzen7
# RAM : 0=DDR4_16GB, 1=DDR4_32GB, 2=DDR5_16GB, 3=DDR5_32GB
# MB : 0=ASUS_Intel, 1=MSI_Intel, 2=ASUS_AMD, 3=MSI_AMD
cpu = model.new_int_var(0, 3, "cpu")
ram = model.new_int_var(0, 3, "ram")
mb = model.new_int_var(0, 3, "mb")
cpu_names = ["Intel i5", "Intel i7", "AMD Ryzen 5", "AMD Ryzen 7"]
ram_names = ["DDR4 16GB", "DDR4 32GB", "DDR5 16GB", "DDR5 32GB"]
mb_names = ["ASUS Intel", "MSI Intel", "ASUS AMD", "MSI AMD"]
# Tuples autorises : (cpu, ram, mb)
# Regle : CPU Intel -> carte mere Intel, CPU AMD -> carte mere AMD
# Regle : Intel i7 et AMD Ryzen 7 supportent DDR5, les autres DDR4 seulement
allowed = [
(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), # i5 + DDR4 + Intel MB
(1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1), # i7 + DDR4 + Intel MB
(1, 2, 0), (1, 2, 1), (1, 3, 0), (1, 3, 1), # i7 + DDR5 + Intel MB
(2, 0, 2), (2, 0, 3), (2, 1, 2), (2, 1, 3), # Ryzen5 + DDR4 + AMD MB
(3, 0, 2), (3, 0, 3), (3, 1, 2), (3, 1, 3), # Ryzen7 + DDR4 + AMD MB
(3, 2, 2), (3, 2, 3), (3, 3, 2), (3, 3, 3), # Ryzen7 + DDR5 + AMD MB
]
model.add_allowed_assignments([cpu, ram, mb], allowed)
# Enumerer toutes les configurations valides
solver = cp_model.CpSolver()
class SolutionCounter(cp_model.CpSolverSolutionCallback):
def __init__(self, variables):
cp_model.CpSolverSolutionCallback.__init__(self)
self._variables = variables
self._solutions = []
def on_solution_callback(self):
self._solutions.append(tuple(self.value(v) for v in self._variables))
callback = SolutionCounter([cpu, ram, mb])
solver.parameters.enumerate_all_solutions = True
status = solver.solve(model, callback)
print("Compatibilite de composants PC (contrainte Table)")
print("=" * 55)
print(f"Espace total sans contraintes : {4 * 4 * 4} = 64 combinaisons")
print(f"Combinaisons compatibles : {len(callback._solutions)}")
print(f"Reduction : {100 - len(callback._solutions)/64*100:.0f}%")
print()
print(f"{'CPU':<15} {'RAM':<12} {'Carte mere':<12}")
print("-" * 40)
for c, r, m in sorted(callback._solutions):
print(f"{cpu_names[c]:<15} {ram_names[r]:<12} {mb_names[m]:<12}")
else:
print("OR-Tools requis pour cette cellule.")