Ver Mensaje Individual
  #63 (permalink)  
Antiguo 22/12/2013, 12:15
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 7 meses
Puntos: 320
Respuesta: Propuesta para desafíos javascript 2014

al problema de la inteligencia dejo mi propuesta.
funca bien y ademas, propone diferentes caminos para lograr el objetivo cambiando un unico parametro.

Código Javascript:
Ver original
  1. TRON.prototype.ia=function()
  2. {
  3.     // Aumentar este valor hace mas inteligente a la ia pero recarga la pila de recursion pudiendo explotar y/o ser leeeeeeento.
  4.     // Una gran mejora seria que en lugar de ser fijo, aumentara a medida que disminuyen los espacios libres, esto la haria mas versatil.
  5.     // Notese que cambiando este numero se obtienen diferentes soluciones de dominacion total.
  6.     // Ej: 3, 4.
  7.     // Con un valor menor a 2 no es lo sufientemente inteligente como para encontrar un camino correcto.
  8.     var maximunCall = 3;
  9.    
  10.     // Este valor es un parchesito para no complicar el algoritmo. con que sea mayor o igual a la longitud del mapa es suficiente.
  11.     // Otra gran mejora, seria que en lugar de ser fijo se calculara segun las dimenciones de la matriz.   
  12.     var incrementoAgresivo = 25;
  13.  
  14.     function mejorPosicion(arr, min, pred)
  15.     {
  16.         var max = min;
  17.         var dir = pred;
  18.         for(var i=0; i< arr.length; i++)
  19.         {
  20.             if(arr[i] > max)
  21.             {
  22.                 max = arr[i];
  23.                 dir = i;
  24.             }
  25.         }
  26.  
  27.         return dir;
  28.     }
  29.  
  30.     function recursiveMejorCamino(pos, mapa, movTmp, nroCall)
  31.     {
  32.         nroCall++;
  33.         if((mapa[pos[0]][pos[1]] == 0) && (nroCall < maximunCall))
  34.         {
  35.             movTmp++;
  36.             var movT = new Array();
  37.             movT[0] = recursiveMejorCamino([(pos[0]-1), pos[1]], mapa, movTmp , nroCall) + (((nroCall > 1) && (mapa[(pos[0]-((pos[0]-2) >= 0 ? (pos[0]-2) : 0))][pos[1]] == 2)) ? incrementoAgresivo : 0);                                  // Arriba
  38.             movT[1] = recursiveMejorCamino([(pos[0]+1), pos[1]], mapa, movTmp , nroCall) + (((nroCall > 1) && (mapa[((pos[0]+2) < mapa.length ? (pos[0]+2) : (mapa.length-1))][pos[1]] == 2)) ? incrementoAgresivo : 0);                    // Abajo
  39.             movT[2] = recursiveMejorCamino([pos[0], (pos[1]-1)], mapa, movTmp , nroCall) + (((nroCall > 1) && (mapa[pos[0]][(pos[1]-((pos[1]-2) >= 0 ? (pos[1]-2) : 0))] == 2)) ? incrementoAgresivo : 0);                                  // Izquierda
  40.             movT[3] = recursiveMejorCamino([pos[0], (pos[1]+1)], mapa, movTmp , nroCall) + (((nroCall > 1) && (mapa[pos[0]][((pos[1]+2) < mapa[pos[0]].length ? (pos[1]+2) : (mapa[pos[0]].length-1))] == 2)) ? incrementoAgresivo : 0);    // Derecha
  41.             var dir = mejorPosicion(movT, 0 , 3);
  42.            
  43.             return ((movTmp*1) + (movT[dir]*1));
  44.         } else
  45.             return 0;
  46.     }
  47.  
  48.     var movP = new Array();
  49.     movP[0] = recursiveMejorCamino([(this.jugador[0]-1), this.jugador[1]], this.mapa,   0,  0); // Arriba
  50.     movP[1] = recursiveMejorCamino([(this.jugador[0]+1), this.jugador[1]], this.mapa,   0,  0); // Abajo
  51.     movP[2] = recursiveMejorCamino([this.jugador[0], (this .jugador[1]-1)], this.mapa,  0,  0); // Izquierda
  52.     movP[3] = recursiveMejorCamino([this.jugador[0], (this.jugador[1]+1)], this.mapa,   0,  0); // Derecha
  53.  
  54.     var dir = mejorPosicion(movP,0 , 0);
  55.  
  56.     switch (dir)
  57.     {
  58.         case 0 :
  59.             return DIRECCION.arriba;
  60.         break;
  61.         case 1 :
  62.             return DIRECCION.abajo;
  63.         break;
  64.         case 2 :
  65.             return DIRECCION.izquierda;
  66.         break;
  67.         case 3 :
  68.             return DIRECCION.derecha;
  69.         break;
  70.     }
  71. };

con esto califico para entrar al concurso?
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios