jueves, 8 de noviembre de 2018

PROBLEMAS MATEMÁTICOS


Movimientos posibles de una reina en un tablero de 4×4.
Chess zhor 26.png
Chess zver 26.pnga8 __b8 __c8 __d8 qle8 __f8 __g8 __h8 __Chess zver 26.png
a7 __b7 __c7 __d7 __e7 __f7 __g7 qlh7 __
a6 __b6 __c6 qld6 __e6 __f6 __g6 __h6 __
a5 __b5 __c5 __d5 __e5 __f5 __g5 __h5 ql
a4 __b4 qlc4 __d4 __e4 __f4 __g4 __h4 __
a3 __b3 __c3 __d3 __e3 qlf3 __g3 __h3 __
a2 qlb2 __c2 __d2 __e2 __f2 __g2 __h2 __
a1 __b1 __c1 __d1 __e1 __f1 qlg1 __h1 __
Chess zhor 26.png
Una posible solución entre las 92 posibles soluciones en un tablero de 8×8.
El problema de las ocho reinas es un pasatiempo que consiste en poner ocho reinas en el tablero de ajedrez sin que se amenacen. Fue propuesto por el ajedrecista alemán Max Bezzel en 1848[cita requerida]. En el juego del ajedrez la reina amenaza a aquellas piezas que se encuentren en su misma fila, columna o diagonal. El juego de las 8 reinas consiste en poner sobre un tablero de ajedrez ocho reinas sin que estas se amenacen entre ellas. Para resolver este problema emplearemos un esquema vuelta atrás(o).























Historia[editar]

El problema fue originalmente propuesto en 1848 por el ajedrecista Max Bezzel. Durante años, muchos matemáticos, incluyendo a Gauss y a Georg Cantor, han trabajado en él y lo han generalizado a n-reinas. Las primeras soluciones fueron ofrecidas por Franz Nauck en 1850. Nauck también se abocó a las n-reinas (en un tablero de nxn de tamaño arbitrario). En 1874, S. Günther propuso un método para hallar las soluciones usando determinantes, y J.W.L. Glaisher redefinió su aproximación.
Edsger Dijkstra usó este problema en 1972 para ilustrar el poder de la llamada programación estructurada. Publicó una descripción muy detallada del desarrollo del algoritmo de backtracking, "depth-first".
Este acertijo apareció en el popular juego de computadora de los '90 llamado "The 7th Guest".

Planteamiento del Problema[editar]

Como cada reina puede amenazar a todas las reinas que estén en la misma fila, cada una ha de situarse en una fila diferente. Podemos representar las 8 reinas mediante un vector[1-8], teniendo en cuenta que cada índice del vector representa una fila y el valor una columna. Así cada reina estaría en la posición (i, v[i]) para i = 1-8.
Ejemplo de dos reinas amenazadas en el tablero de 4 por 4.
El vector  significa que la reina 1 esta en la fila 3, columna 1; la reina 2 en la fila 1, columna 2; la reina 3 en la fila 6, columna 3; la reina 4 en la fila 2, columna 4; etc... Como se puede apreciar esta solución es incorrecta ya que la reina 3 y la 6 estarían en la misma fila. Por tanto el vector correspondería a una permutación de los ocho primeros números enteros.
El problema de las filas y columnas lo tenemos resuelto, pero ¿qué ocurre con las diagonales? Para las posiciones sobre una misma diagonal descendente, se cumple que tienen el mismo valor ; mientras que para las posiciones en la misma diagonal ascendente, se cumple que tienen el mismo valor . Así, si tenemos dos reinas colocadas en posiciones  y  entonces están en la misma diagonal si y solo si cumple:
 o 
 o 
Teniendo en cuenta todas estas consideraciones, podemos aplicar el esquema retroactivamente para colocar las ocho reinas de una manera realmente eficiente. Para ello, reformulamos el problema como problema de búsqueda en un árbol. Decimos que en un vector  de enteros entre 1 y 8 es -prometedor, para , si ninguna de las  reinas colocadas en las posiciones  amenaza a ninguna de las otras. Las soluciones a nuestro problema se corresponden con aquellos vectores que son 8-prometedores.

Establecimiento del algoritmo[editar]

Sea  el conjunto de vectores de -prometedores, , sea  el grafo dirigido tal que  si y solo si existe un entero , con  tal que
  •  es -prometedor
  •  es -prometedor
  •  para todo 
