Contexto: estoy tratando de responder esta pregunta acerca de la resolución de la peg solitaire, y ya he publicado como respuesta el código ideado para el tratamiento de la junta
como un gráfico.
El algoritmo en Mathematica para resolver el problema que lleva a cabo (por favor, no me interesa leer el código) es un primer intento aproximación de fuerza bruta que yo quiero matizar.
Una forma para hacer esto es la de anular el cálculo de las ramas ya explorados, y los simétricamente equivalente.
AFAIK, la simetría del problema se representa en el Diedro D4 grupo.
Así que mi problema: tengo un vector con el estado de ocupación de la junta
$S =\{o_1, ...,o_{33}\}$ $(o_i \in \{ True, False \})$
y quiero encontrar una función que, cuando se aplica a la ocupación del estado de vector devuelve el mismo número Real para todos los ocho simétrica de los estados (y por supuesto bijective, devolver un valor diferente para cualquier otra entrada).
Alguna sugerencia?
Editar
Por ejemplo, el siguiente programa en Mathematica calcula un bijective bilineal invariantes bajo D4 para la fácil:
x1
x4 x2
x3
>
bl = Times @@@ Union[Sort /@ Tuples[{x1, x2, x3, x4}, 2]];
coef = Array[a, Length@bl];
(* This is the first nuance, I've to write down the one member
for each symmetry class*)
base = {{1, 0, 0, 0}, {1, 1, 0, 0}, {1, 0, 1, 0},
{1, 1, 1, 0}, {1, 1, 1, 1}, {0, 0, 0, 0}};
f[{x1_, x2_, x3_, x4_}] := Evaluate[coef.bl];
(*This is the second problem: I calculate all members of each
class (in this case by rotations)*)
g[x_] := Table[RotateRight[x, i], {i, 4}];
fi = FindInstance[
Unequal @@ (f /@ base) &&
And @@ Equal @@@ (f /@ g /@ base)
, coef, Integers];
-f[{x1, x2, x3, x4}] /. fi[[1]]
Y el resultado es
$f(x_1,x_2,x_3,x_4) = x_1^2 + x_1 x_2 + x_2^2 + x_2 x_3 + x_3^2 + x_1 x_4 + x_3 x_4 + x_4^2$
valor de f .......... Equivalente tablas
Estoy seguro de que debe haber una mejor manera ...