Simulador de ligas


Después de superar con nota el problema anterior, que se me ha llevado unas 6 horas del día, me ha quedado la pista libre para ponerme con un sencillo simulador de ligas. Se indican una división de un país y se añade a una pila de partidos.

Mediante un algoritmo enfrento a todos contra todos a ida y vuelta y genero una clasificación.

No me ha quedado mucho tiempo para pruebas, pero al menos he podido comprobar que el sistema funciona y que los datos son exactamente los esperados. Es decir, en las divisiones altas se marcan muchísimos goles, demasiados y a partir de tercera la cosa cae muy drasticamente. Ya contaba con este resultado. Poco a poco iré ajustandolo para normalizar esos resultados. Espero que me lleve menos tiempo del que pueda parecer.

Un ejemplo de las divisiones de Eslovenia.

1º MuNDiFutBoL      89 102  28 5 5  146 39
2º Grada Sur        85 89   26 7 5  118 26
3º red team         82 74   25 7 6  121 36
4º Ametsa K.E       81 66   25 6 7  121 49
5º lepantoso        79 51   26 1 11 113 54
6º Eskapados        78 65   24 6 8  110 41
7º Altec            78 46   24 6 8  102 50
8º www.rmp07.tk     73 50   22 7 9  97  45
9º KAZLEIN          67 31   20 7 11 88  50
10º Poli Team       53 9    16 5 17 95  75
11º Promesas        53 6    16 5 17 98  85
12º Pixie           50 -16  16 2 20 77  89
13º Bled FC         47 -18  13 8 17 59  73
14º barceloneta     47 -18  14 5 19 71  84
15º TUSALANA        37 -49  11 4 23 58  103
16º oparrulo        36 -50  10 6 22 59  103
17º Macanudo        35 -26  10 5 23 58  84
18º Caracoles FC    13 -105 4  1 33 16  122
19º D.Tenerife      8 -185  2  2 34 6   191
20º ZaTaN FC        1 -213  0  1 37 0   214 

1º  OPTICA RUI      94   77 30  4  4 105 24
2º  Team titoFlo    89   65 28  5  5  80 14
3º  Madridista      86   67 27  5  6  97 26
4º  idolomania      86   65 27  5  6  94 28
5º  F.C Titan       76   83 24  4 10 159 69
6º  Iroshima        74   36 23  5 10  84 42
7º  UE RIBA         74   36 23  5 10  87 47
8º  MaLi FC         68   11 21  5 12  51 38
9º  Kaiser          64   17 18 10 10  54 35
10º Lagunak         54    1 17  3 18  68 64
11º Tuercebota      52  -23 16  4 18  52 70
12º RODAS CF        48  -14 14  6 18  64 75
13º VOLADERO        45  -19 12  9 17  36 52
14º Los Putos       41  -24 10 11 17  30 53
15º santa ko        38  -21 11  5 22  49 66
16º demonio         36  -35 10  6 22  31 65
17º Kneo Team       23  -83 7   2 29  23 103
18º All brack       21  -66 6   3 29  25 90
19º Los Leones      10 -117 1   7 30   7 125
20º Indautxu        8  -110 2   2 34  23 133 

1º  CELESTE         103 123 33 4   1 132 13
2º  ThE hErOe        99 110 32 3   3 129 19
3º  Nerja C.F.       90  91 29 3   6 120 28
4º  Raim Mecanic     81  62 25 6   7  87 25
5º  Catanzaro FC     75  48 23 6   9  82 37
6º  Fatpapas         75  30 23 6   9  53 24
7º  Catalunya        72  19 22 6  10  55 39
8º  futuro f.c       71   7 22 5  11  49 44
9º  lariadna         66  17 20 6  12  56 38
10º Forcem           59  10 16 11 11  51 45
11º Guadalupe CF     49 -15 14 7  17  41 55
12º Pavota           46  -9 13 7  18  35 44
13º SA POBLA         31 -52  7 10 21  16 69
14º Livia            25 -52  6 7  25  18 73
15º Girona F.C       23 -48  4 11 23  12 68
16º poser j          23 -55  4 11 23  12 69
17º Alexis F.C       21 -64  4 9  25   9 76
18º AQUASOL C F      20 -63  3 11 24   7 76
19º FCBarcelona      19 -55  3 10 25  14 74
20º Milan Xupao      18 -61  3 9  26   6 68 

