Manteles La Joya Covering adaptados

Responder
vic
11
11
Mensajes: 454
Registrado: Mié 15 Jul, 2009 8:26 pm

Manteles La Joya Covering adaptados

Mensaje por vic »

Buenos Días
trasteando en este mundillo de la combinatoria y tomando como base los manteles de la joya, como por ejemplo
C(24,6,5) = 7084 combinaciones
Method of Construction: steiner system
Lower Bound: Schonheim
1 3 4 10 14 16
1 4 5 7 22 23
8 11 13 18 21 24
7 8 10 13 16 23
5 8 14 15 16 21
2 5 6 17 23 24
2 3 4 9 11 17
9 10 17 18 19 22, etc,etc
Busque aplicar esos 24 números en grupos de 8, con 3 números en cada grupo con miprimitiva, XMW, etc
con los resultados de muchísimas apuestas que no se ajustan con lo que busco. Se me ocurrío adaptar un programa básico pero potente y que corre en MS dos y que es el basic, con este planteamiento

C(8,6,5) = 12

Method of Construction: lex covering

Lower Bound: Schonheim
pero solo con estos parámetros:


1 2 3 4 5 6
1 2 3 4 7 8
1 2 5 6 7 8
3 4 5 6 7 8
1 2 3 4 5 7
1 2 3 4 5 8
1 2 3 4 6 7
1 2 3 4 6 8
1 3 5 6 7 8
1 4 5 6 7 8
2 3 5 6 7 8
2 4 5 6 7 8


Y este es el programa:

OPEN "Hola.txt" FOR OUTPUT AS #1
CLS
PRINT " Grupo 1"
5
INPUT b1
INPUT b2
INPUT b3
PRINT " Grupo 2"
INPUT d1
INPUT d2
INPUT d3
PRINT " Grupo 3"
INPUT f1
INPUT f2
INPUT f3
PRINT " Grupo 4"
INPUT h1
INPUT h2
INPUT h3
PRINT " Grupo 5"
INPUT j1
INPUT j2
INPUT j3
PRINT " Grupo 6"
INPUT l1
INPUT l2
INPUT l3
PRINT " Grupo 7"
INPUT n1
INPUT n2
INPUT n3
PRINT " Grupo 8"
INPUT p1
INPUT p2
INPUT p3

10

FOR a = b1 TO b3
FOR c = d1 TO d3
FOR e = f1 TO f3
FOR g = h1 TO h3
FOR i = j1 TO j3
FOR k = l1 TO l3
FOR m = n1 TO n3
FOR o = p1 TO p3


PRINT #1,a;c;e;g;i;k
PRINT #1,a;c;e;g;m;o
PRINT #1,a;c;i;k;m;o
PRINT #1,e;g;i;k;m;o
PRINT #1,a;c;e;g;i;m
PRINT #1,a;c;e;g;i;o
PRINT #1,a;c;e;g;k;m
PRINT #1,a;c;e;g;k;o
PRINT #1,a;e;i;k;m;o
PRINT #1,a;g;i;k;m;o
PRINT #1,c;e;i;k;m;o
PRINT #1,c;g;i;k;m;o

NEXT s
NEXT o
NEXT m
NEXT k
NEXT i
NEXT g
NEXT e
NEXT c
NEXT a

RESTORE
CLOSE #1


Al final ejecuta lo que me propongo, ya que lo acota a solo lo que pido, pero ejecuta acciones repetitivas de cálculo que provoca desbordamiento de buffer por la cantidad combinaciones finales repetidas. como puedo eliminar las repetidas en el resultado final?
Lo he probado con Pascal y me sale lo mismo. Lo he intentado con VBA pero no tengo un nivel tan avanzado con bucles repetitivos for next para dar con la solución. A ver si alguien se acuerda de sus conocimientos de secundaria para depurar este programilla; o de otra manera reconvertir este programa a VBA
Gracias de antemano
Avatar de Usuario
victorisaac
13
13
Mensajes: 3286
Registrado: Dom 13 Mar, 2011 1:06 am

Re: Manteles La Joya Covering adaptados

Mensaje por victorisaac »

Hola Vic
En la sección de informática y programas es mas probable que te lo resuelvan, hay compañeros muy puestos en el tema y muy asiduos al foro.

Un saludo.
El azar es circunstancia y la suerte coincidencia.
Aplicar la circunstancia adecuada provocará la coincidencia

EUREKA
DIVIDE Y VENCERAS, MULTIPLICA Y MAS.
Imagen
vic
11
11
Mensajes: 454
Registrado: Mié 15 Jul, 2009 8:26 pm

Re: Manteles La Joya Covering adaptados

Mensaje por vic »

Ok Victorisaac. Aquí también hay muy buenos.
danvader99
11
11
Mensajes: 809
Registrado: Dom 29 Oct, 2017 8:20 pm

Re: Manteles La Joya Covering adaptados

Mensaje por danvader99 »

uhmm a ver hacer esto en vba es muy fácil ,pero te tiras mínimo un par de horas programando, en BASIC también se puede hacer, hay varias formas la mas sencilla seria

cuando sacas PRINT #1,a;c;e;g;i;k, tienes que calcular el índice lexicográfico de esa combinación que te sale, supongamos que es la combinación 1,2,3,4,5,7 y sabemos que tiene un índice lexicográfico=2 ,pues bien defines un array o variable unidimensional yo la llamo myarray y le das el valor 1,Ten en cuenta que antes de iniciar el programa todo el array tiene valor cero.