Este grafo es un árbol. Su raíz es el vector vacío correspondiente a . sus hojas son o bien soluciones (), o posiciones sin salida (). Las soluciones del problema de las ocho reinas se pueden obtener explorando este árbol. Sin embargo, no generamos explícitamente el árbol para explorarlo después. Los nodos se van generando y abandonando en el transcurso de la exploración mediante un recorrido en profundidad.
Esquema reducido del árbol de soluciones.
Hay que decidir si un vector es -prometedor, sabiendo que es una extensión de un vector -prometedor. Únicamente necesitamos comprobar la última reina que haya que añadir. Esto se puede acelerar si asociamos a cada nodo prometedor el conjunto de columnas, el de diagonales positivas (a 45 grados) y el de diagonales negativas (a 135 grados) controladas por las reinas que ya están puestas.

Descripción del algoritmo[editar]

A continuación se muestra el algoritmo que soluciona nuestro problema, en el cual  es un vector global. Para imprimir todas las soluciones, la llamada inicial es .
procedimiento 
// es -prometedor//
////
////
////
si  entonces //un vector -prometedor es una solución//
escribir 
si no //explorar las extensiones -prometedoras de sol//
para  hasta  hacer
si  y  y  entonces
// es -prometedor//
El algoritmo comprueba primero si , si esto es cierto resulta que tenemos ante nosotros un vector 8-prometedor, lo cual indica que cumple todas las restricciones originando una solución. Si  es distinto de 8, el algoritmo explora las extensiones -prometedoras, para ello realiza un bucle, el cual va de 1 a 8, debido al número de reinas. En este bucle se comprueba si entran en jaque las reinas colocadas en el tablero. Si no entran en jaque, se realiza una recurrencia en la cual incrementamos  (buscamos -prometedor) y añadimos la nueva fila, columna y diagonales al conjunto de restricciones. Al realizar la recurrencia hemos añadido al vector sol una nueva reina, que no entra en jaque con ninguna de las anteriores. Además, hemos incrementado el conjunto de restricciones añadiendo una nueva fila, columna y diagonales (una positiva y otra negativa) prohibidas.

Implementación[editar]

A continuación se muestra una posible implementación del anterior algoritmo en C++.
#include 
#include 
#include 
#include 
#include 
#define NREINAS 8 // dimensiones del tablero y número de reinas
using namespace std;
vector<int> sol;
int nro_sol=1;


inline bool contiene(const vector<int>& v, const int val)
{
    return find(v.begin(), v.end(), val) != v.end();
}

void reinas(int k, vector<int> col, vector<int> diag45, vector<int> diag135)
{
    if( k == NREINAS )
    {
	printf("%3d:", nro_sol++);
        for(int j=0; j<NREINAS; j++)
	    cout << " (" << j+1 << "," << sol[j] << ")";
        cout << endl;
    }
    else
    {
        for(int j=1; j<=NREINAS; j++)
            if( !contiene(col, j) && !contiene(diag45, j-k) && !contiene(diag135, j+k) )
            {
                sol[k] = j;

                col.push_back(j);
                diag45.push_back(j-k);
                diag135.push_back(j+k);

                reinas(k+1,col, diag45, diag135);

                col.pop_back();
                diag45.pop_back();
                diag135.pop_back();
            }
    }
}

int main() {
    cout << "SOLUCIONES AL PROBLEMA DE LAS " << NREINAS << " REINAS"<<endl;
    sol.resize(NREINAS);
    reinas(0, vector<int>(), vector<int>(), vector<int>());

    return 0;
}

El problema de las n reinas[editar]

El problema de las ocho reinas se puede plantear de modo general como problema de las  reinas. El problema consistiría en colocar  reinas en un tablero de ajedrez de  de tal manera que ninguna de las reinas quede atacando a otras.
Su análisis y solución es isomorfo al de las ocho reinas.

Número de soluciones[editar]

n:1234567891011121314
distintas:10012161246923411,7879.23345.752
todas las soluciones:100210440923527242.68014.20073.712365.596

Soluciones al problema de las ocho reinas[editar]