1º  desctrl         97  60  31  4  3 75 13
2º  Manlleu FC      67  21  18 13  7 38 18
3º  sobao f.c.      67  12  18 13  7 31 19
4º  TxapeldUnax     63  10  18  9 11 40 28
5º  brajalimpa      58   7  16 10 12 41 33
6º  JUNIC C.F       57   6  15 12 11 32 26
7º  Pascanas        57   1  15 12 11 25 24
8º  at.degoyaos     56   9  14 14 10 28 19
9º  sevebelu        54  -1  15  9 14 26 29
10º zetakaochos     48  -7  12 12 14 15 23
11º VarZelona       47  -5  12 11 15 22 29
12º UDSalamanca     46  -4  11 13 14 24 28
13º Emona F.C       45  -12 11 12 15 16 26
14º macanabios      43  -5   8 19 11 21 27
15º EuroZGZ         41  -11  9 14 15 18 29
16º caba            39  -10  7 18 13 14 24
17º Quemeros        37  -13  7 16 15 15 27
18º Berberechos     34  -16  8 10 20 14 31
19º CastellonF      33  -16  6 15 17 15 31
20º C.D.Roces       26  -26  4 14 20  7 33 

1º  ROQUETAS        106 90 35  1  2 118 25
2º  Sacred          86  61 27  5  6  88 26
3º  Maidu F.C.      81  32 25  6  7  50 16
4º  FC Maximus      80  38 24  8  6  68 28
5º  Nyquist         76  24 23  7  8  54 29
6º  Cali2os         73  25 20 13  5  50 24
7º  Alaaarjala      64   2 19  7 12  47 43
8º  Petastasis      54  -3 13 15 10  28 31
9º  Freekies        52  -9 15  7 16  31 39
10º Coca Juniors    41 -17  9 14 15  16 33
11º Dampkring       40 -22  9 13 16  21 41
12º Realmadrid c    37 -15  8 13 17  22 37
13º los S.A.        36 -22  8 12 18  18 40
14º BRIBON          34 -24  7 13 18  18 43
15º El Defe         33 -20  7 12 19  11 30
16º Durans          31 -28  6 13 19  13 42
17º C H R           30 -30  6 12 20  12 42
18º Sasky C.F.      27 -27  5 12 21  14 41
19º anti-facha      27 -30  3 18 17  10 40
20º Doke Unidos     25 -39  4 13 21  9  48 

1º  Kastefa Utd.    84  42 25  9  4 52 10
2º  california c    72  23 19 15  4 43 18
3º  MAMBO FC        63  12 16 15  7 35 23
4º  Nalguitas Fc    59   9 15 14  9 32 25
5º  Durbuz Tim      57   7 15 12 11 38 31
6º  At Chapapote    56  13 14 14 10 40 28
7º  UN Q            53   1 14 11 13 23 22
8º  R.BETIS B.      52  -2 11 19  8 22 23
9º  U.D.Monzon      51   2 11 18  9 27 24
10º eL rubiO C.F    50   1 13 11 14 27 27
11º javatos         48  -1 11 15 12 26 27
12º Roclada PV      44  -6  8 20 10 23 29
13º Palmas F.C.     42  -4 10 12 16 22 27
14º CD LAMAS        42  -9  8 18 12 20 29
15º Parla           41  -8  8 17 13 21 31
16º Our.Xcution     40  -8  7 19 12 18 25
17º FC Barcelona    38 -16  8 14 16 20 36
18º casa paca       36 -14  7 15 16 19 35
19º peligrosos      34 -14  7 13 18 14 30
20º Pozuelo Z.      29 -23  4 17 17 16 38 

1º  Arneiro F.C     82  27 24 10  4 48 19
2º  OBKORN          67  15 19 10  9 33 19
3º  ST.ANTONI FC    61   7 16 13  9 28 23
4º  A.C.D.P.L.R.    60  12 15 15  8 33 23
5º  At. Veneno      56   9 14 14 10 28 19
6º  CSKA Honved     56   1 15 11 12 31 29
7º  SSCR FC         53   8 11 20  7 22 14
8º  canian fc       53   4 13 14 11 28 25
9º  AE.Enlleurat    51   0 11 18  9 27 26
10º SOC RCDE        48  -4 12 12 14 33 37
11º Budapest SDK    47  -4 12 11 15 25 28
12º R.tamoga        46  -1 10 16 12 26 26
13º 67AC342         46  -2 10 16 12 21 23
14º Old Glories     45  -9 12  9 17 26 34
15º matadoro        44  -5  9 17 12 17 21
16º 10marado        42  -7  7 21 10 17 23
17º Androides Fc    40 -13  9 13 16 27 39
18º lapurru         38 -11  8 14 16 17 28
19º LugoF.C         34 -16  9  7 22 20 38
20º pabluria        32 -12  5 17 16 18 31

