Organiser des défis/exercices de programmation

a marqué ce sujet comme résolu.

Ça me parait pas mal. Donc ce serait 1 défi par mois à partir de la rentrée. J'étais aussi en train de me questionner sur le format le plus approprié.

Si on utilise le forum, il y a deux grandes possibilités :

  • un seul et même topic où sont regroupés tout le défis. Le désavantage de cette solution c'est qu'après quelques mois, le topic risque de devenir assez long, donc plus difficile de s'y retrouver.

  • ou alors, un sujet pour chaque défi. Ça permettra de ne pas mélanger les discussions, et de pouvoir continuer à en parler même après la date limite d'un mois. Pour permettre de s'y retrouver, il faudrait créer un topic qui regroupe les liens vers tous les défis.

Perso, je pencherais vers la deuxième solution.

Oui la deuxième est beaucoup mieux. Ça permettra en plus aux nouveaux de participer aux vieux défi sans polluer la conversation sur les derniers.

Après le meta topic qui les regroupe peut n'être fait que plus tard, quand il y en aura déjà 2-3 de lancé.

La deuxième idée me paraît pas mal non plus.

Au niveau du format je propose de reprendre le format "classique" : pas de gros logiciels nécessitant des bibliothèques particulières donc, mais pas non plus de "petites" fonctions utilitaires.

On essaie de rester à mi-chemin entre les deux, genre format TD-académique.

Voici les problèmes déjà existant sur le forum qui à mon avis pourraient convenir :

Il y en a sûrement quelques autres, mais vous voyez l'idée.

Je pense justement que ces problèmes sont trop gros pour quelqu'un qui veut juste faire un petit truc pour s'amuser. Ces exos demandent de passer tout de même 2-3 heures (à minima). Aujourd'hui le gens cherchent plutôt des choses rapides. En tout cas pour des exercices sur un mois, je pense qu'il faut favoriser les petits défis que les gros. Mais ça n'empêche pas de faire un gros défi par trimestre par exemple.

@Ricocotam : bien que je rejoins ta remarque sur le fait que les exercices exhibés par Algue-Rythme sont longs, je ne suis pas entièrement d'accord avec la séparation que tu proposes.

Pour certains exercices, ce n'est pas très compliqué d'avoir des questions préliminaires et ensuite d'avoir des questions qui demandent un peu plus de recherche.

Par exemple si l'exercice demande de faire un solveur de sudoku, on peut prévoir d'abord des questions du facile genre :

1) Inventer une structure de données pour représenter le Sudoku en mémoire 2) Créer une fonction qui permet de vérifié sur une grille complète est un sudoku valide

Puis faire quelque chose d'intéressant :

3) Implémenter le backtracking de Yoch

Et enfin des trucs un peu plus poussés :

4) Utiliser un algorithme génétique pour résoudre un Sudoku ( question que l'on peut décomposer en plusieurs sous questions )

5) Comparer les deux méthodes backtracking/algorithmes génétiques

Bref, ce que je veux dire c'est que les questions 1 à 2 sont rapides à implémenter, la question 3 un peu moins même si on a l'algorithme. Et pour les questions 4 à 5, ça demande un peu plus d'investissement. Donc à mon avis, c'est pas incompatible. De la même façon, pour les exercices qui ont été présenté par Algue-Rythme, il est pas trop difficile de trouver une décomposition en questions plus petites.

+1 -0

Il faut trouver un juste milieu. Si on a gros défi, mais que celui-ci est décomposé correctement en plusieurs étapes successives, je ne pense pas qu'il y aura de problèmes. On parle quand même d'une durée d'un mois.

De toutes façons, je pense que le meilleur moyen de savoir si c'est la bonne formule ou pas, c'est de tester. On peut donc déjà commencer à préparer des défis en off, pour pourvoir les lancer à la rentrée.

Après, il faut encore une chose : une personne qui coordonne les défis. Chacun ne peut pas publier son défi (dans le cadre des Défis de Clem) n'importe comment, quand il le souhaite. Comme ça, ça permettrait que ce ne soit pas une seule et unique personne qui créé les défis. Toute la communauté peut participer. Je veux bien créer une liste avec les défis que chacun voudrait mettre en place. On pourrait alors avoir un premier aperçu.

Et enfin des trucs un peu plus poussés :

