You are on page 1of 6

Proyecto:SuDominoku

PROYECTO
(JulioDE2016)
CasanovaS.1430032,gachetaS.0938596

{savacano_28@live.com
,sebastian.guacheta@correounivalle}

Algoritmos de Monte Carlo, que siempre


devuelven una solucin aunque esta a
veces no sea correcta. Son tiles cuando
una aproximacin no es suficiente (por
ejemplo, en un problema de decisin).
Cuentanconelinconvenientedenosaber
con exactitud si la respuesta es acertada,
puessloexisteunaciertaprobabilidadde
xito. Cuantas ms veces se ejecute, ms
seguro se estar de la correccin de la
solucin.

RESUMEN: En este documento se expone la


implementacin de un algoritmo para la solucin del
juego Sudominoku. El diseo del algoritmo sigui la
naturalezadelalgoritmoprobabilisticodelasVegas.
PALABRAS CLAVE: Algoritmo de las Vegas, xito,
Falla.

1SOBRE ALGORITMOS PROBABILISTICOS Y SU


APLICACINENJUEGOS

1.1ALGORITMOSPROBABILISTICOS
Los algoritmos probabilsticos o
probabilistas son aquellos que basan el
resultadodevueltoendecisionesaleatorias,
detalformaque,enpromedioseobtienen
unabuenasolucinalproblemaplanteado,
dadaunadistribucindedatosdeentrada.

AlgoritmosdeLasVegas,similaresalosde
Monte Carlo pero que nunca devuelven
unasolucinerrnea,conelinconveniente
de que pueden no terminar o devolver
solucin. Esto garantiza que la respuesta
sea la buena, pero no garantiza que el
algoritmo funcione. Como en los casos
anteriores, cuanto mayor es el tiempo
dedicado al clculo, ms fiable es la
solucin.Nodebeconfundirseestetipode
algoritmos con aquellos deterministas,
como el simplex en programacin lineal,
quesonmuyeficientesparalamayorade
los posibles datos de entrada pero
desastrosos para unos pocos. Ntese que
dichos algoritmos siempre devuelven una
solucincorrecta.

Se pueden distinguir fundamentalmente


cuatrograndescategoras:
Algoritmosnumricos, quedevuelvanuna
aproximacinalresultado,frecuentemente
enformadeintervalo.Sontilescuandola
solucin exacta es demasiado costosa (o
directamente imposible de calcular, como
porejemplo,paranmerosirracionales)y
una aproximacin es lo suficientemente
buena.Considresequesedeseacalcularel
resultado de una complicada integral de
variasdimensiones.Talvezslosenecesite
unaprecisindecuatrodecimales,aunque
lasolucinexactaconstedevariasdecenas
de los mismos. Este tipo de algoritmos
suelen ofrecer resultados ms precisos
cuanto mayor tiempo se dedica a su
clculo.

Algoritmos de Sherwood, los cuales


devuelven siempre una respuesta, la cual
es forzosamenteexacta.Aparecen cuando
unalgoritmodeterministaconocidoesms
rpidoenelcasomedioqueenelpeor.El
uso del azar permite reducir, e incluso
eliminar, la diferencia entre buenos y
malosejemplares.

Proyecto:SuDominoku

1.1SUDOKUYSUDOMINOKU
El Sudoku es un rompecabezas que se
resuelve mediante lgica. La idea bsica
para completar los rompecabezas es
encontrar celdas para las en donde solo
cabe1candidato(nmerosdel1al9).
Larestriccionconsisteenqueslosepuede
usar cada nmero una sola vez en cada
fila, cada columna y cada uno de los
recuadrosde3x3.
Acontinuacinseexponenlastcnicasmas
comunesderesolucin.

disponiblealasiguienteceldadisponible.
Estocontinuarahastaquesedescubriera
unaduplicacin,encuyocaso,elsiguiente
valoralternativosecolocaraenelprimer
campoalterado.Enelcasodequeningn
valor cumpliera la restriccin se
retrocedera hasta la casilla anterior y se
probaranlossiguientesnmeros.
Aunque lejos de la eficiencia
computacional,estemtodoencontrarla
solucinsisepermiteelsuficientetiempo
de computacin. Un programa ms
eficientepodradejarunahuelladevalores
potenciales para las celdas, eliminando
valoresimposibleshastaqueslounvalor
quedase para una celda determinada.
Entoncesserellenaraesaceldayseusara
esainformacinparamseliminacionesy
as, sucesivamente hasta el final. Esto
emulara ms exactamente lo que un
agente humano hara sin el mtodo de
ensayoyerror.

