# This Pluto notebook uses @bind for interactivity. When running this notebook outside of Pluto, the following 'mock version' of @bind gives bound variables a default value (instead of an error).
function _assign(config::Config,mask,col,value::Bool)
libre=_assign(config.libre,mask,col)
ifvalue
player=_assign(config.player,mask,col)
else
player=config.player
end
returnConfig(libre,player,config.max)
end
function _assign(mat::Matrix,row,col,value)
mat[row,col]=value
returnmat
end
_unassign(::StaticArrays.SMatrix,_,_)=nothing
_unassign(::Config,_,_)=nothing
function _unassign(mat::Matrix,row,col)
mat[row,col]=0
return
end
_copy(m::StaticArrays.SMatrix)=m
_copy(m::Config)=m
_copy(m::Matrix)=copy(m)
end
# ╔═╡ faca26cb-14a3-4a45-ba0b-ec3cd57d8d29
HAlign(md"""
Est-il possible de prendre tous les ponts de la ville une et une seule fois (le point de départ est au choix) ?
""",
img("Konigsberg_bridges"))
# ╔═╡ b65dd471-10da-4b3a-a14b-cfbb70e70050
frametitle("Définition")
# ╔═╡ 8bec0324-274c-4ae6-99f9-08b613460064
md"""
Un graph a un ensemble ``V`` de noeuds (nodes) / sommets (vertices) et ``E`` d'arêtes (edges) / arcs.
...
...
@@ -37,20 +497,6 @@ Un graph a un ensemble ``V`` de noeuds (nodes) / sommets (vertices) et ``E`` d'a
Le graphe du problème de Königsberg test:
"""
# ╔═╡ d7bbc61f-5cc6-4090-8cc4-313187f28bab
let
g=Graph(4)
add_edge!(g,1,2)
add_edge!(g,1,4)
add_edge!(g,2,3)
add_edge!(g,2,4)
add_edge!(g,3,4)
gplot(g,edgelabel=[1,2,1,1,2])
end
# ╔═╡ b52b2192-df63-4095-aa15-6d3ccafc92ba
frametitle("Graphes et polyhèdres")
# ╔═╡ c87e1a66-62e6-41aa-bcc0-fb1704d7e259
md"""
Prenons un polyhèdre, où se cache le graphe ?
...
...
@@ -69,9 +515,6 @@ md"""
``.
"""
# ╔═╡ e41498fa-8fed-4354-bb3b-a2fc8afeacd9
frametitle("Terminologie des parcours")
# ╔═╡ 27ee39a0-0eb2-42dc-bf90-eb2fa0d7497e
md"""
Un parcours / walk de longueur ``k`` d'un graphe ``G = (V, E)`` est une suite de ``k+1`` noeuds ``v_0, v_1, \ldots, v_k \in V`` et ``k`` arêtes ``(v_0, v_1), (v_1, v_2), \ldots, (v_{k-1}, v_k) \in E``.
...
...
@@ -85,50 +528,16 @@ Si ``v_0 = v_k``, le parcours est fermé.
Piste (resp. circuit) *Eulérienne* : Une piste (resp. circuit) qui visite **toutes** les arêtes.
"""
# ╔═╡ c41901fb-6570-487d-bd77-4708d1f0b627
frametitle("Degré d'un noeud")
# ╔═╡ ff87b1bb-7903-4954-8e7a-f377aef97b2d
md"""
Le degré d'un noeud ``v`` est le nombre d'arête qui lui sont incidentes.
Une composante connexe ``C`` est un ensemble de noeuds tels que toutes paires de noeuds est connectée par un chemin.
"""
# ╔═╡ 9e065cf0-7483-4ec2-809c-cdd7d22a5564
let
g=Graph(7)
add_edge!(g,1,2)
add_edge!(g,1,4)
add_edge!(g,2,3)
add_edge!(g,2,4)
add_edge!(g,3,4)
add_edge!(g,5,6)
add_edge!(g,5,7)
add_edge!(g,6,7)
gplot(g)
end
# ╔═╡ cbc8da76-9adf-4670-b07c-0f5366b55547
frametitle("Calcul de composantes connexes")
# ╔═╡ 338527b3-ec32-4794-8b92-63cce6ce4285
md"""
On démarre en assignant une composant connexe différente pour chaque noeud.
...
...
@@ -147,9 +556,6 @@ qa(md"Quelle est la complexité de cet algorithm ?", md"""
Comme on a ``|E|`` fusion, la complexité de l'algorithm est ``O(|V|\cdot |E|)``.
""")
# ╔═╡ b184882e-f2ed-4e9c-b763-0173711d6fac
frametitle("Disjoint-Set datastructure")
# ╔═╡ caa3a9dd-e7d6-493b-9586-8d08d9c8b9e5
md"""
Pour améliorer l'algorithme, pour la fusion de l'algorithm ``(1, 3)``, on peut updater le tableau à ``(1, 1, 1, 3)``.
...
...
@@ -166,31 +572,374 @@ md"""
De façon surprenante, si on met à jour le valeur dans le tableau pour mettre directement le root après l'avoir calculé, la complexité passe à ``O(|V| \alpha(|V|))`` où ``\alpha`` est la réciproque de la [fonction d'Ackermann](https://fr.wikipedia.org/wiki/Fonction_d%27Ackermann), une fonction qui augmente extrèmement lentement donc en pratique, c'est presque ``O(|V|)``.
"""
# ╔═╡ 8e7b6a51-1f8e-43d7-846b-a9e7596052b9
frametitle("Piste Eulérienne")
# ╔═╡ 0d914458-7ab1-4d0e-afc6-1bd0db52076a
qa(md"Proof",md"Pour chaque noeud de degré pair, quand on arrive à ce noeud, on saura le quitter par une arête non-utilisé. Son degré d'arête non-utilisé va être diminué par deux et donc rester pair. On va alors s'arêter sur le noeud de départ si tous les degrés sont pairs. Si 2 degrés sont impairs, on doit partir d'un noeud à degré impair et on arrivera à l'autre noeud à degré impair. Ceci construit un circuit ou piste et laisse le graphe avec un degré pair d'arêtes non-utilisées à chaque noeud. On peut alors trouver un autre circuit avec la même approche et continuer à construire de nouveaux circuit jusqu'à ce que tous les degrés soient zero. Si le graphe a une seule composante connecté, on sait ensuite fusionner tous ces circuits en un seul circuit.")
qa(md"Quelle est la complexité de Kruskal ?",md"??")
# ╔═╡ dc4766e9-e4a7-4b8b-a6db-360df927cc5d
md"""
Dans un graphe dirigé, une arête ``(i, j)`` a un **sens**. Intuitivement, on peut aller de ``i`` vers ``j`` mais on ne peut qu'aller de ``j`` vers ``i`` si il y a aussi une autre arête de ``(j, i)``.
Que deviennent les notions de **connected components**, **spanning tree**, etc...
"""
# ╔═╡ ea6fabad-d23a-46b7-ba8c-e4822216cd4e
md"""
**Définition** Une **composante fortement connexe** d'un graphe dirigé ``G(V, E)`` est un ensemble ``V' \subseteq V`` tel qu'il existe un chemin de ``u`` vers ``v`` pour tous ``u, v \in V'``.
"""
# ╔═╡ d4cb08b6-7829-45fe-ab61-b45b39b6c3ec
md"""
```math
F_n = F_{n-1} + F_{n-2} \qquad F_2 = F_1 = 1
```
"""
# ╔═╡ 8eca3dcf-e69f-40b6-b1cd-65785af1d2c4
md"n = $slider_n"
# ╔═╡ 0a2f66ad-bff3-42e5-9f91-2f8c46ab41a7
md"Combien de **fois** `fib(3)` est appelé quand l'utilisateur appelle `fib(8)` ?"
# ╔═╡ ae970602-a2f0-472f-8e77-35b6bfd4cb39
md"n = $slider_n"
# ╔═╡ cf1fd0a7-0512-4b0f-800a-912be0c6138a
md"Nombre d'appels de `fib(k)` venant de `fib(n)`"
# ╔═╡ 09192bc0-ac3e-47fe-8307-67f9c66d4f8e
md"n = $slider_n"
# ╔═╡ 28cfa917-cf00-4790-b71d-e629a18e4e10
md"""
* Le Puissance 4 de 7 colonnes de hauteur 6 est résolu par ordinateur en 1988
* Utilisation de l'algorithme **minimax** vu au cours S4...
* ...mais avec l'aide de la programmation dynamique!
"""
# ╔═╡ beb44e5f-2677-448e-8a23-6611ad0dd65d
function minimax(nrows::Integer,ncols,longueur;vert=-200,w=1200,h=600,dy=140,damping=0.9,Δy=55,scaling)