Feeds de los foros

En la página principal de los foros encontrarás los enlaces al logo feed feed general y al de cada uno de los foros.

Subscribete para mantenerte informado de los cambios y responde a las dudas siempre que te sea posible

Buscar en el foro

Foro JavaCup

feed Foro JavaCup Foro: JavaCup

Nuevo Tema Nuevo Tema

Esta Permitido? 14/05/2008 11:11
anonymous

Esta permitido que al instanciar la tactica se lea un recurso dentro del classpath, mas especificamente un archivo de datos. La carga es solo inicial.

El archivo pesa 692.856 bytes y equivale a un array float[160][240][2];

En mi pc la carga demora 219 ms.

Este es el codigo para la lectura:

t0=System.currentTimeMillis();
InputStream is = CargaTest.class.getResource("data").openStream();
ObjectInputStream ois = new ObjectInputStream(is);
float[][][] data = (float[][][]) ois.readObject();
ois.close();        ; 
t=System.currentTimeMillis();
System.out.println(t-t0);
#unapprove_message#
RE: Esta Permitido? 14/05/2008 14:51
JorgeRubira

Buenas, lo siento pero no se pueden acceder a recursos como Ficheros o clases cerradas. Lo que se envia se va a integrar dentro del software por lo que cualquier persona que en un futuro se lo descargue, unicamente bajando el código fuente y abriendolo se debería ejecutar. (Las personas que en un futuro ejecuten la aplicación no deberían hacer nada más que abrir el proyecto y pulsar el play). Por otra parte, no puede haber código cerrado.

Las tácticas que hagan referencia a clases encargadas de lectura a disco como por ejemplo File, se rechazarán (aunque no se ejecute ese código).

Saludos, Jorge

#unapprove_message#
RE: Esta Permitido? 14/05/2008 15:25
anonymous

Jorge no se trata de clases cerradas, son datos estadisticos que permiten tomar deciciones en distintas posiciones en el campo de juego. Ademas el fichero de datos esta en el mismo paquete junto con la tactica asi se cargaria como un recurso interno, no comprometeria la seguridad y cualquier persona podria volver a ejecutarlo.

Sigue sin estar permitido?

Saludos.

#unapprove_message#
RE: Esta Permitido? 14/05/2008 15:52
anonymous

porque no haces lo siguiente?

public class LoQueSea {

public static float data[][][] = {

{{dato_0_0_0, dato_0_0_1}, {dato_0_1_0, dato_0_1_1}, .. , {dato_0_239_0, dato_0_239_1}},

{{dato_1_0_0, dato_1_0_1}, {dato_1_1_0, dato_0_1_1}, .. , {dato_1_239_0, dato_159_239_1}}, 

..

..

{{dato_159_0_0, dato_159_0_1}, {dato_159_1_0, dato_0_1_1}, .. , {dato_159_239_0, dato_159_239_1}}

}

}

te quitas problemas y accedes mediante LoQueSea.data[algo1][algo2][algo3];

 no te incrementa mucho el peso del fichero y evitas complicaciones

#unapprove_message#
RE: Esta Permitido? 14/05/2008 15:57
anonymous Pense en hacer eso... pero alguna vez lei que el codigo de una clase no puede superar un tamaño maximo. Voy a intentarlo de todos modos y aviso.
#unapprove_message#
RE: Esta Permitido? 14/05/2008 18:31
anonymous

No funciono... al compilar me sale

D:\JavaCup\src\futbol\tacticas\concursantes\mitac tica\Data.java:11: code too large