Al bajar la calidad, cuesta mas hilvanar las jugadas y llegar a puerta, ademas de menor efectividad en la definición, que repercuten en esa disminución. Y ademas, al bajar las cifras goleadoras, suben los empates.

Voy a intentar que los resultados sean realistas, pero no hay nada que hacer si hay equipos abandonados.
Eso no hay simulación que lo arregle. Si una liga de primera tiene 4 abandonados, pues los 100 goles son muy fáciles de alcanzar porque estos abandonados desvirtuan la categoría.
Mas allá de aplicar un factor corrector, la cosa marcha. En las 7 simulaciones no me ha saltado ningun error de bloqueo. Es muy buena noticia.

Si, que tengo que rematar algunos aspectos relativos a fuera de juego, por ejemplo, o en la búsqueda del balón suelto. Además pude arreglar un problema con una pared fantasma causado como no, por la influencia del fuera de juego.
Es una función complicada y la que mas problemas me causa. Y he aplicado serialización a mas de 20 clases y aporto con el post previo, un granito de arena a la comunidad de VB.NET con un ejemplo traducido del C#

Tambien he mejorado la herramienta de seguimiento de partido segundo a segundo, simplificandome mucho las pruebas y accediendo a cualquier error en muy poco tiempo en tiempo de depuración.

El día se puede calificar casi como brillante. 12 horas casi seguidas y el camino despejado para que mañana sea igual de bueno.

Anuncios

Serialización en VB.NET


Hoy he tenido un problema al intentar duplicar un vector que contenía objetos de clase.
Hiciera lo que hiciera, todas las llamadas a parametros o intentos de crear un duplicado de un elemento de un vector, de tipo clase, me encontraba el mismo problema. Me devolvía siempre un objeto por referencia y nunca por valor.

Esto me estaba dando muchos problemas, por ejemplo, si quería crear un duplicado de un único elemento, por ejemplo extraer un equipo del vector de equipos, y que fuese independiente, no me dejaba, ya que al pasarse por referencia, todos los cambios que yo hacía en el duplicado que había extraido, se estaban cambiando automáticamente en el equipo original en el vector. Lo cual era un desastre.

De modo que la forma que he encontrado, es crear un documento serializandolo, descomponiendolo en pedazos de forma automática en memoria para disponer de dicho duplicado real, y no como hasta ahora, un simple punto de referencia en memoria.

Todas las clases que se deseen serializar, deben incluir esta sentencia delante de la declaración de la clase:

<Serializable()>
 Public Class clsEquipos

También hace falta en los Structures.
Se puede crear una función que realice el trabajo de serialización.


Imports System
 Imports System.Collections.Generic
 Imports System.Text
 Imports System.Runtime.Serialization
 Imports System.IO
 Imports System.Runtime.Serialization.Formatters.Binary
 Namespace Utilidades

 '''
''' Realiza una clonación de un objeto de estructura compleja
 '''
Public Class clsCopiador

 Public Shared Function Duplicar(ByVal fuente)

 'Creamos un stream en memoria
 Dim formatter As IFormatter = New BinaryFormatter()
 Dim stream As Stream = New MemoryStream()

 formatter.Serialize(stream, fuente)
 stream.Seek(0, SeekOrigin.Begin)

 'Deserializamos la porción de memoria en el nuevo objeto
 Return formatter.Deserialize(stream)

 End Function
 End Class
 End Namespace

Otras opciones son mediante clones basicos y complejos.

Dejo aqui dos ejemplos, para desarrollar otro día.

Public Function ShallowCopy() As Person
       Return DirectCast(Me.MemberwiseClone(), Person)
    End Function

    Public Function DeepCopy() As Person
       Dim other As Person = DirectCast(Me.MemberwiseClone(), Person)
       other.IdInfo = New IdInfo(Me.IdInfo.IdNumber)
       Return other
    End Function

MemberwiseClone crea un clon superficial, donde solo copia el primer nivel de objetos, el resto queda por referencia. El efecto me parece desastroso.

Para hacerlo en profundidad hay que reenvíar todos los métodos, propiedades, etc, uno por uno, como se ve en DeepCopy, pero para lo que necesitaba yo, que era una copia completa y total y que no me implique tener que estar pendiente de cada mantenimiento en las propiedades, prefiero la serialización.

Nota: Tened cuidado si vais a volcar este tipo de información para hacer salvados a disco, ya que un salvado en 32 bits no lo podreis recuperar bien en uno de 64 bits y viceversa.

Dejo unas referencias para ampliar información:

Memberwise en MSDN
Memberwise en Java
Ejemplo completo en C#
Lección magistral de Guille