a3-algorithmique-avancee/Projet_algo.ipynb
2023-06-05 12:04:32 +02:00

217 lines
30 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"id": "83c2b1e7-b401-4a15-adf0-d43cebf9ad81",
"metadata": {},
"source": [
"# Projet algorithme # \n"
]
},
{
"cell_type": "markdown",
"id": "0b4f92e5-ac40-4491-983d-890c4f0f6694",
"metadata": {},
"source": [
"## Context du projet: \n"
]
},
{
"cell_type": "markdown",
"id": "5f483b31-1246-4f00-ae39-718ef92ce9eb",
"metadata": {},
"source": [
"L'ADEME a lancé un appel à manifestation d'intérêt pour développer des solutions de mobilité adaptées à différents territoires. CesiCDP, en collaboration avec des partenaires, s'est spécialisé dans la Mobilité Multimodale Intelligente. Dans le cadre de cet appel, l'équipe de CesiCDP travaille sur la gestion de tournées de livraison pour minimiser les trajets et optimiser l'efficacité. L'objectif est d'obtenir de nouveaux marchés et des financements pour poursuivre le développement de l'entreprise. Des contraintes supplémentaires seront ajoutées pour rendre le problème plus réaliste et intéressant pour l'ADEME."
]
},
{
"cell_type": "markdown",
"id": "fc23daaf-9f25-4c5a-bf6c-300a7ed8d623",
"metadata": {},
"source": [
"Notre but est de réaliser un algorithme qui permette de passer par tout les points de livraisons avec un temps optimisé."
]
},
{
"cell_type": "markdown",
"id": "ba356166-604a-4627-ac0f-93b76eb7a22d",
"metadata": {},
"source": [
"## Modélisation du problème"
]
},
{
"cell_type": "markdown",
"id": "50a3e56e-3bdc-4f2c-a811-8433ffeb2a34",
"metadata": {},
"source": [
"L'objectif de notre algorithme est de calculer et de fournir le meilleur itinéraire possible et le plus optimisé en terme de temps.\n",
"\n"
]
},
{
"attachments": {},
"cell_type": "markdown",
"id": "c4d6888b-14e6-4745-880f-0a063ebf7476",
"metadata": {},
"source": [
"Notre problème se modélise sous forme d'un graphe, chaque sommet du graphe va représenter une ville. Le but est de passer par chaque ville pour revenir au point de départ en empruntant le chemin le plus rapide. Chaque arête possède un poids qui représente le temps de trajet d'une ville A à une ville B. \n",
"\n",
"Dans notre cas le problème peut s'assimiler à un problème du voyageur de commerce dynamique avec un graphe incomplet. On cherche le chemin le plus court en passant par toute les villes en tenant compte des variations des poids des arêtes au cours du temps. Il est possible de passer plusieurs fois par le même sommet si cela permet d'avoir le chemin qui prends le moins de temps. \n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n"
]
},
{
"cell_type": "markdown",
"id": "5290881b",
"metadata": {},
"source": []
},
{
"cell_type": "markdown",
"id": "3346ae96-1c36-4e9d-9480-3ab4657c7d68",
"metadata": {},
"source": [
"## Objectifs\n"
]
},
{
"cell_type": "markdown",
"id": "dbd49849-988e-4915-8e28-e00085f4b97e",
"metadata": {},
"source": [
"Minimiser les temps de trajets, en optimisant les itinéraires."
]
},
{
"cell_type": "markdown",
"id": "d633beb7-8f26-46d4-9cd9-1d0093e5b5c3",
"metadata": {},
"source": [
"## Contrainte :\n"
]
},
{
"cell_type": "markdown",
"id": "35fc1c3c-d7a9-4423-a948-aa00ab51dbf4",
"metadata": {},
"source": [
"Contrainte de temps entre les sommets. Les temps de parcours d'une arête peut varié au cours du temps en fonction de l'heure. \n"
]
},
{
"cell_type": "code",
"execution_count": 33,
"id": "337db031-2e38-4b6d-9d57-74e277d7f033",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"array([[0, 0, 0, 0, 0, 0, 1, 0, 0, 1],\n",
" [0, 0, 0, 0, 1, 0, 0, 0, 0, 1],\n",
" [0, 0, 0, 0, 0, 1, 0, 1, 0, 0],\n",
" [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n",
" [0, 1, 0, 0, 0, 0, 0, 0, 1, 0],\n",
" [0, 0, 1, 0, 0, 0, 0, 0, 0, 0],\n",
" [1, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n",
" [0, 0, 1, 0, 0, 0, 0, 0, 0, 1],\n",
" [0, 0, 0, 0, 1, 0, 0, 0, 0, 0],\n",
" [1, 1, 0, 0, 0, 0, 0, 1, 0, 0]])"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import numpy as np\n",
"\n",
"mat = np.random.random((10, 10))\n",
"mat = mat + mat.T\n",
"adja = (mat >= 1.4).astype(int)\n",
"for i in range(adja.shape[0]):\n",
" adja[i ,i] = 0\n",
"adja"
]
},
{
"cell_type": "code",
"execution_count": 32,
"id": "ca201fb6-740f-4f26-b7d0-d48ae037e8ef",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 400x400 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import networkx as nx\n",
"import scipy\n",
"import matplotlib.pyplot as plt\n",
"fix, ax = plt.subplots(1, 1,figsize=(4,4))\n",
"G = nx.DiGraph(np.array(adja))\n",
"layout = nx.kamada_kawai_layout(G)\n",
"nx.draw(G, with_labels=True, ax=ax, pos=layout)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5baaba8c-1e8f-4da6-9504-1128644391dd",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "91a312bd-26c5-424e-aa54-c08328831308",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.2"
}
},
"nbformat": 4,
"nbformat_minor": 5
}