EstrategiasdeResolucin
Tcnicasfciles
La mayor parte de Sudokus se pueden
resolvercondossencillastcnicas:
Tcnica1:Posicinnica
Tcnica2:Candidatosnicos
TcnicasMedias
Otrastcnicasqueinvolucranmasqueuna
obsrevacinsencilla,son:
Tcnica3:LneasdeCandidatos
Tcnica4:Parejasdobles
Tcnica5:Lneasmltiples
TcnicasAvanzadas
Siguiendolaprogresin,setiene:
Tcnica 6: Parejas o Tripletas
Desnudas
Tcnica 7: Parejas o Tripletas
Escondidas
TcnicasdeMaestro
Unavezdominadaslasanteriorestcnicas,
se pueden aplicar tcnicas ms
complicadas.
Tcnica8:XWing
Tcnica9:Swordfish
Tcnica10:ForcingChains
Resolucinporordenador
Para los programadores es relativamente
sencillo construir una bsqueda por el
mtodo de backtracking o "vuelta atrs".
sta asignara, tpicamente, un valor a la
primera celda disponible y entonces
continuar asignando el siguiente valor

Codificarlabsquedaparaimposibilidades
basadas en contingencias e incluso
mltiples contingencias (como sera
requeridoparalosSudokumsdifciles)es
bastantecomplejodeconstruiramano.De
cualquier modo, tales complicaciones son
innecesariassitodoloqueelprogramador
desea hacer es encontrar una solucin
eficientemente.
SudominoKu
El juego tiene la forma de un Sudoku
normal,esdecir,unagrillade99quedebe
serllenadausandosololosdgitosdel1al
9.Enunasolucinexitosa:
Cadafilatienequecontenertodoslosdel
1al9.
Cada columna tiene que contener todos
losdigitosdel1al9.
Cadareginde3x3tienequecontener
todoslosdgitosdel1al9.

Proyecto:SuDominoku

PeroparaunSuDominoku,nueveceldas
soninicializadasconlosnmerosdel1al
9.Estodeja72celdassininicializar.Ellas
son lenadas usando un conjunto de 36
piezasdedomin.Elconjuntoincluyeun
dominparacadaposiblepardenmeros
nicosdesdeel1hastael9(Ejemplo:1+
2,1+3,1+4,1+5,1+6,1+7,1+
8,1+9,2+3,2+4,2+5).

un llamado al metodo de solucin del tablero,


siguiendo la naturaleza del algoritmo Vegas.
El programa fue implementado en c++, y el
pseudocdigo es el siguiente:
---------------------------------/*Metodo que verifica si la tabla ya fue
completada*/
bool isValid(int board[9][9]) {
for (int r = 0; r < 9; r++)
for (int c = 0; c < 9; c++)
if (board[r][c] == 0)//recorre pos por pos
buscando blankspace
return false;

2SUDOMINOKU

2.1 Problema
EL proyecto SudominoKu consiste en
desarrollar un algoritmo que siguiendo la
naturaleza de un algoritmo de las Vegas genere
resultados eficientes, es decir, que los
resultados cuenten con una probabilidad de
xito superior a un valor deseado y el consumo
de recursos sea mnimo.

return true;//si la tabla ya fue completada


}
----------------------------------/*Metodo de completado de la tabla, busca los
elementos para cada posicion y considera la
celda de la que se tiene mas informacion*/

2.2 Diseo e Implementacin


La solucion propuesta inicialmente lee el
fichero de entrada, en donde estan las
posiciones de los 9 nmeros, posterior a esto el
programa calcula para cada una de las
posiciones de la matriz la cantidad de valores
que conoce, ya sea en la fila, en la columna o
en el cuadrado que se encuentra. Luego de esto
se busca la celda de las que mas se conoce
informacin y segpun la informacin de esta se
ubica uno de los valores faltantes en esta, es
decir, si la celda 1,1 esta vaca y se sabe que en
su fila hay un 2 y 3, y en la columna hay un 1 y
4, y en el cuadrante hay un 8 mas, entonces la
celda podra tomar los valores de 5,6,7 y 9,
este valor se pens inicilamente escoger segn
la mayor frecuencia de cada nmero en el
tablero pero se opt por generarlo
aleatoriamente para que el proceso no fuera
100% determinista. Luego de esto se actualiza
el tablero y se hace de nuevo el calculo de la
celda con mayor informacin hasta terminar el
tablero. En caso de empate se escoge la ltima
celda encontrada.

