from simpleai.search import CspProblem, backtrack
variables = ["mastil", "i1", "i2", "fr"]
valoresFrente = [
"Nuevo taladro de muestras",
"Láser para experimentos",
"Microscopio remoto",
"Espacio extra para muestras",
]
valoresMastil = [
"Nuevo taladro de muestras",
"Nueva cámara panorámica",
"Láser para experimentos",
"Antena con mejor alcance"
]
valoresI = [
"Batería nuclear extra",
"Nuevo sistema de navegación",
"Espacio extra para muestras",
"Antena con mejor alcance"
]
pesos = {
"Nuevo taladro de muestras": [15],
"Nueva cámara panorámica": [3],
"Batería nuclear extra": [10],
"Láser para experimentos": [5],
"Microscopio remoto": [3],
"Nuevo sistema de navegación": [8],
"Espacio extra para muestras": [5],
"Antena con mejor alcance": [7],
}
dominios = {
"mastil": valoresMastil,
"i1": valoresI,
"i2": valoresI,
"fr": valoresFrente,
}
# Tus restricciones corregidas
def todos_distintos(vars, vals):
if len(set(vals)) < 4:
return False
return True
def no_250(vars, vals):
pesoT = 0
for val in vals:
pesoT += pesos[val][0]
if pesoT > 25:
return False
return True
def antena_vs_bateria(vars, vals):
bateria = False
antena = False
for val in vals:
if val == "Batería nuclear extra":
bateria = True
if val == "Antena con mejor alcance":
antena = True
if bateria and antena:
return False
return True
def laser_y_bateria(vars, vals):
laser = False
bateria = False
for val in vals:
if val == "Láser para experimentos":
laser = True
if val == "Batería nuclear extra":
bateria = True
if laser and not bateria:
return False
return True
def ciencia(vars, vals):
for val in vals:
if val in ["Nuevo taladro de muestras", "Láser para experimentos", "Espacio extra para muestras", "Microscopio remoto"]:
return True
return False
def taladro_vs_microscopio(vars, vals):
tiene_taladro = False
tiene_microscopio = False
for val in vals:
if val == "Nuevo taladro de muestras":
tiene_taladro = True
if val == "Microscopio remoto":
tiene_microscopio = True
if tiene_taladro and tiene_microscopio:
return False
return True
restricciones = [
(variables, todos_distintos),
(variables, no_250),
(variables, antena_vs_bateria),
(variables, laser_y_bateria),
(variables, ciencia),
(variables, taladro_vs_microscopio),
]
problema = CspProblem(variables, dominios, restricciones)
solucion = backtrack(problema)
print("\n=== SOLUCIÓN ENCONTRADA ===")
if solucion:
for slot, mejora in solucion.items():
print(f"{slot}: {mejora}")
else:
print("No se encontró una solución válida.")