Permalink
Browse files

les oranges

  • Loading branch information...
sdpython committed Mar 25, 2015
1 parent c3e8288 commit 1837c6a8240e8df895257d1f522a54dd35f074d4

Large diffs are not rendered by default.

Oops, something went wrong.
@@ -36,6 +36,7 @@ Sujets
tri
tsp
orange
demineur
sacados
@@ -50,6 +51,7 @@ Indices et solutions
tri_solution
tsp_solution
orange_solution
demineur_solution
sacados_solution
notions
@@ -0,0 +1,62 @@
.. issue.
.. index:: énoncé, algorithme, orange, tri
.. _l-algo_orange:
Le jeu des oranages
===================
A partir de 7-8 ans (mais ce n'est qu'une indication).
C'est un petit jeu où il faut être inventif
pour construire la méthode qui aboutit à la solution.
Mise en scène
-------------
Cinq enfants sont placés autour d'un cercle.
Chacun a un numéro.
Il y a neuf orange numérotées, deux numéros 1, deux 2, deux 3, deux 4, un numéro 5.
Au début chaque enfant prend deux oranges au hasard dans chaque main sauf le dernier.
Règle :
A chaque tour, seul l'enfant qui a une main vide peut recevoir une orange
d'un de ses deux voisins.
Seul l'enfant qui a une main vide peut changer son orange de main.
Objectif :
A la fin du jeu, chaque enfant doit avoir dans ses mains
les oranges portant son numéro.
Indices
-------
Il faut que chaque enfant se tienne de profil et représenter le problème
comme deux cercles d'oranges dont l'un est incomplet.
.. image:: orange1.png
Solution
--------
Voir :ref:`l-algo_orange_sol`.
A quoi ça sert ?
----------------
Connaissez-vous le `Rubik's cube <http://fr.wikipedia.org/wiki/Rubik%27s_Cube>`_ ?
Si les deux jeux ne sont pas vraiment reliés, cela permet de comprendre
que pour réussir, il faut parfois en apparence défaire ce qui a été fait.
Binary file not shown.
@@ -69,12 +69,19 @@ On remet à tous les enfants sauf un une carte et deux fils de laine : un rouge
.. image:: tri2.png
**Q1 :**
Il existe une façon pour le dernier enfant de ramasser simplement
toutes les cartes dans le bon ordre. Saurez-vous la trouver ?
Il s'agit dans ce dernier cas du `tri par arbre <http://rmdiscala.developpez.com/cours/LesChapitres.html/Cours4/TArbrechap4.6.htm>`_.
**Q2 :**
Comment cherche-t-on un mot dans un dictionnaire ? Combien ouvre-t-on de pages avant
de trouver son mot ?
Solution
--------
@@ -84,3 +91,10 @@ Voir :ref:`l-algo_tri_sol`.
A quoi ça sert ?
----------------
On se sert souvent du tri, surtout que tout est trié.
A la bibliothèque, tout semble bien ordonné.
Les papiers administratif sont rangés par date, les devoirs
sont triés par notes, les mots du dictionnaire sont triés
sinon il serait quasiment impossible de les retrouver.
Le tri sert à retrouver facilement les choses triées.
@@ -35,7 +35,7 @@ Quelques algorithmes :
* :ref:`l-algo_tri`
* :ref:`l-algo_tsp`
* les oranges
* :ref:`l-algo_orange`
* :ref:`l-algo_demineur`
* :ref:`l-algo_sacados`
@@ -55,6 +55,7 @@ Solutions
* :ref:`l-algo_tri_sol`
* :ref:`l-algo_tsp_sol`
* :ref:`l-algo_orange_sol`
* :ref:`l-algo_demineur_sol`
* :ref:`l-algo_sacados_sol`
* :ref:`l-donnes_cantine_sol`
@@ -40,14 +40,32 @@ def permutation(points, i, j):
@param points circuit
@param i first index
@param j second index
@param j second index (< len(points))
@return new circuit
"""
points = points.copy()
points[i], points[j] = points[j], points[i]
return points
def reverse(points, i, j):
"""
reverse a sub part of circuit
@param points circuit
@param i first index
@param j second index (<= len(points))
@return new circuit
"""
points = points.copy()
if i > j:
i, j = j, i
c = points[i:j]
c.reverse()
points[i:j] = c
return points
def voyageur_commerce_simple(points):
"""
solves the TSP using basic permutations,
@@ -62,7 +80,9 @@ def voyageur_commerce_simple(points):
while dnew < d0 or first:
first = False
d0 = dnew
for i in range(len(points) * 2):
# first pass : random
for i in range(len(points)):
h1 = random.randint(0, n)
h2 = random.randint(0, n)
p = permutation(points, h1, h2)
@@ -71,11 +91,22 @@ def voyageur_commerce_simple(points):
dnew = d
points = p
p = permutation(points, len(points) - 1, 0)
d = distance_circuit(p)
if d < dnew:
dnew = d
points = p
h1 = random.randint(0, n)
h2 = random.randint(h1 + 1, n + 1)
p = reverse(points, h1, h2)
d = distance_circuit(p)
if d < dnew:
dnew = d
points = p
# second pass : no reverse
for i in range(len(points)):
for j in range(i + 1, len(points) + 1):
p = reverse(points, i, j)
d = distance_circuit(p)
if d < dnew:
dnew = d
points = p
return points

0 comments on commit 1837c6a

Please sign in to comment.