Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 2022
-
8 mai 2011 à 13:13
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 2019
-
9 mai 2011 à 15:07
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 9 mai 2011 à 15:07
« j'ai effectivement eu connaissance des algorithmes génétiques pour résoudre le cube »
A priori, la principale difficulté que je vois est de décider efficacement au cours de l'algo qu'une configuration du cube est meilleure qu'une autre.
Je vois mal comment cela peut se faire... Mais bon, je ne suis ni spécialiste du Rubik's Cube ni des algos génétiques. :)
cs_barbichette
Messages postés220Date d'inscriptionlundi 30 octobre 2000StatutMembreDernière intervention15 juillet 2013 9 mai 2011 à 13:55
@DJE_JAY: j'ai effectivement eu connaissance des algorithmes génétiques pour résoudre le cube.
Mais je n'ai pas encore compris le principe. Quand je serai grand, peut-être.
Pour la 3D, je ne voulais pas sortir la grosse grosse artillerie pour afficher 270 polygones unicolore, En sachant que c'est largement fluide comme ça... Et que mon but premier, c'était surtout de résoudre mon P..?!#~@ de cube, ou de faire de jolies figures... Et la 3D, c'était surtout pour m'aider à ne pas faire de bêtise en suivant la formule de résolution.
Je vais quand-même regarder les deux trois astuces citées plus haut... On en apprend toujours plus chaque jour...
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 9 mai 2011 à 12:27
@DJE_JAY: On va peut être éviter cela car Skynet est né grâce à un algo pour jouer super bien aux échecs et puis ça a fini avec des Terminators liquides ...
dje_jay
Messages postés58Date d'inscriptionmercredi 17 décembre 2003StatutMembreDernière intervention16 février 20112 9 mai 2011 à 12:24
Très beau projet!
Concernant l'optimisation, je ne suis pas dans le truc, mais tels que tu le décris ça me faisait penser à un "optimisateur" de BrainFuck basé sur un algo génétique...
J'ai retrouvé le lien : http://mivankovic.blogspot.com/2009/11/brainfuck-genetic-programming.html Je l'avais testé, et il était efficace. Ça éviterait certainement de faire tourner une machine durant 35ans, comme tu l'indiques... ;-)
(Si quelqu'un a le courage et la curiosité de s'y mettre...)
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 9 mai 2011 à 11:37
Salut Barbich'
comme d' hab', code très bien décomposé en plusieurs unités. J' avoue que je ne suis pas rentré dans les détails car j' ai encore des maux de tête depuis que j' ai crée le compo TcyMathParser grâce á ta source ^^
Par contre, qu' elle déception pour le rendu 3D! Je m' attendais à voir de l' openGL ou DirectX qui aurait simplifié (ou pas) le rendu.
Pour m' y être frotté il y a longtemps, ça m' aurait plu de voir un petit tutorial sur ce sujet. Enfin, faisons pas la fine bouche car les bonnes sources se font rares sur DelphiFr ...
A+
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 8 mai 2011 à 19:46
Salut Barbichette,
Il y a des moments où on regrette d'avoir jeté le vieux Rubik's Cube de son enfance sous pretexte qu'il donnait des migraines. :'(
« ATTENTION, j'en entend déjà du haut de mes Alpes qui me disent que ce n'est pas optimisé. »
J'ai dû le penser trop fort... Mais tu as quand même l'ouïe fine. ;)
Bon, je ne critique pas ton algo, mais il y a des optimisations qui devraient se faire de façon automatique, je pense.
- Au lieu d'une unité uConst, j'aurais calculé tout ça dans le FormCreate et placé les résutats dans des tableaux dynamiques. Les accès aux données seraient ensuite même plus rapide que des Const car ils s'agit de pointeurs et, de plus, ça allègerait l'exe.
- SinCos est deux fois plus rapide qu'un appel à Sin suivi d'un appel à Cos pour le même angle. Mais je note que ça t'évite d'utiliser l'unité Math.
Cependant, bien que tu n'utilises Sin et Cos qu'à un seul endroit de ton code (RotationPoint), on peut quand même remarquer que cette fonction est appelée très souvent et constitue un goulet d'étranglement.
Et il serait encore mieux d'utiliser un tableau précalculé. Exemple avec la technique du tableau dynamique :
type
TSinCos = record
Sin : Single;
Cos : Single;
end
TSinCosArray = array of TSinCos;
var
SinCosArray : TSinCosArray;
procedure PreCalcSinCosArray;
var Angle : integer;
S,C : Extended;
begin
SetLength(SinCosArray,361); //Tableau dynamique pour perf'.
for Angle := 0 to 360 do begin
SinCos(DegToRad(Angle), S, C);//Optimisable.
with SinCosArray[Angle] do begin
Sin := S;
Cos := C;
end;
end;
SinCosArray[ 90].Cos := 0; // Corrections des approximations.
SinCosArray[180].Sin := 0; // "
SinCosArray[270].Cos := 0; // "
SinCosArray[360].Sin := 0;// "
end;
Un dernier truc pas très connu et que je suis sûr que tu apprécieras et que tu sauras en tirer la substantifique moelle, c'est l'utilisation de la structure Windows XFORM et les Api's :
- SetGraphicsMode()
- SetMapMode()
- SetWorldTransform()
Je pense que tu aurais peut-être pu en tirer parti ici. Mais, de toute façon, c'est bon à connaître et j'en profite pour en parler, si tu ne connaissait pas.
Bon, encore une fois, il ne s'agit pas de critiques mais de remarques qui peuvent être utiles aux chalands.
D'autant que je suppose que ton but était plus l'algo de résolution que l'interface. ;)
Je me joins donc au concert de louanges avec un 10/10 bien mérité.
Et un grand merci !
defis91
Messages postés65Date d'inscriptionsamedi 29 octobre 2005StatutMembreDernière intervention 8 août 2011 8 mai 2011 à 16:45
Bravo Bravo !
Vue 3D magnifique
ajoute un paintbox3.refresh de Uvue3D dans Button24click de Main si le radio bouton "original" est coché.
Super programme.
Désolé, pas assez fort au Rubik's pour t'aider à optimiser l'algo de résolution.
Dom
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 8 mai 2011 à 13:13
Salut,
alors la ... !!
je dis bravo ... animations fluides, très beau rendu et pas une seule fuite de mémoire :D
Rien que pour ça et pour le travail fourni je mets un 10/10
Bien sur il y a des améliorations possibles mais il y en a qu'une que je ferais, non pas par soucis de vitesse mais par sécurité .. c'est de mettre un block "try finally end;" aux emplacements où tu crées des Bitmaps temporaires.
ex:
procedure DrawCube(P: TPaintBox; c: TRubik);
var
i,j,k: Integer;
Tmp: TBitmap;
begin
Tmp := TBitmap.Create;
try
...
finally
Tmp.Free
end;
end;
ce qui a pour effet de garantir la libération de Tmp même en cas de problèmes. ;)
9 mai 2011 à 15:07
A priori, la principale difficulté que je vois est de décider efficacement au cours de l'algo qu'une configuration du cube est meilleure qu'une autre.
Je vois mal comment cela peut se faire... Mais bon, je ne suis ni spécialiste du Rubik's Cube ni des algos génétiques. :)
9 mai 2011 à 13:55
Mais je n'ai pas encore compris le principe. Quand je serai grand, peut-être.
Pour la 3D, je ne voulais pas sortir la grosse grosse artillerie pour afficher 270 polygones unicolore, En sachant que c'est largement fluide comme ça... Et que mon but premier, c'était surtout de résoudre mon P..?!#~@ de cube, ou de faire de jolies figures... Et la 3D, c'était surtout pour m'aider à ne pas faire de bêtise en suivant la formule de résolution.
Je vais quand-même regarder les deux trois astuces citées plus haut... On en apprend toujours plus chaque jour...
9 mai 2011 à 12:27
9 mai 2011 à 12:24
Concernant l'optimisation, je ne suis pas dans le truc, mais tels que tu le décris ça me faisait penser à un "optimisateur" de BrainFuck basé sur un algo génétique...
J'ai retrouvé le lien : http://mivankovic.blogspot.com/2009/11/brainfuck-genetic-programming.html
Je l'avais testé, et il était efficace. Ça éviterait certainement de faire tourner une machine durant 35ans, comme tu l'indiques... ;-)
(Si quelqu'un a le courage et la curiosité de s'y mettre...)
9 mai 2011 à 11:37
comme d' hab', code très bien décomposé en plusieurs unités. J' avoue que je ne suis pas rentré dans les détails car j' ai encore des maux de tête depuis que j' ai crée le compo TcyMathParser grâce á ta source ^^
Par contre, qu' elle déception pour le rendu 3D! Je m' attendais à voir de l' openGL ou DirectX qui aurait simplifié (ou pas) le rendu.
Pour m' y être frotté il y a longtemps, ça m' aurait plu de voir un petit tutorial sur ce sujet. Enfin, faisons pas la fine bouche car les bonnes sources se font rares sur DelphiFr ...
A+
8 mai 2011 à 19:46
Il y a des moments où on regrette d'avoir jeté le vieux Rubik's Cube de son enfance sous pretexte qu'il donnait des migraines. :'(
« ATTENTION, j'en entend déjà du haut de mes Alpes qui me disent que ce n'est pas optimisé. »
J'ai dû le penser trop fort... Mais tu as quand même l'ouïe fine. ;)
Bon, je ne critique pas ton algo, mais il y a des optimisations qui devraient se faire de façon automatique, je pense.
- Au lieu d'une unité uConst, j'aurais calculé tout ça dans le FormCreate et placé les résutats dans des tableaux dynamiques. Les accès aux données seraient ensuite même plus rapide que des Const car ils s'agit de pointeurs et, de plus, ça allègerait l'exe.
-------------------------------------------------------------
- SinCos est deux fois plus rapide qu'un appel à Sin suivi d'un appel à Cos pour le même angle. Mais je note que ça t'évite d'utiliser l'unité Math.
Cependant, bien que tu n'utilises Sin et Cos qu'à un seul endroit de ton code (RotationPoint), on peut quand même remarquer que cette fonction est appelée très souvent et constitue un goulet d'étranglement.
Et il serait encore mieux d'utiliser un tableau précalculé. Exemple avec la technique du tableau dynamique :
type
TSinCos = record
Sin : Single;
Cos : Single;
end
TSinCosArray = array of TSinCos;
var
SinCosArray : TSinCosArray;
procedure PreCalcSinCosArray;
var Angle : integer;
S,C : Extended;
begin
SetLength(SinCosArray,361); //Tableau dynamique pour perf'.
for Angle := 0 to 360 do begin
SinCos(DegToRad(Angle), S, C);//Optimisable.
with SinCosArray[Angle] do begin
Sin := S;
Cos := C;
end;
end;
SinCosArray[ 90].Cos := 0; // Corrections des approximations.
SinCosArray[180].Sin := 0; // "
SinCosArray[270].Cos := 0; // "
SinCosArray[360].Sin := 0;// "
end;
---------------------------------------------------------------------------------------------
Un dernier truc pas très connu et que je suis sûr que tu apprécieras et que tu sauras en tirer la substantifique moelle, c'est l'utilisation de la structure Windows XFORM et les Api's :
- SetGraphicsMode()
- SetMapMode()
- SetWorldTransform()
Je pense que tu aurais peut-être pu en tirer parti ici. Mais, de toute façon, c'est bon à connaître et j'en profite pour en parler, si tu ne connaissait pas.
-------------------------------------------------------------------------------------------
Bon, encore une fois, il ne s'agit pas de critiques mais de remarques qui peuvent être utiles aux chalands.
D'autant que je suppose que ton but était plus l'algo de résolution que l'interface. ;)
Je me joins donc au concert de louanges avec un 10/10 bien mérité.
Et un grand merci !
8 mai 2011 à 16:45
Vue 3D magnifique
ajoute un paintbox3.refresh de Uvue3D dans Button24click de Main si le radio bouton "original" est coché.
Super programme.
Désolé, pas assez fort au Rubik's pour t'aider à optimiser l'algo de résolution.
Dom
8 mai 2011 à 13:13
alors la ... !!
je dis bravo ... animations fluides, très beau rendu et pas une seule fuite de mémoire :D
Rien que pour ça et pour le travail fourni je mets un 10/10
Bien sur il y a des améliorations possibles mais il y en a qu'une que je ferais, non pas par soucis de vitesse mais par sécurité .. c'est de mettre un block "try finally end;" aux emplacements où tu crées des Bitmaps temporaires.
ex:
procedure DrawCube(P: TPaintBox; c: TRubik);
var
i,j,k: Integer;
Tmp: TBitmap;
begin
Tmp := TBitmap.Create;
try
...
finally
Tmp.Free
end;
end;
ce qui a pour effet de garantir la libération de Tmp même en cas de problèmes. ;)
Encore Bravo.
@++
Cirec