Autor Tema: ¿Conocen un progrma que averigue relaciones entre datos?

0 Usuarios y 1 Visitante están viendo este tema.

19 Diciembre, 2023, 09:20 pm
Leído 716 veces

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Uno al que le digas por ejemplo
X__Y__Z
1__1__1
1__2__2
2__1__2
2__2__4
Y te diga: Z = X*Y

Yo usaba este:
http://nutonian.wikidot.com/

Pero ahora años después no me deja descargarlo y además parece que dejó de ser gratis, así que ¿conocen algún programa similar?

¿O cómo puedo averiguar ese tipo de relaciones? Porque en el ejemplo que puse es muy fácil pero a veces no para mí.

20 Diciembre, 2023, 02:03 am
Respuesta #1

Juan Pablo Sancho

  • Moderador Global
  • Mensajes: 6,562
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
La verdad no sé de estas cosas , mira si esto te sirve:
HeuristicLab.

20 Diciembre, 2023, 10:00 am
Respuesta #2

DaniM

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 221
  • País: cz
  • Karma: +0/-0
No he probado el programa que has puesto en el enlace, pero para tu ejemplo en particular, si quieres ceñirte únicamente a las cuatro operaciones aritméticas básicas, puedes programarte tú mismo una función que evalúe la operación usada entre dos números para obtener un tercero.

Aquí tienes una implementación básica en Javascript, que es un primo-hermano del lenguaje que sueles usar:

Código: [Seleccionar]
function determinarOperacion (a, b, r)
{
let operacion = null;
if (a + b == r)
{
operacion = "suma";
}

else if (a - b == r)
{
operacion = "resta";
}

else if (a * b == r)
{
operacion = "multiplicación";
}

else if (a / b == r)
{
operacion = "division";
}

return operacion;
}

derminarOperacion (2, 4, 6)
'suma'

determinarOperacion (3, 3, 1)
'division'

determinarOperacion (3.14, 2.14, 1)
'resta'

determinarOperacion (3.14, 0, 0)
'multiplicación'

determinarOperacion (3.14, 0, 50)
null

Para evaluar relaciones más sofisticadas, por ejemplo \( a^{3} + \textrm{sin}(a) + 2b \), puedes añadir más condiciones a la función, pero dadas las infinitas posibilidades, lo más viable sería usar algún algoritmo heurístico o incluso considerar el uso de inteligencia artificial.

23 Diciembre, 2023, 08:40 am
Respuesta #3

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
HeuristicLab parece demasiado complejo, mucha cosa... Yo simplemente quiero introducir unos datos y que me diga la relación, pero el video muestra diagramas de flujo y otras cosas que no entiendo si tienen relación o no.

No he probado el programa que has puesto en el enlace
Sería inútil que lo hicieras porque ya no funciona. Pero puedes ver este video que explica cómo era:
Ni idea por qué pone datos tan complicados, todo es más simple de lo que muestra el video que además es demasiado largo para lo simple que es.

Citar
, pero para tu ejemplo en particular, si quieres ceñirte únicamente a las cuatro operaciones aritméticas básicas, puedes programarte tú mismo una función que evalúe la operación usada entre dos números para obtener un tercero.
Yo intenté eso hace años, pero es muy difícil, un programa como el que busco lo hace mejor...
La relación no es que sólo pueda ser "Letra operador letra" (A+B, o A*B, etc), puede ser (A+B*2-A/3)^B o cualquier cosa no simplificable que imagines...

Citar
dadas las infinitas posibilidades, lo más viable sería usar algún algoritmo heurístico o incluso considerar el uso de inteligencia artificial.
Exacto, por eso mismo busco algo de eso.

Igual por curiosidad capáz que lo intento de nuevo, esto fue en 2011 antes de conocer Eureqa:


El archivo editable no lo puedo abrir porque es de una versión de Flash más nueva que ya no uso, pero tengo esto en un texto (no se entiende bien, antes programaba peor que ahora xP ):
Código: [Seleccionar]
//   Búsqueda de Rel complejidad 1.
Rel2 = Y1/X1;
Rel3 = Y2/X2;
if (Rel2 == Rel3) {
                RelH = Rel2+"X";
                if (RelH.length<Rel.length) {
                                Rel = RelH;
                }
}
if (Rel2 == X1) {
                if (Rel3 == X2) {
                                RelH = "X * X";
                                if (RelH.length<Rel.length) {
                                                Rel = RelH;
                                }
                }
}
Rel2 = X1/Y1;
Rel3 = X2/Y2;
if (Rel2 == Y1) {
                if (Rel3 == Y2) {
                                RelH = "ÇX";
                                if (RelH.length<Rel.length) {
                                                Rel = RelH;
                                }
                }
}
if (Rel2 == Rel3) {
                RelH = "X / "+Rel2;
                if (RelH.length<Rel.length) {
                                Rel = RelH;
                }
}
Rel2 = Y1-X1;
Rel3 = Y2-X2;
if (Rel2 == Rel3) {
                if (Rel2<0) {
                                RelH = "X - "+Rel2*-1;
                                if (RelH.length<Rel.length) {
                                                Rel = RelH;
                                }
                } else {
                                RelH = "X + "+Rel2;
                                if (RelH.length<Rel.length) {
                                                Rel = RelH;
                                }
                }
}
if (Math.floor(X1) == Y1) {
                if (Math.floor(X2) == Y2) {
                                RelH = "vX";
                                if (RelH.length<Rel.length) {
                                                Rel = RelH;
                                }
                }
}
if (Math.ceil(X1) == Y1) {
                if (Math.ceil(X2) == Y2) {
                                RelH = "^X";
                                if (RelH.length<Rel.length) {
                                                Rel = RelH;
                                }
                }
}
if (Math.round(X1) == Y1) {
                if (Math.round(X2) == Y2) {
                                RelH = "@X";
                                if (RelH.length<Rel.length) {
                                                Rel = RelH;
                                }
                }
}