4) Utiliser un algorithme génétique pour résoudre un Sudoku ( question que l'on peut décomposer en plusieurs sous questions )

5) Comparer les deux méthodes backtracking/algorithmes génétiques

Saroupille

Je serais curieux de voir ce que donnerait un algo génétique sur un problème de sudoku (en général les algos génétiques sont faits pour les problèmes d'optimisation; après, ça n'empêche pas de modéliser un sudoku comme un problème d'optimisation, justement).

Sinon, pour le sudoku, il y a des tas d'autres possibilités assez fun : Dancing links, SAT solver, programmation linéaire sur entiers, etc.

Je serais curieux de voir ce que donnerait un algo génétique sur un problème de sudoku (en général les algos génétiques sont faits pour les problèmes d'optimisation; après, ça n'empêche pas de modéliser un sudoku comme un problème d'optimisation, justement).

En théorie ça irait, on se sert également beaucoup des algorithmes génétiques pour les problèmes NP-complets (le voyageur de commerce et le problème du sac à dos en sont l'exemple canonique), et le sudoku en est un (d'où l'efficacité du backtrack et des SAT-solver dessus).
En pratique ce serait moins bon que le backtrack, puisqu'on utilise généralement les algos génétiques pour une solution approchée lorsque l'espace de recherche est trop grand. Là ça n'irait pas car : 1) l'espace de recherche est relativement réduit 2) une solution approchée n'est pas intéressante, seules les grilles valides présentent un intérêt.
Le gros défit de l'algo génétique sur ce problème serait d'assurer que la solution exacte soit trouvée avant la convergence de l'algo, ce que je vois dur à faire sans 1) une grosse population 2) une faible pression de sélection. Et là le temps de calcul explose…

+0 -0

En pratique ce serait moins bon que le backtrack, puisqu'on utilise généralement les algos génétiques pour une solution approchée lorsque l'espace de recherche est trop grand. Là ça n'irait pas car : 1) l'espace de recherche est relativement réduit 2) une solution approchée n'est pas intéressante, seules les grilles valides présentent un intérêt.

Algue-Rythme

C'est bien ce que j'ai dit ci-dessus: le sudoku n'est pas un problème d'optimisation. Et effectivement, même en le modélisant tel quel, seule la solution optimale (ie. celle qui satisfait les contraintes) est intéressante.

1) une grosse population 2) une faible pression de sélection. Et là le temps de calcul explose…

Algue-Rythme

Les grosses populations sur les algorithmes genetiques sont toujours ou presque des mauvaises idees et degradent les resultats. Tu peux faire des petits benchmarks avec des logiciels d'optimisation de parametres hors ligne type ParamILS et sinon lire quelques articles sur les tailles optimales de population.

Quand a la selection, aujourd'hui a plutot tendance a avoir des paramteres auto-adaptatifs qui permettent de jouer sur les mecanismes elitistes au cours du temps et sortir des convergences prematurees.

Le probleme du Sudoku etant assez simple, ca ne m'etonnerait pas de trouver des solutions admissibles pour le probleme initial (aka une grille bien remplie) sans trop de difficulte sur des tailles raisonnables.

@yoch, tu peux tout a fait mettre le sudoko sous forme de probleme d'optimisation sans aucun soucis. Au contraire cela s'y prette tres bien. C'est plutot les methodes d'optimisation approchee qui ne sont surement pas tres pertinente.

+0 -0

Les grosses populations sur les algorithmes genetiques sont toujours ou presque des mauvaises idees et degradent les resultats.

J'avais vu un cours qui disait que c'était un moyen efficace de maximiser la diversité, et que c'était celui à privilégier lorsque l'algorithme convergeait prématurément. Mes expériences sur EternityII m'ont mené à la conclusion qu'une population de 10 000 individus sur 2000 générations était ce qu'il y avait de mieux (mon protocole n'était pas formel : c'était des tests avec différents paramètres). Ce n'est pas ce que j'appelle une "petite" population, mais tout est relatif.

+0 -0

Il y a un compromis a faire en realite.