El problema de las ocho reinas tiene 92 soluciones, de las cuales 12 son esencialmente distintas, es decir las 92 soluciones existentes se pueden obtener a partir de traslaciones, simetrías y rotaciones de las 12 soluciones únicas, que se muestran a continuación:
Chess zhor 26.png
Chess zver 26.pnga8 __b8 __c8 __d8 qle8 __f8 __g8 __h8 __Chess zver 26.png
a7 __b7 __c7 __d7 __e7 __f7 __g7 qlh7 __
a6 __b6 __c6 qld6 __e6 __f6 __g6 __h6 __
a5 __b5 __c5 __d5 __e5 __f5 __g5 __h5 ql
a4 __b4 qlc4 __d4 __e4 __f4 __g4 __h4 __
a3 __b3 __c3 __d3 __e3 qlf3 __g3 __h3 __
a2 qlb2 __c2 __d2 __e2 __f2 __g2 __h2 __
a1 __b1 __c1 __d1 __e1 __f1 qlg1 __h1 __
Chess zhor 26.png
Solución única 1
Chess zhor 26.png
Chess zver 26.pnga8 __b8 __c8 __d8 __e8 qlf8 __g8 __h8 __Chess zver 26.png
a7 __b7 qlc7 __d7 __e7 __f7 __g7 __h7 __
a6 __b6 __c6 __d6 qle6 __f6 __g6 __h6 __
a5 __b5 __c5 __d5 __e5 __f5 __g5 qlh5 __
a4 __b4 __c4 qld4 __e4 __f4 __g4 __h4 __
a3 __b3 __c3 __d3 __e3 __f3 __g3 __h3 ql
a2 __b2 __c2 __d2 __e2 __f2 qlg2 __h2 __
a1 qlb1 __c1 __d1 __e1 __f1 __g1 __h1 __
Chess zhor 26.png
Solución única 2
Chess zhor 26.png
Chess zver 26.pnga8 __b8 __c8 __d8 qle8 __f8 __g8 __h8 __Chess zver 26.png
a7 __b7 qlc7 __d7 __e7 __f7 __g7 __h7 __
a6 __b6 __c6 __d6 __e6 __f6 __g6 qlh6 __
a5 __b5 __c5 qld5 __e5 __f5 __g5 __h5 __
a4 __b4 __c4 __d4 __e4 __f4 qlg4 __h4 __
a3 __b3 __c3 __d3 __e3 __f3 __g3 __h3 ql
a2 __b2 __c2 __d2 __e2 qlf2 __g2 __h2 __
a1 qlb1 __c1 __d1 __e1 __f1 __g1 __h1 __
Chess zhor 26.png
Solución única 3
Chess zhor 26.png
Chess zver 26.pnga8 __b8 __c8 __d8 qle8 __f8 __g8 __h8 __Chess zver 26.png
a7 __b7 __c7 __d7 __e7 __f7 qlg7 __h7 __
a6 __b6 __c6 __d6 __e6 __f6 __g6 __h6 ql
a5 __b5 __c5 qld5 __e5 __f5 __g5 __h5 __
a4 qlb4 __c4 __d4 __e4 __f4 __g4 __h4 __
a3 __b3 __c3 __d3 __e3 __f3 __g3 qlh3 __
a2 __b2 __c2 __d2 __e2 qlf2 __g2 __h2 __
a1 __b1 qlc1 __d1 __e1 __f1 __g1 __h1 __
Chess zhor 26.png
Solución única 4
Chess zhor 26.png
Chess zver 26.pnga8 __b8 __c8 qld8 __e8 __f8 __g8 __h8 __Chess zver 26.png
a7 __b7 __c7 __d7 __e7 __f7 qlg7 __h7 __
a6 __b6 __c6 __d6 __e6 __f6 __g6 __h6 ql
a5 qlb5 __c5 __d5 __e5 __f5 __g5 __h5 __
a4 __b4 __c4 __d4 qle4 __f4 __g4 __h4 __
a3 __b3 __c3 __d3 __e3 __f3 __g3 qlh3 __
a2 __b2 __c2 __d2 __e2 qlf2 __g2 __h2 __
a1 __b1 qlc1 __d1 __e1 __f1 __g1 __h1 __
Chess zhor 26.png
Solución única 5
Chess zhor 26.png
Chess zver 26.pnga8 __b8 __c8 __d8 __e8 qlf8 __g8 __h8 __Chess zver 26.png
a7 __b7 __c7 qld7 __e7 __f7 __g7 __h7 __
a6 __b6 __c6 __d6 __e6 __f6 __g6 __h6 ql
a5 __b5 __c5 __d5 qle5 __f5 __g5 __h5 __
a4 __b4 __c4 __d4 __e4 __f4 __g4 qlh4 __
a3 qlb3 __c3 __d3 __e3 __f3 __g3 __h3 __
a2 __b2 __c2 __d2 __e2 __f2 qlg2 __h2 __
a1 __b1 qlc1 __d1 __e1 __f1 __g1 __h1 __
Chess zhor 26.png
Solución única 6
Chess zhor 26.png
Chess zver 26.pnga8 __b8 __c8 __d8 __e8 qlf8 __g8 __h8 __Chess zver 26.png
a7 __b7 __c7 __d7 __e7 __f7 __g7 qlh7 __
a6 __b6 __c6 __d6 qle6 __f6 __g6 __h6 __
a5 qlb5 __c5 __d5 __e5 __f5 __g5 __h5 __
a4 __b4 __c4 qld4 __e4 __f4 __g4 __h4 __
a3 __b3 __c3 __d3 __e3 __f3 __g3 __h3 ql
a2 __b2 __c2 __d2 __e2 __f2 qlg2 __h2 __
a1 __b1 qlc1 __d1 __e1 __f1 __g1 __h1 __
Chess zhor 26.png
Solución única 7
Chess zhor 26.png
Chess zver 26.pnga8 __b8 __c8 __d8 qle8 __f8 __g8 __h8 __Chess zver 26.png
a7 qlb7 __c7 __d7 __e7 __f7 __g7 __h7 __
a6 __b6 __c6 __d6 __e6 qlf6 __g6 __h6 __
a5 __b5 __c5 __d5 __e5 __f5 __g5 __h5 ql
a4 __b4 __c4 __d4 __e4 __f4 qlg4 __h4 __
a3 __b3 __c3 qld3 __e3 __f3 __g3 __h3 __
a2 __b2 __c2 __d2 __e2 __f2 __g2 qlh2 __
a1 __b1 qlc1 __d1 __e1 __f1 __g1 __h1 __
Chess zhor 26.png
Solución única 8
Chess zhor 26.png
Chess zver 26.pnga8 __b8 __c8 qld8 __e8 __f8 __g8 __h8 __Chess zver 26.png
a7 __b7 __c7 __d7 __e7 __f7 qlg7 __h7 __
a6 __b6 __c6 __d6 qle6 __f6 __g6 __h6 __
a5 qlb5 __c5 __d5 __e5 __f5 __g5 __h5 __
a4 __b4 __c4 __d4 __e4 __f4 __g4 __h4 ql
a3 __b3 __c3 __d3 __e3 qlf3 __g3 __h3 __
a2 __b2 __c2 __d2 __e2 __f2 __g2 qlh2 __
a1 __b1 qlc1 __d1 __e1 __f1 __g1 __h1 __
Chess zhor 26.png
Solución única 9
Chess zhor 26.png
Chess zver 26.pnga8 __b8 __c8 __d8 __e8 __f8 qlg8 __h8 __Chess zver 26.png
a7 __b7 qlc7 __d7 __e7 __f7 __g7 __h7 __
a6 __b6 __c6 __d6 __e6 __f6 __g6 qlh6 __
a5 qlb5 __c5 __d5 __e5 __f5 __g5 __h5 __
a4 __b4 __c4 __d4 qle4 __f4 __g4 __h4 __
a3 __b3 __c3 __d3 __e3 __f3 __g3 __h3 ql
a2 __b2 __c2 __d2 __e2 qlf2 __g2 __h2 __
a1 __b1 __c1 qld1 __e1 __f1 __g1 __h1 __
Chess zhor 26.png
Solución única 10
Chess zhor 26.png
Chess zver 26.pnga8 __b8 __c8 __d8 qle8 __f8 __g8 __h8 __Chess zver 26.png
a7 __b7 __c7 __d7 __e7 __f7 __g7 qlh7 __
a6 qlb6 __c6 __d6 __e6 __f6 __g6 __h6 __
a5 __b5 __c5 __d5 __e5 __f5 __g5 __h5 ql
a4 __b4 __c4 __d4 __e4 qlf4 __g4 __h4 __
a3 __b3 qlc3 __d3 __e3 __f3 __g3 __h3 __
a2 __b2 __c2 __d2 __e2 __f2 qlg2 __h2 __
a1 __b1 __c1 qld1 __e1 __f1 __g1 __h1 __
Chess zhor 26.png
Solución única 11
Chess zhor 26.png
Chess zver 26.pnga8 __b8 __c8 __d8 __e8 __f8 qlg8 __h8 __Chess zver 26.png
a7 __b7 __c7 __d7 qle7 __f7 __g7 __h7 __
a6 __b6 __c6 __d6 __e6 __f6 __g6 qlh6 __
a5 qlb5 __c5 __d5 __e5 __f5 __g5 __h5 __
a4 __b4 __c4 __d4 __e4 __f4 __g4 __h4 ql
a3 __b3 qlc3 __d3 __e3 __f3 __g3 __h3 __
a2 __b2 __c2 __d2 __e2 qlf2 __g2 __h2 __
a1 __b1 __c1 qld1 __e1 __f1 __g1 __h1 __
Chess zhor 26.png
Solución única 12
Existen muchas soluciones computacionales al problema de las 8 reinas, las más populares están en lenguaje C/C++ y la mayoría hace uso de las llamadas recursivas, pero en general es posible conseguir soluciones en otros lenguejes como Perl, Java, JavaScript, en Visual Basic NET y muchos otros más, lo que demuestra la alta popularidad que tiene este problema dentro del mundo de la programación de computadoras.







No hay comentarios:

Publicar un comentario