Académique Documents
Professionnel Documents
Culture Documents
Sujets proposés
Travail attendu
Références
Sujets proposés
Algorithmes de trading
Data en folie
Algorithmes génétiques, Fourmis
Jeux de réflexion
Jeux de cartes
Jeux de réflexion qui se jouent seul
Jeux mathématiques
Machine Learning
Sécurité, Cryptographie
Automatisation, Objets connectés, Reconnaissance
Simulations économiques, sociales
Liste exhaustive :
ML algo : Ecrire une librairie pour représenter des modèles de machine learning
(2018)
Jeu 1 : 2048
ML : Twitter
Jeu 2 : Awalé
Jeu 2 : Echec
Jeu 2 : Go
Jeu 2 : Gomoku
Jeu 2 : Othello
Jeu 2 : Puissance 4
Algo : Pentomino
Algo : Détection de période dans les séquences qui préservent l’ordre (2018)
Travail attendu
Le projet dure quatre mois au second semestre (de février à mai). Il se conclut par
un programme et un rapport. Une soutenance suit mi-juin. Le rapport doit souligner
la contribution originale des élèves, illuster les résultats numériques obtenus et
la façon dont ils ont été obtenus. On suppose que le rapport s’adresse à un public
expert. La soutenance doit reprendre les points principaux, décrire brièvement la
façon dont le travail a été réparti au sein de l’équipe.
Chaque projet, quelque soit le sujet, devra comporter une composante numérique
(statistique, économique, financière, …), que ce soit une stratégie de trading,
l’optimisation d’une intelligence artificielle pour un jeu, une simulation
économique. Cet aspect devra ressortir lors de la rédaction du rapport final qui
devra exposer les résultats numériques obtenus et faire au moins une ou deux
allusions à la façon dont ces calculs ont été implémentés. Le rapport doit contenir
les éléments suivants :
description d’une difficulté qui vous a fait perdre beaucoup de temps (hors
celles liées à votre apprentissage de la programmation)
Le code rendu doit contenir au moins un test unitaire. Voir 1A.soft Tests
unitaires, setup et ingéniérie logiciel (correction).
Ces remarques sont plus un guide qu’un plan précis. Je vous encourage à voir cet
extrait de film bien connu The Pirate code.
D’une manière générale, il faut penser un rapport comme un document qui se lie
consciencieusement une fois puis qui se relie plusieurs fois rapidement pour
retrouver ce qu’on cherche, cela veut dire des graphiques complets lisibles sans
trop de contexte, une conclusion explicite qui rappelle les résultats et le
contexte d’exploitation de ceux-ci.
Que faut-il en attendre ?
Vous serez plus autonome. Vous n’aurez plus l’assurance qu’une solution existe ni
même quelqu’un qui vous donnera la réponse tout de suite si vous ne trouvez pas.
Vous devrez parfois vous interroger sur les résultats numériques que vous avez
obtenus et qui sont si loin de votre intuition qu’ils cachent sans doute une erreur
d’implémentation. Vous devrez vous-même définir le problème et y répondre. Cela
veut dire parfois aussi faire un compromis entre ce que vous rêvez de faire et le
temps que vous avez pour le faire. Si vous travailler à deux, vous découvrirez
qu’il n’est pas toujours évident de se synchroniser. Heureusement, les outils ont
beaucoup progressé ces dix dernières années. Un projet informatique s’effectue le
plus souvent sur le long terme. Vous verrez que si on fait une pause de quelques
semaines dans un projet, on oublie beaucoup de petits détails qu’on redécouvre aux
détours d’une exception. Mais là encore, il existe des solutions. Le plus important
sans doute, programmer veut aussi dire être créatif. Pour finir, voici ce qu’en ont
retiré les élèves de première année en 2015 : Extraits des projets informatiques de
première année à l’ENSAE en 2015.
Références
Articles de blogs
Resources
données
Source de données.
bibliographie
Ce ne sont pas à proprement parler des erreurs car elles n’altèrent pas l’exécution
du programme. Toutefois elles le rendent plus difficile à lire et à corriger en cas
d’une vraie erreur. La plupart des développeurs les font lorsqu’ils apprennent à
programmer et ne les font plus par la suite.
Pour éviter l’envoi continu de mail entre deux membres du même groupe, le meilleur
recours est l’emploi d’un logiciel de suivi de source. GitHub est une possibilité.
C’est celle que j’utilise pour développer ce cours : sdpython/ensae_teaching_cs.
Cela permet de suivre les modifications (un commit), ou de revenir en arrière.
if joueur == 1 :
next_joueur = 2
proba_1[eta_succ[U-1]]=1
proba_2[eta_succ[U-1]]=0
proba_2[eta_succ[U-2]]=0
proba_1[sym(eta_succ[U-1])]=1
proba_2[sym(eta_succ[U-1])]=0
proba_2[sym(eta_succ[U-2])]=0
else :
next_joueur = 1
proba_2[eta_succ[U-1]]=1
proba_1[eta_succ[U-1]]=0
proba_1[eta_succ[U-2]]=0
proba_2[sym(eta_succ[U-1])]=1
proba_1[sym(eta_succ[U-1])]=0
proba_1[sym(eta_succ[U-2])]=0
Ceci est à éviter le plus possible. Cela allonge inutilement les programmes mais
surtout cela oblige développeur à répercuter une modification sur tous les blocs
recopiés. Et on se trompe souvent. Dans ce cas précis, il est facile d’écrire
if joueur == 1 :
pr1,pr2 = proba_1,proba_2
else :
pr1,pr2 = proba_2,proba_1
next_joueur = 3 - next_joueur
pr1[eta_succ[U-1]]=1
pr2[eta_succ[U-1]]=0
pr2[eta_succ[U-2]]=0
pr1[sym(eta_succ[U-1])]=1
pr2[sym(eta_succ[U-1])]=0
pr2[sym(eta_succ[U-2])]=0
next_joueur = 3 - next_joueur
eu_1 = eta_succ[U-1]
seu_1 = sym(eta_succ[U-1])
pr1[eu_1]=1
pr2[eu_1]=0
pr2[eta_succ[U-2]]=0
pr1[seu_1]=1
pr2[seu_1]=0
pr2[sym(eta_succ[U-2])]=0
Ce choix simple peut devenir ennuyeux par la suite lorsqu’on souhaite faire tourner
plusieurs le même programme en changeant ces variables globales. Pour éviter cela,
le plus simple est de créer une classes qui les contient toutes et de passer une
instance de cette classe à chaque fonction qui en a besoin
class VariablesGlobales :
def __init__(self):
self.epsilon = 0.01
self.alpha = 0.5
self.iter = 1000
# ...
variable = VariablesGlobales ()
if if if if
if x == 1:
r = 0
if x == 2:
r = 1
Le second if porte sur une condition qui n’a aucune chance d’être vérifiée si la
première l’est. Il faut utiliser elif.
if x == 1:
r = 0
elif x == 2:
r = 1
def deux_meilleures_options(l):
l.sort()
return l[0:2]
Trier toute une liste pour n’extraire que deux éléments est plus coûteux que
nécessaire même si c’est simple à coder.
def deux_meilleures_options(l):
ens = ((v, i) for i, v in enumerate(l))
return min(ens)[0], min(ens[1:])[0]
def mean_vector(x):
return sum(x) / len(x)
Le test appelle deux fois la fonction mean_vector avec les mêmes paramètres. Le
résultat sera forcément identique.
def mean_vector(x):
return sum(x) / len(x)
v = mean_vector(x)
if v[0] < v[1]:
# ...
deepcopy inutile
def enumerate_transposition(li):
for i in range(1, len(li)):
cl = copy.deepcopy(li)
cl[0], cl[i] = li[i], li[0]
yield cl
Est-il vraiment nécessaire de faire une copie la liste ? Autant ne pas le faire et
l’indiquer dans la documentation.
def enumerate_transposition(li):
"""
the function does not return a copy,
do not modify the returned list
"""
for i in range(1, len(li)):
li[0], li[i] = li[i], li[0]
yield li
li[0], li[i] = li[i], li[0]
langue
Lorsqu’on fait un projet de la sorte, il arrive souvent qu’on jette du code qu’on a
écrit. On découvre parfois que le programme tel qu’il est conçu ne permet pas de
faire tel ou tel chose, il faut en réécrire une partie. On écrit parfois du code
jetable lorsqu’on a besoin d’un résultat numérique. Une fois celui-ci obtenu, on
l’intègre au programme et on jette le code qui a permis de l’obtenu.
C’est parfois utile dans votre rapport de décrire ces codes jetés. Dans le premier
cas, le code jeté sert de justification au nouveau. Dans le second cas, cela
rassure de voir que certains résultats ne sortent pas de nulle part.
Qu’avez-vous appris ?
Mais ce projet demande aussi une part d’imagination, que ce soit pour concevoir une
fonction d’évaluation pour une intelligence artificielle, une simulation économique
réaliste, une stratégie financière… Tout au long de la mise en place de ses idées,
on s’aperçoit que les premiers jets sont parfois un peu naïf, que les premiers
résultats numériques ne sont pas aussi bons qu’escomptés. Il faut retravailler
l’idée initiale. Cette partie doit ressortir dans votre rapport et elle doit bien
ressortir.
Expliquer les choses, les illustrer, choisir le bon graphique, le bon tableau, pour
défendre une idée n’est pas toujours simple. Il faut parfois imaginer qu’un rapport
sera lu deux fois, une fois en diagonale, une autre plus sérieusement.
Il faut se poser la question de savoir ce que vous voulez que le lecteur retienne.
Un programme informatique est d’autant plus difficile à cerner qu’il est long. Le
rapport est la version la plus accessible de votre travail. C’est le point de
départ. A partir de là, on navigue plus aisément dans votre programme.
La phrase suivante est librement inspirée d’un rapport à propos d’un jeu :
De cette phrase, je comprends que certains paramètres ont été optimisés mais le
rapport ne revient jamais sur cet aspect. Donc :
Je ne sais pas quels sont ces paramètres, je n’ai aucune idée des résultats
obtenus, ni même que la différence de niveau entre les bons paramètres et les
mauvais.
Les copies d’écran est indispensable pour une interface graphique ou un site web.
Le résultats de vos algorithmes doit être illustrés sur au moins un exemple qui
fonctionne et, si cela a du sens, un autre qui ne fonctionne pas.
Imprécision
Je paraphrase :
On a comparé les deux intelligences artificielles en jouant contre elles, la
seconde est meilleure.
Et en chiffres ?
Maladresses lors de la soutenance
Il faut partir du principe que la soutenance s’adresse à un public non expert qui
n’a probablement pas lu votre rapport. Selon ce critère, suivre le même plan que le
rapport ne devrait sans doute pas poser de problème. Un bémol : en suivant le même
plan que le rapport, on a parfois tendance à reproduire le même discours sans
vraiment chercher à l’adapter à ce moyen d’expression.
Tout dire
La soutenance est courte et impose souvent de faire un tri sur tout ce que vous
voulez présenter. Le plus souvent, l’auditoire n’est pas un expert et quand bien
même il le serait, la plupart des présentations abordent des sujets complexes qu’il
est difficile d’appréhender en quelques minutes. Vous n’avez pas l’occasion de
démontrer la pertinence des résultats, il y a toujours une forme de confiance qui
s’établit entre celui qui expose et celui qui écoute. Car à la fin, pour les
derniers résultats, les plus intéressants, le public n’a pas d’autres choix que de
croire celui qui les énonce. Il est impossible de les vérifier sur le moment.
Déduction rapide