Lorsque tu augmentes la taille de la population, la population initiale a plus de chance de porter des chromosomes qui peuvent mener a la solution optimale. La contre-partie est que l'iteration prend plus de temps.
A contrario, une population plus faible, permet de realiser plus de generations et donc d'exploiter au mieux les mecanismes evolutifs (si ceux-ci sont absents, par exemple peu d'iterations et surtout pas d'elitisme, alors ton algorithme est plus proche d'une pure marche aleatoire).

Dans l'absolu, en faisant tendre vers l'infini la taille de la population, je peux obtenir la solution optimale en 1 generation. Pour autant je peux attendre assez longtemps. :p

Je n'ai jamais vu aucune application reelle avec des tailles superieure a 10000. Sur des problemes bien plus complexes que celui que tu donnes, avec des tailles de 20 a 100 on trouve les meilleurs resultats et c'est generalement une plage qui revient dans la plupart des appli' et articles.

Je viens aussi de regarder le probleme que tu donnes et je me demandais quelle etait ton critere d'evaluation pour evaluer la qualite d'un parametre ? A priori il n'y a meme pas de solution connue donc ca me parait dur de parler en iterations et taille de population alors qu'il faudrait parler en temps CPU (comme je le disais augmenter la taille de la population accroit le temps d'une iteration).

EDIT: Peut etre un autre sujet ou MP parce que c'est un peu HS.

+0 -0

Bonsoir à tous,

Je viens aux nouvelles concernant ces défis de Clem. Bon, le fait que ce soit les vacances ne facilite peut-être pas l'organisation. On a évoqué plus haut l'idée d'un gros topic qui regrouperait la liste des tous les défis de Clem ayant été publiés.

Mais concernant l'organisation, il faudrait également une liste mise à jour régulièrement des défis à venir. Globalement, je vois ça comme ça :

  • Défi n°1 (mois de Septembre) -> Jeux du Sudokus par Monsieur X

  • Défi n°2 (mois d'Octobre) -> Interpréteur brainfuck par Monsieur Y

  • etc…

Dans le but de tout regrouper et de faciliter la navigation/organisation, je pense qu'il ne serait pas plus mal que la liste des défis publiés et celle de défis à venir se trouvent sur le même gros topic. Il suffirait alors simplement de poster un message ou envoyer un MP pour signaler que l'on souhaiterait rédiger un défi.

Si on part sur cette idée, il faudrait alors créer ce topic. Mais avant de faire quoique soit, je préfère vous consulter et avoir votre avis.

Banni

Très léger apparté : en français, contrairement à l'anglais, les noms de mois ne prennent pas de majuscule. Je t'en parle car j'ai vu que t'as ouvert un sujet dans le forum Programmation à propos de ces défis, donc si tu organises la chose (je t'ai mis un pouce vert), autant que ça soit bien écrit :) .

autant que ça soit bien écrit

Tout à fait, merci de la remarque, ce sera corrigé ! Vu que je peux éditer à tout moment le message de présentation du topic, n'hésitez pas si vous avez des remarques/suggestions, afin de proposer un texte d'une qualité optimale ^^

Bonsoir,

Un domaine intéressant pour des défis, c'est forcément le domaine des jeux de réflexion. Même si effectivement, il faudrait aussi des défis dans d'autres domaines.

Voici un site avec quelques jeux de réflexions pas vraiment 'sexy/grand public' : http://www.chiark.greenend.org.uk/~sgtatham/puzzles/

Tous les jeux pourraient faire l'objet de 2 défis.

Défi n°1 : Solutionner une grille.

Défi n°2 : générer aléatoirement une grille avec une seule solution.

Et si je devais suggérer un jeu parmi cette liste, je choisirais RANGE.

Salut tout le monde,

Je tombe sur le sujet que maintenant, en tout cas, je suis à 100 % sur l'idée, vous avez mon soutien :D

Ensuite, je vais quand même mettre mon grain de sel dans le pot-au-feu : une idée bateau pour "décomposer" un exercice en différents niveaux, c'est de détailler certains outils fondamentaux pour la réalisation du "gros" atelier. J'ai malheureusement pas d'exemple qui me viennent là maintenant, mais j'espère que vous voyez où je veux en venir. :lol:

Du coup j'appuie Richou D. Degenne pour les outils : prenons quelque chose que je connais bien, mon sujet de TIPE, "Comment minimiser la taille d'un circuit logique constitué en deux étages ET/OU (que l'on peut changer en ce qu'on veut du moment que c'est complet, ici c'est simplement que l'on a des fonctions booléennes que l'on écrit sous la forme canonique disjonctive), qui ferait d'ailleurs un bon exercice vraiment varié si l'on prend le temps de mettre des étapes très simplifiée, et s'il était possible de le faire en moins de temps (et peut être aussi s'il était plus attrayant du premier coup !).

La première chose que l'on peut tenter de faire, c'est de réduire des circuits avec une seule sortie, c'est-à-dire dont la sortie s'écrit comme une fonction booléenne des entrées. Ici on peut faire des liens avec le tutoriel d'architecture matériel, avec notamment la partie sur les circuits logiques (non séquentiels), la méthode de Karnaugh, et le but serait de faire comprendre le problème d'une autre manière qui est plus "générale". Ce lien peut ensuite mener à des tutoriels d'algorithmies sur des problèmes NP-Complet ou vers des méta-heuristiques selon le choix de l'utilisateur.

Une fois cette étape faite, on sait résoudre le problème pour un circuit à une entrée, et il faut pouvoir généraliser ça à n'importe quel circuit. C'est là qu'on rajoute (éventuellement sans que ce soit tout cuit) encore d'autres outils théoriques comme les fonctions caractéristiques d'un circuit (fonction booléenne de variables les entrées et les sorties) qui permettent de se ramener au cas précédent, et que l'on cherche à améliorer la vitesse et la précision des algorithmes en cherchant des propriétés supplémentaires dans le problème, pour servir de cas de base.

Enfin, selon ce qui a été choisi par l'utilisateur, on peut essayer de le mener vers d'autres exercices qui sont dans la même continuation : un utilisateur qui a utilisé des algorithmes génétiques se verra poussé vers un certain exercice de planification de trafic aérien, un utilisateur qui a seulement utilisé les propriétés algébriques du problème pourra être poussé vers des exercices sur des graphes ou des arbres de décision, etc.

Le gros intérêt de ces gros exercices que l'on découpe en fournissant des outils sur le chemin (là encore, le mieux serait vraiment de ne pas donner du tout cuit mais de réussir à le faire trouver, de façon guidée ou non), c'est que l'on va pouvoir faire beaucoup de liens entre les problèmes, et même avec les tutoriels, tout en donnant donnant une certaine connaissance appliquée à quelque chose de concret. Maintenant, il reste à voir si c'est possible de faire ça de façon pédagogique facilement.

+1 -0

Le principe tel qu'emeric semble proposer serait d'avoir un défi par mois. L'idéal serait de commencer en Septembre.

Une autre idée serait d'instauré un petit comité de quelques personnes qui choisissent parmi les propositions de sujet un pour le mois à venir.

Si j'ai bien compris, le comité est entrain de se former pour le moment.

Cependant, il va falloir avoir au moins une proposition rédigée pour le mois de Septembre. Donc si vous avez des propositions, je pense que vous pouvez contacter Emeric en attendant qu'un comité soit formé.

Cependant, je pense qu'une proposition doit être accompagnée d'une correction qui ne peut-être que partielle. La raison à mon sens est double :

  • S'assurer de la faisabilité du défi et avoir une idée de sa complexité
  • Avoir une base qui permettra de fournir une correction

Une idée, à voir si les gens sont d'accord serait de proposer une correction après que le défi soit terminé. Correction qui serait écrite par ce même comité (qui pourra être aidé, par l'auteur du défi par exemple).

Donc la première chose à mettre en place serait ce comité qui a mon avis devrait pas réunir plus de quelques personnes. Puis, décider d'une quelconque manière d'un responsable qui prendra en charge les demandes.

Ensuite, si des gens ont des propositions ce sera plus facile de les réunir. Cependant, rien n'empêche une personne de faire une proposition sérieuse sur ce topic (quelque chose d'un minimum rédigé).

Cependant, il va falloir avoir au moins une proposition rédigée pour le mois de Septembre. Donc si vous avez des propositions, je pense que vous pouvez contacter Emeric

C'est ça. Pour le moment, on a beaucoup d'idées (et c'est une bonne chose !), mais pas de défi réellement construit et rédigé. Donc si vous avez une idée en tête, n'hésitez pas à la rédigez et à me la faire parvenir, de manière à pouvoir s'organiser pour le mois prochain.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte