Pregunta

He estado al analizar el historial de manos de póquer para el año pasado y he aprendido un acuerdo acerca de analizar en general.

Comenzamos con expresiones regulares, pero rápidamente nos dimos cuenta de que no sería escalar fácilmente. Nos saltamos idiomas de rubí a C ++ y finalmente llegó a los apretones que era el algorithim que tenía que cambiar.

recogimos Boost :: Espíritu y vimos nuestra velocidad aumentar de manera espectacular en los pedidos de más de 10 veces nuestra velocidad original. a continuación, pasamos por alto a java y actualmente estamos utilizando antlr para crear gramáticas para cada sitio. Este es sin duda el método más rápido todavía y es muy completo que es agradable porque ya se sabe exactamente cuál es su situación en términos de una gramática 'completo'. Por desgracia, he pasado una increíble cantidad de tiempo de trabajo con estas gramáticas -. Funcionan muy muy bien pero no perfectamente todavía

En cualquier caso, basta con el fondo de la cuestión que nos ocupa - ¿existen técnicas 'exóticos' o menos bien conocidos para el análisis que no soy consciente de? Sólo sé de léxico / análisis de una gramática y el otro método de expresión regular / bucle inferior.

Para aquellos de ustedes que no están familiarizados con el historial de manos de póquer Voy a publicar una manera que podemos saber lo que es la estructura.

Full Tilt Poker Game #12037626529: Table durrrr (heads up, deep) - $500/$1000 -
Pot Limit Omaha Hi - 2:00:48 ET - 2009/05/05
Seat 1: durrrr ($196,456.50)
Seat 2: Gus Hansen ($65,499)
durrrr posts the small blind of $500
Gus Hansen posts the big blind of $1,000
The button is in seat #1
*** HOLE CARDS ***
durrrr raises to $3,000
Gus Hansen raises to $9,000
durrrr calls $6,000
*** FLOP *** [3d 4d 7d]
Gus Hansen has 15 seconds left to act
Gus Hansen checks
durrrr checks
*** TURN *** [3d 4d 7d] [Jh]
Gus Hansen checks
durrrr checks
*** RIVER *** [3d 4d 7d Jh] [Ah]
Gus Hansen has 15 seconds left to act
Gus Hansen checks
durrrr has 15 seconds left to act
123stayfree (Observer): GUS I NOW BRING U LUCK
durrrr bets $7,600
Gus Hansen has 15 seconds left to act
Gus Hansen has requested TIME
Hernandez777 (Observer): Gus has the super-duper nuts
Gus Hansen calls $7,600
Podobed45 (Observer): fluuuuuuuuuush
*** SHOW DOWN ***
durrrr shows [Kc 3s Qd As] two pair, Aces and Threes
Gus Hansen mucks
durrrr wins the pot ($33,199.50) with two pair, Aces and Threes
*** SUMMARY ***
Total pot $33,200 | Rake $0.50
Board: [3d 4d 7d Jh Ah]
Seat 1: durrrr (small blind) collected ($33,199.50)
Seat 2: Gus Hansen (big blind) mucked

Estoy muy consciente de otros métodos de recopilación de la información (por ejemplo, inyección de la pantalla-raspado y DLL), pero la necesidad de transformar la historia de la mano en datos estructurados sigue ahí, así que estoy sólo a los métodos que se llevan la información como expresiones regulares / gramáticas ...

Creo que si no encuentro algo que voy a reescribir nuestras gramáticas con ocamllex / ocamlyacc.

actualización

Para su información: Velocidad regexen fue ~ 60 manos / seg, mientras que las gramáticas estaban procesando más de 600 manos / seg ... toda la mano se transforma en XML después de que los datos se solucionó todo ... hay entre 20-30 expresiones regulares es necesario (en el último recuento) para cada sitio que desea analizar .... cada sitio en el lado de la gramática tiene su propio gramática con cantidades impíos de reglas léxico / analizador (pero sigue siendo más pequeño el tamaño del código)

Tengo el libro de dragón y he estado leyendo a través de él - que ha rechazado mi interés en el uso de la ocamllex / ocamlyacc .... velocidad es el nombre del juego aquí ..

¿Fue útil?

Solución

Si usted está mirando para maximizar la velocidad, entonces es posible hacer mejor utilizar OcamlYacc / FsYacc sobre antlr. OcamlYacc crea (1) analizadores LL, que normalmente tienen un mejor rendimiento que LL-estilo antlr (*) (analizadores alguien me puede corregir si me equivoco) . [Editar para añadir:] Parece que alguien me corrigió: OCamlYacc produce LALR (1) programas de análisis. No puedo decir con certeza si los analizadores OcamlYacc son más rápidos que los analizadores ANTLR.

OCaml / F # son muy buenos idiomas para la construcción de una conexión DSL, y en mi opinión mucho más adecuado para el trabajo que Java, sobre todo porque su ridículamente fácil de crear y atraviesan un AST representa como una estructura de datos de la Unión. Lo recomiendo este tutorial que demuestra cómo analizar SQL en C #.

Otros consejos

Desde que buscas un exótico, leer este artículo acerca de Vaughan Pratt Top Down Precedencia de Operadores ...

http://javascript.crockford.com/tdop/tdop.html

Analizador combinadores es un método muy popular de analizadores de construcción en los lenguajes funcionales como Haskell.

Hay que preguntarse si lo que realmente quiere hacer es jugar con programas de análisis (la verdad de diversión, y lo prefiero a mí mismo) o si desea obtener realmente el trabajo realizado en su bot de póquer. En su mayoría probablemente, las técnicas de análisis exóticos son excesivos para lo que necesita. Basta con elegir el idioma rápidamente con algunos sencillos, fáciles de usar programas de análisis. Probablemente debería ser capaz de procesar 10k manos / seg con C + flexión recta. O, ocamllex + ocamlyacc debería ser más que suficiente. Si usted tiene que hadoopify su código Creo que estás haciendo algo mal. La latencia de red debe llegar a ser el verdadero cuello de botella, no el análisis de velocidad. ¿Qué tipo de máquina que está ejecutando esto?

Otra alternativa es usar un generador de análisis a autogenerar una mesa de análisis y, a continuación, entregar la optimización de eso, o la optimización de la mano de la NFA (que probablemente no va a ahorrar mucho sin embargo, y el equilibrio en el tiempo programador probablemente no vale la pena ). análisis Combinator es probable que va a ser más lento.

En promedio, por una gramática dada de LL potencia equivalente será más lento que LALR. En particular, si las manos de póquer son en realidad analizable por un analizador LALR, a continuación, bisontes / byacc + flex venció las manos ANTLR abajo, cada vez. Personalmente estoy muy contento con menhir, a pesar de que es una perra rabiosa y media para llegar a trabajar con godi + ocamlbuild.

- Nico

Leer el libro del dragón: http://www.amazon.com/Compilers-Principles-Techniques-Alfred-Aho/ dp / 0201100886

Cubre análisis léxico y sintáctico en profundidad (entre otros temas). Usted puede usar esto para ayudarle a entender el "lenguaje" que está intentando analizar para determinar la mejor manera de hacerlo.

Wikipedia tiene una buena visión general sobre los tipos de analizadores sintácticos, aquí:   http://en.wikipedia.org/wiki/Parser

Y una comparación sobre las herramientas de generador de análisis, aquí: http://en.wikipedia.org/wiki / Comparison_of_parser_generators

GLR es una clase de método menos conocido que es interesante porque se trata con ambigüedades del lenguaje.

Analizador descendente recursivo podría funcionar para usted. Es muy personalizable. Puede que sea un poco más lento que yacc / antlr, pero puede ser lo suficientemente rápido. La idea básica: codificar todas las reglas de la gramática como una función

.

Desde que está hablando acerca del uso de OCaml para el análisis, esta página ofrece una visión general de las diferentes opciones de análisis para ese idioma:

generadores de analizadores sintácticos para el lenguaje OCaml

Si decide que conformarse con ocamlyacc (o menhir), estos tutoriales pueden ser un poco más fácil que el manual de referencia:

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top