void solve(int board[9][9]) {


bool nia=true;
//while (nia)
for(int t=0;t<3;t++){
print(board);
/*Bucle para determinar que casilla tiene mas
informacion*/
int canUse;
int row, col;
for (int i = 0; i < 9; i++) { //busca en la matriz
whitespace
for (int j = 0; j < 9; j++) {
if (board[i][j] == 0) {
// printf("vacio %d",i);
row = i;
col = j;
canUse = 0;
// fila
for (int c = 0; c < 9; c++) {
if (board[row][c] != 0) {
canUse |= (1 << board[row][c]-1); //pone 1
a los numeros que ya estan
}
}
// columnas

Si dada la situacin de que no se obtenga un


resultado xitoso, el programa hace de nuevo
3

Proyecto:SuDominoku

for (int r = 0; r < 9; r++) {


if (board[r][col] != 0) {
canUse |= (1 << board[r][col]-1);
}
}
// area
for (int r = 3*(row/3); r < 3*(row/3)+3; r++) {
for (int c = 3*(col/3); c < 3*(col/3)+3; c++)

}
}
nia=false;
printf("luego row %d col %d \n",row,col);
}
print(board);

}
----------------------------------int main() {
vector <int> numero;

if (board[r][c] != 0) {
canUse |= (1 << board[r][c]-1);
}
}
}
int cuenta=0;
for (int l = 0; l < 9; l++) {
if ((canUse >> l) & 1) {
cuenta++;
}}
// printf("cuenta %d \n",cuenta);

for(int y=0;y<1;y++){
for (int i = 0; i < 9; i++)
for (int j = 0; j < 9; j++)
board[i][j] = 0; //Crea la matriz
numero=lecturaFichero("input1.txt");
// read in the numbers
for (int i = 0; i < 9; i++) {
int row = numero[i]/9;
int col = numero[i]%9;
board[row][col] = i+1;
}

mInfo[row][col]=cuenta;
mCanUse[row][col]=canUse;
}}}
int maxValor = mInfo[0][0]; //obtengo la
casilla con mas informacion
for (int i = 0; i < 9; i++) {
for(int j=0;j<9;j++)
{
if (mInfo[i][j] > maxValor) {
maxValor = mInfo[i][j];
// printf("maxvalor %d \n",maxValor);
row=i;
col=j; }
}
}
canUse=mCanUse[row][col];
printf(" row %d col %d max
%d\n",row,col,maxValor);
srand (time(NULL));

printf("\nIteracion %d \n", y);


solve(board);
//print(board);
}
return 0;
}
2.3 Anlisis Y Resultados
Luego de realizar 50 pruebas al algoritmo
implementado se encontr una probabilidad de
error del 74%, puesto que se implement un
tiempo de respuesta menor a 5 minutos.
Se encontr que luego de 7 casillas puestas, el
programa se bloqueaba y no generaba una
respuesta xitosa. Este valor fue variante entre
7 y 10. Este comportamiento se atribuy a la
implementacin
realizada,
falta
de
optimizacin de condicionales y de aleatorios.

while (!lugar){
int v= rand() % 8 + 0;
if (((canUse >> v) & 1) == 0) {
lugar=true;
board[row][col] = v+1;
4

Proyecto:SuDominoku

En las figuras 1-5 se pueden observar los


reusltados obtenidos con 5 entradas diferentes.

Figura 5. Resultados obtenidos del archivo de


prueba input4.txt
Figura 1. Resultados obtenidos del archivo de
prueba input.txt

En la tabla 1 se observan los resultados


obtenidos de las 50 pruebas que se hicieron
con los archivos de prueba input.txt,
input(1..4).txt:
Tabla I Resultados Obtenidos

Figura 2. Resultados obtenidos del archivo de


prueba input1.txt

N Prue

N Aciertos /10

Input.txt

10

Input1.txt

Input2.txt

10

Input3.txt

Input4.txt

10

Promedio

37/50 = 74% xito

3. Comparacin con mtodo determinista


Dado que el algoritmo propuesto se basa en la
cantidad de informacin que se tiene en cada
celda y con esta informacin a la vez se
selecciona la celda a completar, el rendimiento
del algoritmo se ve fuertemente afectado
puesto que por cada seleccin se deben hacer
varios for, sumas, y comparaciones, a
diferencia en el mtodo determinista en donde
se llena inicialmente la primera celda que se
encuentra vaca con el primer nmero que se
encuentre en la lista de nmeros que faltan.
Sumado a lo anterior, en el mtodo
determinista se obtuvo un 100% de acierto
mientras que con el mtodo propuesto se tuvo

Figura 3. Resultados obtenidos del archivo de


prueba input2.txt

Figura 4. Resultados obtenidos del archivo de


prueba input3.txt

Proyecto:SuDominoku

un 74%, lo que implica que se debe buscar una


mejor propuesta.
2.4 Consideraciones de Mejora
Se podrian introducir mas valores aleatorios de
tal forma que la busqueda por conocimiento de
la matriz se redujera. Se podria considerar un
valor medio de conocimiento y al encontrar el
primer elemento con este valor, se escogera.
Esto disminuiria el nmero de calculos
mejorando el tiempo de respuesta, y dado que
Vegas permite la iteracin hasta el xito, se
podra buscar un valor que cumpliera con una
probabilidad de xito deseada.
3BIBLIOGRAFA

(Julio202016)
[1]http://dis.um.es/~domingo/apuntes/A
lgProPar/0607/AlgoritmosProbabilistas.
pdf
[2]Guia de Proyecto Simulacin
Computacional, Universidad del Valle,
2016

You might also like