elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Indicar que una acción no debe usarse.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Indicar que una acción no debe usarse.  (Leído 208 veces)
Tachikomaia


Conectado Conectado

Mensajes: 1.507


Hackentifiko!


Ver Perfil
Indicar que una acción no debe usarse.
« en: 20 Enero 2025, 04:16 am »

Intento hacer una IA que aprenda a poner una X en un tablero y luego otra en la derecha o izquierda.

El problema que intento resolver en cuanto a eso, es que puede poner una X donde ya hay, debo evitarlo.

Sé que debo poner algo como:
Código:
if (Situacion[Action] == "v") {
   // Es realizable, realizarla...
sino
   // No, ver si hay otra...
Pero no sé bien qué pasa, es como que si hago eso tendría que poner código igual en distintos lados (aunque a ese código lo convierta en una función, siento que es innecesario que se repita), innecesariamente.

Aún no tengo el código completo. Díganme cómo pondrían uds ese if, dónde, o cómo harían.

Código
  1. // 2 en línea horizontal, en tablero de 2x2, sólo X:
  2. //
  3. // Uso arrays porque es más fácil así modificar los nombres...
  4. // de variables:
  5. //
  6. // Los casilleros están numerados así:
  7. // 0 1
  8. // 2 3
  9. // Situación inicial (v es casillero vacío):
  10. SituacionBase = ["v", "v", "v", "v"];
  11. // Ponerla en la lista de situaciones a experimentar:
  12. SaE1 = SituacionBase.slice();
  13. // Situaciones a experimentar (cuántas son):
  14. SaE = 1;
  15. NroDeSExperimentandose = 1;
  16. NombreDeSE = "S"+(SaE1.join(""));
  17. // Acción a realizarse (casillero a marcar):
  18. Action = 0;
  19. function BuscarAccionesGanadoras () {
  20. PlantearSyActuar();
  21. // ¿Ganó?
  22. // Para averiguarlo, calcular fila (contando desde 0):
  23. Fila = Math.floor(Action/2);
  24. // trace(" Fila: "+Fila);
  25. if (Situacion[Fila*2] == Situacion[Fila*2+1]) {
  26. // trace("Situacion[Fila*2] == Situacion[Fila*2+1]: "+Situacion[Fila*2]+" == "+Situacion[Fila*2+1]);
  27. // Sí, crear datos sobre eso:
  28. // En la situación base conviene la acción realizada:
  29. set (NombreDeSE+"BestAction", Action);
  30. // En esa situación se requiere 1 acción para ganar:
  31. set (NombreDeSE+"DistanciaaGanar", 1);
  32. trace("Ganó, ahora se sabe que en la situación "+SituacionBase+" se gana usando la acción "+Action);
  33. // ¿Aún hay situaciones a experimentar?
  34. if (SaE > NroDeSExperimentandose) {
  35. IniciarExperimentosEnOtraS();
  36. } else {
  37. // Comenzar la etapa 2.
  38. IniciarEtapa2();
  39. }
  40. } else {
  41. EvaluarConocimientoSobreSyEtc();
  42. }
  43. }
  44. function PlantearSyActuar () {
  45. // Plantear situación porque puede modificarse pero...
  46. // podría requerirse su estado original luego:
  47. Situacion = SituacionBase.slice();
  48. trace(" La situación experimentándose es "+Situacion);
  49. // Aplicación de la acción:
  50. Situacion[Action] = "X";
  51. trace(" Se realizó la acción "+Action+"; ahora la situación es "+Situacion);
  52. }
  53. function IniciarExperimentosEnOtraS () {
  54. NroDeSExperimentandose++;
  55. SituacionBase = eval("SaE"+NroDeSExperimentandose);
  56. // trace("SituacionBase: "+SituacionBase);
  57. // Reset de la acción a probar:
  58. Action = 0;
  59. trace("Se inician experimentos en otra situación");
  60. }
  61. function IniciarEtapa2 () {
  62. DistanciaaGanarAceptada = 1;
  63. trace("Se experimentaron todas las situaciones; se reexperimentarán buscando resultados menos óptimos");
  64. trace("Son "+SaE+" situaciones; se acepta que la distancia a la victoria sea "+DistanciaaGanarAceptada);
  65. gotoAndStop (3);
  66. }
  67. function EvaluarConocimientoSobreSyEtc () {
  68. SituacionHechaTexto = Situacion.join("");
  69. NombreDeSituacion = "S"+SituacionHechaTexto;
  70. Resumen = NombreDeSituacion+"BestAction";
  71. if (eval(Resumen) == undefined) {
  72. // No, anotar que debe investigarse:
  73. SaE++;
  74. set ("SaE"+SaE, Situacion.slice());
  75. trace("Esa situación no está anotada; se anota como nro "+SaE);
  76. // Esto para saber que está anotada:
  77. set (Resumen, "Desconocida");
  78. }
  79. // ¿Queda alguna acción sin probar?
  80. if (Action < 3) {
  81. // Sí, probar otra:
  82. Action++;
  83. } else if (SaE > NroDeSExperimentandose) {
  84. // Sino si aún hay situaciones a experimentar:
  85. trace("No hay más acciones posibles en la situación");
  86. IniciarExperimentosEnOtraS();
  87. } else {
  88. // Comenzar la etapa 2.
  89. IniciarEtapa2();
  90. }
  91. }

Ah, BuscarAccionesGanadoras se repite hasta que empiece la etapa 2.


« Última modificación: 20 Enero 2025, 04:19 am por Tachikomaia » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines