Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Curso 20052006
Universidad de Sevilla
IA-I 20052006
Cc Ia
5.1
Un problema de satisfacci on de restricciones (PSR) viene denido por los siguientes elementos:
u u
Un conjunto nito de variables X1 , . . . , Xn Un conjunto nito de dominios Di asociados a cada variable Xi , especicando los posibles valores que puede tomar Un conjunto nito de restricciones C1, . . . , Cm, que denen una serie de propiedades que deben vericar los valores asignados a las variables
Una soluci on al problema es una asignaci on de valores a las variables {X1 = v1, . . . , Xn = vn} tal que vi Di y se verican las restricciones Esta formulaci on permite una representaci on simple del problema, y el uso de heur sticas de prop osito general, independientes del problema
IA-I 20052006
Cc Ia
5.2
IA-I 20052006
Cc Ia
5.3
Ejemplo: N reinas
x
Situar N reinas en un tablero de ajedrez de tama no N N de forma que no se den jaque m utuamente. Variables: V1, . . . , VN Dominios: Di = {1, . . . , N } Restricciones:
u u
R R
V1 = 1, V2 = 3
IA-I 20052006
Cc Ia
5.4
SE HU GR AL MA
CA
Cadiz ,
Sevilla,
Cordoba,
M alaga,
J aen,
Dominios: {rojo, azul, verde} Restricciones: P = Q, para cada par de provincias vecinas P y Q Problema con dominios nitos y restricciones binarias (de obligaci on).
Cc Ia
Problemas de satisfacci on de restricciones 5.5
IA-I 20052006
Dado un conjunto de variables proposicionales L = {p1 , . . . , pn } y un conjunto de cl asusulas proposicionales {C1 , . . . , Cm} formadas con los s mbolos de L, determinar si existe una asignaci on de valores de verdad a los simbolos de L de manera que se satisfagan todan las cl ausulas
Variables: {p1, . . . , pn} Dominios: {T , F } (booleanos) Restricciones: {C1, . . . , Cm} Problema con dominios nitos y restricciones binarias (de obligaci on). Problema NP-completo
u
Por tanto, en el peor caso, no es posible resolver PSRs con dominios nitos en tiempo polinomial (si P = N P ).
Cc Ia
Problemas de satisfacci on de restricciones 5.6
IA-I 20052006
Asignar valores distintos del 1 al 8 a cada letra para que la ecuaci on indicada sea cierta: Variables: I, D, E, A, M, N, T, C1, C2, C3 Dominios: {1, . . . , 8} para I, D, E, A, M, N, T y {0, 1} para C1, C2, C3 Restricciones:
u u u u
Primera suma: 2 A = (10 C3) + E Segunda suma: (2 E ) + C3 = (10 C2) + T Tercera suma: (2 D ) + C2 = (10 C1) + N Cuarta suma: (2 I ) + C1 = (10 M ) + E
(C1 C2 C3)
I D E A + I D E A M E N T E
IA-I 20052006
Cc Ia
5.7
Asignar tareas a empleados de acuerdo con su capacidad para desarrollarlas: Variables: Ei Dominios: Di = {T1, . . . , Tn} Restricciones:
u x
Obtener la mejor
n i=1 Ci
IA-I 20052006
Cc Ia
5.8
Encontrar la manera de situar patrones de corte en una pieza de cart on. Variables: P1, P2, P3, P4 Dominios: Coordenadas en el plano. Restricciones:
u
IA-I 20052006
Cc Ia
5.9
Todo problema con restricciones m ultiples se puede reducir a uno equivalente con restricciones binarias Representaci on en forma de grafo de un PSR:
SE=CO
CO
CO=JA
JA
JA=GR
HU=SE
SE
SE=MA CA=SE CO=MA
CO=GR
HU
HU=CA
MA
CA=MA
MA=GR
GR
GR=AL
AL
CA
IA-I 20052006
CcIa
5.10
La variable global *variables* contiene a todas las variables del PSR Restricciones: estructura con los nombres de las variables involucradas + funci on
u
IA-I 20052006
CcIa
5.11
Estados:
u
Asignaciones parciales (y consistentes con las restricciones) de valores a variables: {Xi1 = vi1 , . . . , Xik = vik } Estado inicial: {} Estados nales: asignaciones completas
u u
Operadores:
u u
Asignar un valor (de su dominio) a una variable no asignada en el estado Aplicabilidad: la asignaci on resultante tiene que ser consistente
Puesto que las soluciones est an a una profundidad ja (igual al n umero de variables), profundidad es preferible a anchura
IA-I 20052006
CcIa
5.12
Simplicaciones en la b usqueda
x
El orden en el que se aplican los operadores es irrelevante para la soluci on nal (conmutatividad)
u
Por tanto, los operadores puden reducirse a considerar las posibles asignaciones a una u nica variable no asignada
El camino no es importante
u u
No necesitamos la estructura de nodo No necesitamos una representaci on expl cita para los operadores
IA-I 20052006
CcIa
5.13
Estados: representados como listas de asociaci on Funci on que elige la nueva variable a asignar (de entre las no asignadas):
u
SELECCIONA-VARIABLE(ESTADO)
ORDENA-VALORES(DOMINIO)
IA-I 20052006
CcIa
5.14
IA-I 20052006
CcIa
5.15
8 reinas:
> > > > > (load "psr-alg-comun.lsp") (load "psr-busqueda-en-profundidad") (load "psr-n-reinas") (n-reinas 8) (psr-busqueda-en-profundidad) ((8 . 4) (7 . 2) (6 . 7) (5 . 3) (4 . 6) (3 . 8) (2 . 5) (1 . 1))
IA-I 20052006
CcIa
5.16
Algoritmo de backtracking
x
FUNCION PSR-BACKTRACKING() Devolver PSR-BACKTRACKING-REC({}) FUNCION PSR-BACKTRACKING-REC(ESTADO) 1. Si ESTADO es una asignaci on completa, devolver ESTADO y terminar 2. Hacer VARIABLE igual a SELECCIONA-VARIABLE(ESTADO) Hacer DOMINIO-ORD igual ORDENA-VALORES(PSR-VAR-DOMINIO(ESTADO)) 3. Para cada VALOR en DOMINIO-ORD, 3.1 Hacer NUEVO-ESTADO igual a la asignaci on obtenida ampliando ESTADO con VARIABLE=VALOR 3.2 Si NUEVO-ESTADO es consistente con *RESTRICCIONES*, hacer: 3.2.1 RESULTADO igual PSR-BACKTRCKING-REC(NUEVO-ESTADO) 3.2.2 Si RESULTADO no es FALLO, devolver RESULTADO y terminar 3. Devolver FALLO
IA-I 20052006
CcIa
5.17
Sin embargo, es posible dotar al algoritmo de cierta heur stica que mejora considerablemente su rendimiento
u
Estas heur sticas son de prop osito general Independientes del problema Sacan partido de la estructura especial de los PSR
u x
Selecci on de nueva variable a asignar Orden de asignaci on de valores a la variable elegida Propagaci on de informaci on a trav es de las restricciones Vuelta atr as inteligente en caso de fallo
CcIa
Problemas de satisfacci on de restricciones 5.18
IA-I 20052006
Con la asignaci on (parcial) {Huelva=Rojo, Sevilla=Azul, Malaga=Rojo}, la siguiente variable a asignar ser a Cadiz o Cordoba (en ambos casos s olo hay un valor en sus dominios consistente con la asignaci on)
x
Considerar antes los que eliminen menos posibles valores de las variables por asignar
CcIa
Problemas de satisfacci on de restricciones 5.19
IA-I 20052006
Para cada estado, mantener cierta informaci on sobre los posibles valores para las variables que quedan por asignar:
u
Cada vez que se asigna un nuevo valor a una variable, quitar del dominio de las variables por asignar, aquellos valores que no sean consistentes con el nuevo valor asignado
En este momento, MA no tiene ning un valor posible. Por tanto, no es necesario seguir explorando en el arbol.
u
Se ha detectado inconsistencia sin necesidad de asignar valores a Huelva y Jaen, y para cualquier extensi on de la asignaci on parcial construida hasta el momento
CcIa
Problemas de satisfacci on de restricciones 5.20
IA-I 20052006
Ejemplo: N-reinas
x
R R R R
R R
R R R R
R R R R R
R R R R
IA-I 20052006
CcIa
5.21
Propagaci on de restricciones
x
Cada nodo del arbol debe contener el estado junto la lista de valores posibles en las variables por asignar Muy f acil de usar en conjunci on con la heur stica MRV
Propagar las implicaciones de las restricciones sobre una variable sobre otras variables existen t ecnicas m as completas para propagar restricciones que la comprobaci on hacia adelante la propagaci on debe ser r apida: completitud vs rapidez
La consistencia de arcos proporciona un m etodo con un buen compromiso entre eciencia y completitud
CcIa
Problemas de satisfacci on de restricciones 5.22
IA-I 20052006
Consistencia de arcos
x
Equivalentemente, un arco es una restricci on en la que hay una variable distinguida Notaci on: B > E , CO = SE , |Vi Vj | = |i j |
u x
Para cualquier valor del dominio asociado a la variable distinguida del arco, existen valores en los dominios de las restantes variables que satisfacen la restricci on del arco Ejemplo: si SE y CO tienen ambas asignadas como dominio {rojo, verde}, el arco CO = SE es consistente Ejemplo: si SE tiene como dominio {rojo} y CO tiene como dominio {rojo, verde}, el arco CO = SE no es consistente En este u ltimo caso, el arco puede hacerse consistente eliminando rojo del dominio de CO
CcIa
Problemas de satisfacci on de restricciones 5.23
IA-I 20052006
Objetivo:
u
a partir de los dominios iniciales de las variables devolver un conjunto de dominios actualizado tal que todos los arcos del problema sean consistentes Si un arco es inconsistente, podemos hacerlo consistente eliminando del dominio de la variable distinguida aquellos valores para los que no existen valores en los dominios de las restantes variables que satisfagan la restricci on
Actualizaci on de dominios:
u
Revisi on de arcos:
u
si el dominio de una variable se actualiza, es necesario revisar la consistencia de los arcos en los que aparece la variable como variable no distinguida
Criterio de parada:
u
Todos los arcos son consistentes respecto a los dominios de las variables O alg un dominio queda vac o (inconsistencia)
CcIa
Problemas de satisfacci on de restricciones 5.24
IA-I 20052006
Planicaci on de las acciones de un robot (Poole, pag. 149): Un robot necesita planicar cinco actividades (A, B, C, D y E), donde cada actividad ha de comenzar en un momento en el tiempo (1, 2, 3, o 4) y dura exactamente una u nidad de tiempo. Restricciones:
u
La actividad B no puede realizarse en el momento n umero 3. La actividad C no puede realizarse en el momento n umero 2. Las actividades A y B no pueden realizarse simult aneamente. Las actividades B y C no pueden realizarse simult aneamente. La actividad C ha de realizarse antes de la D. Las actividades B y D no pueden realizarse simult aneamente. Las actividades A y D han de realizarse simult aneamente. La actividad E ha de ser la u ltima.
CcIa
Problemas de satisfacci on de restricciones 5.25
IA-I 20052006
A=D
B=D B=C
1 2 3 4 E<D E
C C<D E<C 1 2 3 4
1 3 4
E<A
E<B
IA-I 20052006
CcIa
5.26
IA-I 20052006
CcIa
5.27
IA-I 20052006
CcIa
5.28
IA-I 20052006
CcIa
5.29
Algoritmo AC-3
u u
Entrada: una lista de variables+dominios Salida: la lista de entrada, con los dominios actualizados (destructivamente) de manera que todos los arcos del PSR son consistentes
FUNCION AC-3(VARIABLES) 1. Hacer RED igual a ARCOS() 2. Mientras RED no sea vac o 2.1 Hacer ACTUAL el primero de RED y RED el resto de RED 2.2 Hacer VARIABLE igual a ARCO-VARIABLE(ARCO) y RESTRICCION igual ARCO-RESTRICCION(ARCO) 2.3 Hacer VIEJO-DOMINIO igual al dominio de VARIABLE en VARIABLES 2.4 Hacer NUEVO-DOMINIO igual a ACTUALIZA-DOMINIO(VARIABLE,RESTRICCION,VARIABLES) 2.5 Si NUEVO-DOMINIO y VIEJO-DOMINIO son distintos, entonces 2.5.1 Actualizar el dominio de VARIABLE en VARIABLES con NUEVO-DOMINIO 2.5.2 Incluir en RED todos los arcos de ARCOS() en los que aparezca VARIABLE y esta NO sea la variable distinguida del arco 2.6 Devolver VARIABLES
IA-I 20052006
CcIa
5.30
Propiedades de AC-3
x
n: n umero de variables d: m aximo n umero de valores de un dominio Complejidad en tiempo: O (n2d3 ) (polinomial)
Dos aproximaciones:
u
Incorporar en el algoritmo de backtracking, como un paso de propagaci on de restricciones despu es de cada asignaci on Intercalar AC-3 con b usqueda
IA-I 20052006
CcIa
5.31
Existe un dominio vac o: no hay soluci on. Todos los dominios son unitarios: hay una soluci on. No hay dominios vac os y al menos uno no es unitario: soluciones?.
Idea: romper un dominio no vac o en subdominios y aplicar AC-3 a los estados resultantes
u
Esto se puede hacer de manera sistem atica (b usqueda) Hasta que se detecta inconsistencia en todas las alternativas (no hay soluci on) Hasta que se obtiene un estado con todos los dominios unitarios (soluci on)
IA-I 20052006
CcIa
5.32
Sucesores: escoger un dominio no unitario y dividirlo de alguna manera Gesti on de la cola de abiertos: anchura o profundidad
CcIa
Problemas de satisfacci on de restricciones 5.33
IA-I 20052006
Consistencia de arcos
x
> (load "psr-alg-comun.lsp") T > (load "psr-n-reinas.lsp") T > (load "psr-alg-arcos.lsp") T > (n-reinas 10) *RESTRICCIONES* > (time (busqueda-ac3)) Real time: 7.330538 sec. Run time: 7.06 sec. Space: 5204128 Bytes GC: 10, GC time: 0.17 sec. (#S(VARIABLE-PSR :NOMBRE 1 :DOMINIO (1)) #S(VARIABLE-PSR :NOMBRE 2 :DOMINIO (3)) #S(VARIABLE-PSR :NOMBRE 3 :DOMINIO (6)) #S(VARIABLE-PSR :NOMBRE 4 :DOMINIO (8)) #S(VARIABLE-PSR :NOMBRE 5 :DOMINIO (10)) #S(VARIABLE-PSR :NOMBRE 6 :DOMINIO (5)) #S(VARIABLE-PSR :NOMBRE 7 :DOMINIO (9)) #S(VARIABLE-PSR :NOMBRE 8 :DOMINIO (2)) #S(VARIABLE-PSR :NOMBRE 9 :DOMINIO (4)) #S(VARIABLE-PSR :NOMBRE 10 :DOMINIO (7)) )
IA-I 20052006
CcIa
5.34
Estados: asignaciones completas (consistentes o inconsistentes) Estado inicial escogido aleatoriamente Estados nales: soluciones al PSR Generaci on de sucesor: elegir una variable y cambiar el valor que tiene asignado (usando cierta heur stica y aleatoriedad)
Variable elegida: aquella (distinta de la u ltima modicada) que participa en m as restricciones NO satisfechas en el estado (los empates se deshacen aleatoriamente) Valor elegido: aquel valor (distinto del que ten a) que produce el menor n umero de restricciones incumplidas (los empates se deshacen aleatoriamente)
IA-I 20052006
CcIa
5.35
IA-I 20052006
CcIa
5.36
> (load "psr-alg-comun.lsp") T > (load "psr-n-reinas.lsp") T > (load "psr-alg-minc.lsp") T > (n-reinas 10) *RESTRICCIONES* > (time (reparacion-heuristica-minc :iteraciones 20)) Real time: 2.155908 sec. Run time: 2.15 sec. Space: 2758404 Bytes GC: 6, GC time: 0.07 sec. (12 (#S(VARIABLE-PSR :NOMBRE 1 :DOMINIO (6)) #S(VARIABLE-PSR :NOMBRE 2 :DOMINIO (8)) #S(VARIABLE-PSR :NOMBRE 3 :DOMINIO (1)) #S(VARIABLE-PSR :NOMBRE 4 :DOMINIO (4)) #S(VARIABLE-PSR :NOMBRE 5 :DOMINIO (7)) #S(VARIABLE-PSR :NOMBRE 6 :DOMINIO (10)) #S(VARIABLE-PSR :NOMBRE 7 :DOMINIO (2)) #S(VARIABLE-PSR :NOMBRE 8 :DOMINIO (9)) #S(VARIABLE-PSR :NOMBRE 9 :DOMINIO (5)) #S(VARIABLE-PSR :NOMBRE 10 :DOMINIO (3)) ) )
IA-I 20052006
CcIa
5.37
IA-I 20052006
CcIa
5.38
Ejemplo: N-reinas
N 4 8 12 backtracking arcos min-conictos (media sobre 10 pruebas) tiempo espacio tiempo espacio tiempo espacio 0.04 84064 0.06 73968 0.08 97019 6.18 9967912 3.17 2792464 2.27 2953025 51.16 75282044 22.71 16295860 16.96 20217256
Reparaci on heur stica tiene muy buenos resultados en algunos tipos de PSRs:
u
PSRs cuyas soluciones est an distribuidas uniformemente a lo largo del espacio de estados PSRs en los que las restricciones pueden cambiar din amicamente
IA-I 20052006
CcIa
5.39
Bibliograf a
x
Nilsson, N.J. Inteligencia articial (Una nueva s ntesis) (McGraw Hill, 2000)
u
Poole, D.; Mackworth, A. y Goebel, R. Computational Intelligence (A Logical Approach) (Oxford University Press, 1998)
u
Russell, S. y Norvig, P. Articial Intelligence (A Modern Approach) (PrenticeHall, 2000). Second Edition
u
IA-I 20052006
CcIa
5.40
Inteligencia Artificial I
Curso 20052006
Universidad de Sevilla
IA-I 20052006
CcIa
5.41
Representaci on de PSRs
x
IA-I 20052006
CcIa
5.42
CcIa
5.43
Huelva :dominio *colores*) Sevilla :dominio *colores*) Cadiz :dominio *colores*) Malaga :dominio *colores*) Cordoba :dominio *colores*) Jaen :dominio *colores*) Granada :dominio *colores*) Almeria :dominio *colores*)))
IA-I 20052006
CcIa
5.44
(eq x y)))) (eq x y)))) (eq x y)))) (eq x y)))) (eq x y)))) (eq x y)))) (eq x y)))) (eq x y)))) (eq x y)))) (eq x y)))) (eq x y))))))
Problemas de satisfacci on de restricciones 5.45
CcIa
Estados nales:
Sucesores:
IA-I 20052006
CcIa
5.46
(defun asignada (variable estado) (assoc variable estado)) (defun primera-variable-no-asignada (estado) (find-if-not #(lambda (x) (asignada (psr-var-nombre x) estado)) *variables*)) (defun asigna-nueva-variable (estado) (let* ((variable (primera-variable-no-asignada estado)) (nombre (psr-var-nombre variable)) (dominio (psr-var-dominio variable))) (loop for val in dominio collect (acons nombre val estado))))
IA-I 20052006
CcIa
5.47
(defun elimina-inconsistentes-nueva-asignacion (estados) (loop for estado in estados when (verifica-restricciones-posibles estado) collect estado)) (defun verifica-restricciones-posibles (estado) (loop for restriccion in *restricciones* always (let* ((variables (psr-restr-variables restriccion)) (a1 (assoc (first variables) estado)) (a2 (assoc (second variables) estado))) (or (not (member (caar estado) variables)) (not a1) (not a2) (funcall (psr-restr-funcion restriccion) (cdr a1) (cdr a2))))))
IA-I 20052006
CcIa
5.48
B usqueda en profundidad:
(defun psr-busqueda-en-profundidad () (let ((abiertos (list nil))) (loop until (null abiertos) do (setf actual (first abiertos)) (setf abiertos (rest abiertos)) (cond ((es-asignacion-completa actual) (return actual)) (t (setf nuevos-sucesores (bpr-sucesores actual)) (setf abiertos (append nuevos-sucesores abiertos)))))))
IA-I 20052006
CcIa
5.49
Backtracking recursivo:
(defun psr-backtracking () (psr-backtracking-rec ())) (defun psr-backtracking-rec (estado) (if (es-asignacion-completa estado) estado (let* ((variable (selecciona-variable estado)) (nombre (psr-var-nombre variable)) (dominio (ordena-valores-del-dominio (psr-var-dominio variable)))) (loop for val in dominio do (let ((nuevo-estado (acons nombre val estado))) (when (verifica-restricciones-posibles nuevo-estado) (let ((resultado (psr-backtracking-rec nuevo-estado))) (when resultado (return resultado)))))))))
IA-I 20052006
CcIa
5.50
Consistencia de arcos
x
(defun arcos () (loop for restriccion in *restricciones* append (loop for var in (psr-restr-variables restriccion) collect (crea-arco :variable var :restriccion restriccion))))
IA-I 20052006
CcIa
5.51
IA-I 20052006
CcIa
5.52
(defun nuevos-arcos (variable-mod red) (let ((var-mod (psr-var-nombre variable-mod)) (arcos (arcos))) (loop for arco in arcos when (and (not (equal var-mod (arco-variable arco))) (not (member arco red :test #equalp)) (member var-mod (psr-restr-variables (arco-restriccion arco)))) collect arco)))
IA-I 20052006
CcIa
5.53
(defun actualiza-dominio (variable-mod variables restriccion) (let ((nombre1 (first (psr-restr-variables restriccion))) (nombre2 (second (psr-restr-variables restriccion))) (funcion (psr-restr-funcion restriccion))) (cond ((equal (psr-var-nombre variable-mod) nombre1) (loop for val1 in (psr-var-dominio variable-mod) when (test-de-existencia-1 val1 (variable-nombre nombre2 variables) funcion) collect val1)) (t (loop for val2 in (psr-var-dominio variable-mod) when (test-de-existencia-2 val2 (variable-nombre nombre1 variables) funcion) collect val2)))))
CcIa
IA-I 20052006
5.54
Tests de existencia:
(defun test-de-existencia-1 (val1 var2 funcion) (loop for val2 in (psr-var-dominio var2) thereis (funcall funcion val1 val2))) (defun test-de-existencia-2 (val2 var1 funcion) (loop for val1 in (psr-var-dominio var1) thereis (funcall funcion val1 val2)))
IA-I 20052006
CcIa
5.55
(defun busqueda-ac3 () (let ((abiertos (list (copia-lista-variables-psr *variables*))) (actual nil)) (loop until (null abiertos) do (setf actual (ac3 (first abiertos))) (setf abiertos (rest abiertos)) (cond ((hay-dominio-vacio actual) nil) ((dominios-unitarios actual) (return actual)) (t (setf abiertos (append (cda-sucesores actual) abiertos)))))))
IA-I 20052006
CcIa
5.56
(defun hay-dominio-vacio (variables) (loop for var in variables thereis (dominio-vacio var)))
x
Generaci on de sucesores:
(defun cda-sucesores (estado) (let* ((seleccion (selecciona-dominio estado)) (inicio (first seleccion)) (variable (second seleccion)) (final (third seleccion)) (nuevos-dominios (rompe-dominio variable))) (loop for var in nuevos-dominios collect (append (copia-lista-variables-psr inicio) (list var) (copia-lista-variables-psr final)))))
IA-I 20052006
CcIa
5.57
Seleccionar una variable con dominio no unitario: (V1 . . . Vi . . . Vn) = ((V1 . . . Vi1) Vi (Vi+1 . . . Vn))
(defun selecciona-dominio (variables) (let ((indice (position-if-not #dominio-unitario variables))) (list (subseq variables 0 indice) (nth indice variables) (subseq variables (+ indice 1)))))
x
(defun rompe-dominio (variable) (list (crea-variable :nombre (psr-var-nombre variable) :dominio (list (first (psr-var-dominio variable)))) (crea-variable :nombre (psr-var-nombre variable) :dominio (rest (psr-var-dominio variable)))))
IA-I 20052006
CcIa
5.58
Nodo:
Funci on principal:
(defun reparacion-heuristica-minc (&key (iteraciones 100)) (let ((actual (crea-nodo-inicial))) (loop for i from 1 to iteraciones do (if (= (numero-conflictos (minc-estado actual)) 0) (return (list i (minc-estado actual))) (setf actual (nodo-menos-conflictivo (rhc-sucesores actual)))))))
IA-I 20052006
CcIa
5.59
(defun crea-nodo-inicial () (crea-nodo-minc :estado (loop for var in *variables* collect (crea-variable :nombre (psr-var-nombre var) :dominio (list (first (psr-var-dominio var))))) :ultima-modificada nil))
IA-I 20052006
CcIa
5.60
(defun numero-conflictos (estado) (loop for restriccion in *restricciones* count (not (comprueba-restriccion restriccion estado))))
x
(defun comprueba-restriccion (restriccion variables) (let* ((nombres (psr-restr-variables restriccion)) (val1 (first (dominio-nombre (first nombres) variables))) (val2 (first (dominio-nombre (second nombres) variables)))) (funcall (psr-restr-funcion restriccion) val1 val2)))
IA-I 20052006
CcIa
5.61
(defun rhc-sucesores (nodo-minc) (let* ((seleccion (selecciona-conflictiva nodo-minc)) (inicio (first seleccion)) (variable (second seleccion)) (final (third seleccion)) (nombre (psr-var-nombre variable)) (valor (first (psr-var-dominio variable))) (dominio (dominio-nombre nombre *variables*))) (loop for n-val in dominio when (not (equal n-val valor)) collect (crea-nodo-minc :estado (append (copia-lista-variables-psr inicio) (list (crea-variable :nombre nombre :dominio (list n-val))) (copia-lista-variables-psr final)) :ultima-modificada nombre))))
IA-I 20052006
CcIa
5.62
Selecci on aleatoria de una variable conictiva: (V1 . . . Vi . . . Vn) = ((V1 . . . Vi1) Vi (Vi+1 . . . Vn))
(defun selecciona-conflictiva (nodo-minc) (let* ((variables (minc-estado nodo-minc)) (ultima-mod (minc-ultima-modificada nodo-minc)) (indice (indice-con-maximos-conflictos variables ultima-mod))) (list (subseq variables 0 indice) (nth indice variables) (subseq variables (+ indice 1)))))
IA-I 20052006
CcIa
5.63
(defun indice-con-maximos-conflictos (variables ultima) (let ((maximo 0) (lista-maximos nil)) (loop for i from 0 to (- (length variables) 1) when (not (equal (psr-var-nombre (nth i variables)) ultima)) do (let ((nuevo-valor (numero-conflictos-variable variables (nth i variables)))) (cond ((> nuevo-valor maximo) (setf maximo nuevo-valor lista-maximos (list i))) ((= nuevo-valor maximo) (push i lista-maximos))))) (nth (random (length lista-maximos)) lista-maximos)))
IA-I 20052006
CcIa
5.64
(defun numero-conflictos-variable (variables var) (loop for restriccion in *restricciones* when (member (psr-var-nombre var) (psr-restr-variables restriccion) :test #equal) count (not (comprueba-restriccion restriccion variables))))
IA-I 20052006
CcIa
5.65
(defun nodo-menos-conflictivo (lista-nodos-minc) (let* ((nodo-minimo (first lista-nodos-minc)) (resto (rest lista-nodos-minc)) (val-minimo (numero-conflictos (minc-estado nodo-minimo)))) (loop for nodo in resto do (let ((nuevo-val (numero-conflictos (minc-estado nodo)))) (when (< nuevo-val val-minimo) (setf val-minimo nuevo-val) (setf nodo-minimo nodo)))) nodo-minimo))
IA-I 20052006
CcIa
5.66