ya sabes que myarray(2)=1 (es decir la combinación 1,2,3,4,5,7 ha salido y con esto myarray(2)=1 la tienes localizada

si la combinacion fuera la 12,23,34,45,46,47 y suponiendo que su índice lexicográfico fuera 12.345.456 (me lo he inventado) myarray(12345456) seria 1

con el PRINT #1,a;c;e;g;m;o y el resto de PRINT #1 lo mismo.

lo que tienes que hacer es poner un if, para que una vez que te empiecen a salir los 1,no vuelvan a pasar por los PRINT #1,solo pasaran si son cero

if myarray()=0 then

PRINT #1,a;c;e;g;i;k....pon indice lexicografico de esa combinacion myarray y dale valor 1 (a;c;e;g;i;k)=1
PRINT #1,a;c;e;g;m;o....pon indice lexicografico de esa combinacion y dale valor 1
PRINT #1,a;c;i;k;m;o....pon indice lexicografico de esa combinacion y dale valor 1
PRINT #1,e;g;i;k;m;o....pon indice lexicografico de esa combinacion y dale valor 1
PRINT #1,a;c;e;g;i;m....pon indice lexicografico de esa combinacion y dale valor 1
PRINT #1,a;c;e;g;i;o....pon indice lexicografico de esa combinacion y dale valor 1
PRINT #1,a;c;e;g;k;m....pon indice lexicografico de esa combinacion y dale valor 1
PRINT #1,a;c;e;g;k;o....pon indice lexicografico de esa combinacion y dale valor 1
PRINT #1,a;e;i;k;m;o....pon indice lexicografico de esa combinacion y dale valor 1
PRINT #1,a;g;i;k;m;o....pon indice lexicografico de esa combinacion y dale valor 1
PRINT #1,c;e;i;k;m;o....pon indice lexicografico de esa combinacion y dale valor 1
PRINT #1,c;g;i;k;m;o....pon indice lexicografico de esa combinacion y dale valor 1

end if

el programa haciendo esto te ira rapidísimo y no tendrás duplicidades.

Un saludo
vic
11
11
Mensajes: 454
Registrado: Mié 15 Jul, 2009 8:26 pm

Re: Manteles La Joya Covering adaptados

Mensaje por vic »

Gracias danvader99
Voy a ponerme esta tarde
Un saludo
danvader99
11
11
Mensajes: 809
Registrado: Dom 29 Oct, 2017 8:20 pm

Re: Manteles La Joya Covering adaptados

Mensaje por danvader99 »

suerte ,lo que mas te va a costar es sacar el código para calcular el índice lexicográfico de la combinación, si lo logras ,todos tus bucles ,en esta o en otra idea que tengas irán mucho mas rápido
pacopuf
11
11
Mensajes: 644
Registrado: Lun 07 Ago, 2017 4:49 pm

Re: Manteles La Joya Covering adaptados

Mensaje por pacopuf »

Hola Vic,

Con VBx no te puedo ayudar.

Yo realizo todo en Python. Es más sencillo.

Por ejemplo, si quieres tener todas las posibles combinaciones de, digamos 20 números, tomados de 6 en 6, bastan las siguientes líneas:

import itertools

números = range(1,21)

posibles_combinaciones = list(itertools.combinations(numeros,6)


En cualquier caso, y ya independientemente del lenguaje de programación, cuando tengo que hacer algo como comentas, lo que hago es primero crear todas las combinaciones posibles (como indico arriba) y después seleccionar de ellas solo las que me interesan y/o necesito.

Saludos,

Paco
Groucho Marx: ¿A quién vas a creer, a mí o a tus propios ojos?

"Si no podemos poner fin a nuestras diferencias, contribuyamos a que el mundo sea un lugar apto para ellas"
J. F. Kennedy

Adios y hasta la próxima!!
vic
11
11
Mensajes: 454
Registrado: Mié 15 Jul, 2009 8:26 pm

Re: Manteles La Joya Covering adaptados

Mensaje por vic »

Gracias amigos de la loto por responder rápidamente, estoy liado con ello para reducir los tiempos de cálculo y así probar la efectividad del método en la que estoy ahora.
Un saludo
vic
11
11
Mensajes: 454
Registrado: Mié 15 Jul, 2009 8:26 pm

Re: Manteles La Joya Covering adaptados

Mensaje por vic »

Gracias amigos por su colaboración.
vic
11
11
Mensajes: 454
Registrado: Mié 15 Jul, 2009 8:26 pm

Re: Manteles La Joya Covering adaptados

Mensaje por vic »

Holas
El caso que no hay suficiente bibliografía o tutoriales para calcular el índice lexicografico del programa en cuestión. Alguna pista??. Me gustaría un comienzo y yo sigo para adelante
Gracias

Un saludo
danvader99
11
11
Mensajes: 809
Registrado: Dom 29 Oct, 2017 8:20 pm

Re: Manteles La Joya Covering adaptados

Mensaje por danvader99 »

EFECTIVAMENTE no hay suficiente bibliografía o tutoriales para calcular el índice lexicográfico lo mismo que no hay suficiente bibliografía o tutoriales para aumentar la velocidad en una serie de for next anidados, yo creo que son los dos códigos mas importantes para optimizar cualquier programa de combinatoria y lógicamente la gente que logra dar con algo no la suele compartir o al menos no de una forma explicita. Yo tengo ambos códigos en VBA y me han costado su tiempo, no tienes que buscar en paginas españolas, te vas al traductor de Google y te metes en foros anglosajones de programación poniendo "lexicografic index in VBA" o cosas parecidas y con una parte de aquí otra de allá y mucho tiempo puedes hacerte con el código.

La verdad es que el índice lexicográfico es apasionante, logras trasformar una combinación de seis valores en un único valor y con ello......logras un montón de ventajas, trabajas con un único dato en lugar de con seis, no usas seis bucles sino solo uno ,pero no solo vas mas rápido ,sino que lo puedes usar para infinidad de ideas, desde la mas sencilla que puede consistir en quitar digamos 10.000 combinaciones (imagínate 10.000 combinaciones ,ahí no aciertas la de seis ni de broma) y ver sus índices lexicográficos y ver como trocean estas 10.000 todo el universo de los 14.000.000 y forman varios grupos, unos grandes otros mas pequeños, los mas pequeños lógicamente te los quitas de en medio rápidamente porque ahí no esta la de seis ni de broma ,ya que la combinación de 6 va rodeada de sus correspondientes cinco aciertos(eso lo ves rápidamente con el índice lexicográfico) , vamos que puedes reducir bastante con esto de los índices lexicográficos aunque mas que reducir, es eliminar apuestas innecesarias si has elegido bien las 10.000 y es francamente fácil idear cualquier método que se cumpla casi siempre y elimines casi siempre 10.000.Vamos 10.000 no es nada lo bueno es la amplitud de eliminación que logras después.

Con respecto a lo tuyo, prueba esto, no es exactamente el código que supongo que buscas pero te puede apañar si tienes suficiente RAM

'define una variable de seis dimensiones, en VBA seria algo asi

MIVARIABLE(49,49,49,49,49,49) as single

'define el resto de variables

Dim Z1, Z2, Z3, Z4, Z5, Z6, Z7, Z8 As Integer
Dim A as single

'haz estos bucles, MIVARIABLE se ira llenando con el índice lexicográfico y lo ira haciendo muy rápido a pesar de ser seis bucles.

A=1
For Z1 = 1 To 44
For Z2 = Z1 + 1 To 45
For Z3 = Z2 + 1 To 46
For Z4 = Z3 + 1 To 47
For Z5 = Z4 + 1 To 48
For Z6 = Z5 + 1 To 49
MIVARIABLE(Z1,Z2,Z3,Z4,Z5,Z6)=A
A=A+1
Next Z6: Next Z5: Next Z4: Next Z3: Next Z2: Next Z1

¿Qué problema te puedes encontrar? que no tengas mucha memoria RAM, una variable de este tipo MIVARIABLE(49,49,49,49,49,49) necesita bastante, mi ordenador no lo soportaba y tuve que seguir mirando foros, quizás el tuyo sea bueno, yo tenia 2 de RAM, ahora amplié a 8


retoma tu código declarando esta segunda variable que será la que tome valor 0 o 1

'la declaro

dim myarray(14000000) as single


....por aquí va tu código


if myarray(MIVARIABLE(Z1,Z2,Z3,Z4,Z5,Z6))=0 then

PRINT #1,a;c;e;g;i;k....pon indice lexicografico de esa combinacion myarray y dale valor 1 (a;c;e;g;i;k)=1
PRINT #1,a;c;e;g;m;o....pon indice lexicografico de esa combinacion y dale valor 1
PRINT #1,a;c;i;k;m;o....pon indice lexicografico de esa combinacion y dale valor 1
PRINT #1,e;g;i;k;m;o....pon indice lexicografico de esa combinacion y dale valor 1
PRINT #1,a;c;e;g;i;m....pon indice lexicografico de esa combinacion y dale valor 1
PRINT #1,a;c;e;g;i;o....pon indice lexicografico de esa combinacion y dale valor 1
PRINT #1,a;c;e;g;k;m....pon indice lexicografico de esa combinacion y dale valor 1
PRINT #1,a;c;e;g;k;o....pon indice lexicografico de esa combinacion y dale valor 1
PRINT #1,a;e;i;k;m;o....pon indice lexicografico de esa combinacion y dale valor 1
PRINT #1,a;g;i;k;m;o....pon indice lexicografico de esa combinacion y dale valor 1
PRINT #1,c;e;i;k;m;o....pon indice lexicografico de esa combinacion y dale valor 1
PRINT #1,c;g;i;k;m;o....pon indice lexicografico de esa combinacion y dale valor 1

end if

Un saludo
vic
11
11
Mensajes: 454
Registrado: Mié 15 Jul, 2009 8:26 pm

Re: Manteles La Joya Covering adaptados

Mensaje por vic »

Gracias danvader99
A altas horas de la noche solucionar unas dudas de un forero de la loto, dice mucho de ti. Con esto me das un empujón de gigante así que lo aprovecharé lo máximo
Un saludo
Avatar de Usuario
Wandering
12
12
Mensajes: 1494
Registrado: Jue 26 Abr, 2018 8:50 pm

Re: Manteles La Joya Covering adaptados

Mensaje por Wandering »

Vic.
Espero que responda a lo que buscas, te lo envie por MP.

Bienvenid@, a lexicografico. :ok:
:beer2: :money:
vic
11
11
Mensajes: 454
Registrado: Mié 15 Jul, 2009 8:26 pm

Re: Manteles La Joya Covering adaptados

Mensaje por vic »

Gracias Wandering. Lo acabo de ver. Todo sea por la causa.....
Responder