:(

 

 

#unapprove_message#
RE: Esta Permitido? 14/05/2008 20:17
anonymous Por curiosidad, pq mapeas todas las posiciones del campo en este array? Lo haces por alguna razón especial? A lo mejor es posible hacer lo mismo que intentas hacer de una forma q consuma menos recursos.
#unapprove_message#
RE: Esta Permitido? 14/05/2008 20:49
anonymous

La informacion que tengo en el arreglo es el angulo optimo para disparar a puerta  y la probabilidad de que sea gol para cada punto en el campo rival. Entre un pixel y los proximos a el hay diferencias que no queria pero al parecer voy a tener que interpolar.

#unapprove_message#
RE: Esta Permitido? 14/05/2008 21:11
anonymous Esta información se puede calcular. Para el angulo puedes utilizar el método General.getAngulo( posFutbolista.x, posFutbolista.y, 160, 0 ), para la probabilidad depende de la fuerza del jugador, de la distancia y de los jugadores del equipo rival que pueda haber de por medio.
#unapprove_message#
RE: Esta Permitido? 14/05/2008 21:30
anonymous

Hilando fino no es tan asi... si disparas desde la parte superior de la cancha no te combiene apuntar al centro del arco sino que entre el centro del arco y el poste superior. Mira la funcion esGOL en la clase Bola del framework y te daras cuenta. Esto se incrementa cuando los tiros son mas esquinados.

#unapprove_message#
RE: Esta Permitido? 14/05/2008 21:34
JorgeRubira

Buenas,

No se pueden cargar datos del disco duro ajenos al código fuente enviado.

Voy a darte una opinión pero por supuesto tu eres libre de hacer creas conveniente.

1- Yo intentaría optimizar un poco las variables. Lo primero intentaría guardar la probabilidad en algo más pequeño (aunque menos preciso) como por ejemplo un byte por muestra con valores de 1 a 100 que representen la probabilidad.

2- No sé que significan 160, 240, 2 pero estoy casi seguro que el valor de 150, 250, 2 es prácticamente igual al 149, 250, 2 y también al 148, 250, 2. Por ello puedes guardar un subconjunto de muestras y utilizar una aproximación (por ejemplo multiplos de 5) de manera que si tienes que leer el dato 153, 250, 2 -> leas (int)(153%5), (int)(250%5), 2. Hablo sin saber cuanta diferencia hay si se toman muestras con diferencia 5.

3- Por último, si utilizas el anterior caso puedes hacer dos cosas, o crear un vector de manera que la posicion es (int)(153/5), (int)(250/5), 2, o puedes crear un hashtable que se carga en el constructor se rellenen todos los datos utilizando como key (int)(153%5) + " " + (int)(250%5) + " " + 2 y el byte que se inserta es la muestra. Para no picar todo el código puedes hacer otro código que lea tu fichero de muestras y genere código java.

Algo así...

for (int n=0;n<160;n+=5)

for (int m=0;m<240;m+=5)

for (int o=0;o<2;o++) {

System.out.println("hash.add(n+\" \" + m + \" \" + o, " + leerValorFicheroEnByte(n,m,o) + ");\n" );

}

o para el caso del vector...

for (int n=0;n<160;n+=5)

for (int m=0;m<240;m+=5)

for (int o=0;o<2;o++) {

System.out.println("vector[n/5][m/5][o] = leerValorFicheroEnByte(n,m,o) + ";\n" );

}

Los vectores claramente son más eficaces que los hashtables (o al menos eso creo) por estar guardados. No sé si esta solucion te puede servir o no. Tampoco sé si tomando aproximaciones de 5 el compilador te dejará (o incluso se si se saturará el ordenador o no). (es solo un ejemplo)

Si son datos en el que intervienen solo dos datos x,y de manera que se busca la dependencia de x sobre y, con las excel se puede crear una gráfica de puntos y existe una opción en la cual puedes sacar una función polinómica que aproxime esas muestras. De manera que en vez de trabajar con arrays, trabajas con una función polinómica. (Pero esto depende también de la forma que tienen las muestras ya que según como sean no es muy preciso y la función puede oscilar mucho).

Saludos, Jorge

#unapprove_message#
RE: Esta Permitido? 14/05/2008 21:44
JorgeRubira

Corrijo unas frases más expresadas o inacabadas ...

1- No se pueden cargar datos del disco duro distintos al código fuente enviado.

2- Los vectores claramente son más eficaces que los hashtables (o al menos eso creo) por estar guardados secuencialmente.

3- Si son datos en el que intervienen solo dos variables x,y

#unapprove_message#
RE: Esta Permitido? 14/05/2008 22:20
anonymous

El comando tiro a puerta, si tu jugador se encuentra en la parte superior del campo, con el desvio = 0, realmente estas apuntando a la parte superior de la porteria, ya que el punto real donde realizas el disparo no es (160, 0) sino (190, 0), naturalmente puedes jugar con el desvio para terminar de ajustar el tiro.

Con referéncia a los tiros esquineros, si detectas que no tienes angulo de tiro (angulo próximo a PI o a -PI) lo mejor es centrar el balón para que otro delantero remate la faena.

#unapprove_message#
RE: RE: Esta Permitido? 14/05/2008 22:22
anonymous realmente quería decir, angulo próximo a PI/2 o a 3*PI/2
#unapprove_message#
RE: Esta Permitido? 14/05/2008 22:28
anonymous

Gracias a todos por las aclaraciones...

Saludos.

#unapprove_message#
RE: Esta Permitido? 15/05/2008 00:30
JorgeRubira

Buenas, una cosa que acabo de caer. No sé si por aquí va el tema pero calcular el mejor angulo para tirar es bastante fácil. Solo hay que sacar el angulo con ambos palos y quedarse con el angulo medio. Es decir si la posición del jugador es x,y

ang1= General.getAngulo(x,y,160,-20)

if (ang1>PI) ang1-=PI*2; //Para convertir a negativo y sacar mejor la media

ang2= General.getAngulo(x,y,160,20)

if (ang2>PI) ang2-=PI*2; //Para convertir a negativo y sacar mejor la media

angMed= (ang1+ang2) / 2

ComandoGolpearBola(x+Math.cos(angMed) * 1000, y+Math.sen(angMed) *1000)

1000 es un valor simbolico, significa lo más fuerte que pueda en ese angulo.

Desde el punto de vista de probabilidad, cuanta mayor sea la distancia entre ang1 y ang2, mayor probabilidad (siempre teniendo en cuenta que la fuerza pueda traspasar al portero). Si en esta de angulo es mayor que PI/5, es gol seguro. En caso contrario la probabilidad será (ang1-ang2)/(PI*5)

Espero no haberme equivocado. 

Saludos, Jorge

 

 

#unapprove_message#
RE: Esta Permitido? 15/05/2008 00:32
JorgeRubira Quise decir (Math.abs(ang1-ang2))/(PI*5) ya que me refiero a la distancia entre angulos.
#unapprove_message#
RE: Esta Permitido? 15/05/2008 02:10
anonymous

Jorge... supon que disparas desde la zona de arriba del campo justo hacia el poste superior... cuando la bola supere en X a los 160 la cordenada Y no sera -30 sino que un poco mas, en este caso seria gol. Si ahora apuntas al poste inferior al superar el X los 160 el Y sera mayor que 30 por lo tanto no seria gol. Luego el limite superior para convertir gol esta un poco mas arriba que el poste superior (fuera del arco) y el limite inferior esta un poco sobre el poste inferior (dentro del arco). El punto optimo para disparar es la media entre el limite superior y el inferior. Esto es mas notorio mientras mas esquinado es el disparo. Corrijamne si me equivoco.

OJO:Estoy suponiendo que se chequea si es gol... se avanza la distancia correspondiente a la velocidad del balon y se chequea denuevo...

Saludos.

#unapprove_message#
RE: Esta Permitido? 15/05/2008 10:33
anonymous Por curiosidad, sabed que el peso maximo de un fichero CLASS es de 65536 bytes (64Kb). Esto es debido a que internamente en la maquina virtual se utiliza un puntero de 16 bits para referirse a la zona de byte codes.
#unapprove_message#
RE: Esta Permitido? 15/05/2008 14:54
JorgeRubira

Buenas, Me he equivocado en el valor 20. No es 20, es 30 que es el tamaño que se indica en el dibujo.

En lo que comentas de lanzar justo al palo. La pelota se mueve de 1 a 1 pixel y si detecta pared rebota. Por lo que ese caso es muy ocasional (solo en 1 px de distancia).

public void mover(){

...

for (int n=0;n x+=Math.cos(angulo);
y+=Math.sin(angulo);

--- if (da en pared) --> rebota(); ---
}

...
}

PD: Decir que es una cosa que se corrigió como bug en la javacup2007 ya que antes hacia cos(ang) * velocidad. (De hecho en el video que fue antes de corregir los bugs, se hace así).

Saludos, Jorge

#unapprove_message#
RE: Esta Permitido? 15/05/2008 15:05
anonymous

Ok Jorge... era mucho mas sencillo de lo que pensaba.

Gracias y saludos.

#unapprove_message#
#thread_expired#.
Sun Microsystem Logo NHT-Norwick Logo

© 2002-2007 Asociación javaHispano