Files
1ereNSI/representation_construits/evaluation/TP10_Voyage.ipynb

542 lines
18 KiB
Plaintext
Raw Normal View History

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# TP Évaluation - Planification de Voyage\n",
"\n",
"**Durée : 1h30**\n",
"\n",
"**Nom :** \n",
"\n",
"**Prénom :**\n",
"\n",
"---\n",
"\n",
"Dans ce TP de synthèse, vous allez créer un système de planification de voyage.\n",
"\n",
"**Compétences évaluées :**\n",
"- Listes de tuples et dictionnaires\n",
"- Filtrage et tri de données\n",
"- Algorithmes de recherche"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Données initiales\n",
"\n",
"**Exécutez cette cellule avant de commencer.**"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Base de donnees des villes\n",
"# Chaque ville : (nom, pays, langue, monnaie, decalage_horaire)\n",
"villes = [\n",
" (\"Paris\", \"France\", \"Francais\", \"EUR\", 0),\n",
" (\"Londres\", \"Royaume-Uni\", \"Anglais\", \"GBP\", 0),\n",
" (\"New York\", \"Etats-Unis\", \"Anglais\", \"USD\", -6),\n",
" (\"Tokyo\", \"Japon\", \"Japonais\", \"JPY\", 8),\n",
" (\"Barcelone\", \"Espagne\", \"Espagnol\", \"EUR\", 0),\n",
" (\"Rome\", \"Italie\", \"Italien\", \"EUR\", 0),\n",
" (\"Amsterdam\", \"Pays-Bas\", \"Neerlandais\", \"EUR\", 0),\n",
" (\"Berlin\", \"Allemagne\", \"Allemand\", \"EUR\", 0),\n",
" (\"Dubai\", \"Emirats Arabes Unis\", \"Arabe\", \"AED\", 3),\n",
" (\"Sydney\", \"Australie\", \"Anglais\", \"AUD\", 9)\n",
"]\n",
"\n",
"# Base de donnees des hotels\n",
"# Chaque hotel est un dictionnaire\n",
"hotels = [\n",
" {\"nom\": \"Le Marais Boutique\", \"ville\": \"Paris\", \"etoiles\": 3, \"prix_nuit\": 120, \"note\": 8.5},\n",
" {\"nom\": \"Paris Luxury Palace\", \"ville\": \"Paris\", \"etoiles\": 5, \"prix_nuit\": 450, \"note\": 9.2},\n",
" {\"nom\": \"Eiffel Budget\", \"ville\": \"Paris\", \"etoiles\": 2, \"prix_nuit\": 65, \"note\": 7.1},\n",
" {\"nom\": \"London Central\", \"ville\": \"Londres\", \"etoiles\": 4, \"prix_nuit\": 180, \"note\": 8.8},\n",
" {\"nom\": \"Westminster Inn\", \"ville\": \"Londres\", \"etoiles\": 3, \"prix_nuit\": 95, \"note\": 7.9},\n",
" {\"nom\": \"Manhattan View\", \"ville\": \"New York\", \"etoiles\": 4, \"prix_nuit\": 220, \"note\": 8.6},\n",
" {\"nom\": \"Times Square Budget\", \"ville\": \"New York\", \"etoiles\": 2, \"prix_nuit\": 89, \"note\": 6.8},\n",
" {\"nom\": \"Tokyo Garden\", \"ville\": \"Tokyo\", \"etoiles\": 4, \"prix_nuit\": 150, \"note\": 9.0},\n",
" {\"nom\": \"Shibuya Capsule\", \"ville\": \"Tokyo\", \"etoiles\": 1, \"prix_nuit\": 35, \"note\": 7.5},\n",
" {\"nom\": \"Barcelona Beach\", \"ville\": \"Barcelone\", \"etoiles\": 4, \"prix_nuit\": 140, \"note\": 8.7},\n",
" {\"nom\": \"Roma Antica\", \"ville\": \"Rome\", \"etoiles\": 3, \"prix_nuit\": 110, \"note\": 8.3},\n",
" {\"nom\": \"Canal House\", \"ville\": \"Amsterdam\", \"etoiles\": 3, \"prix_nuit\": 130, \"note\": 8.4},\n",
" {\"nom\": \"Berlin Modern\", \"ville\": \"Berlin\", \"etoiles\": 3, \"prix_nuit\": 85, \"note\": 8.1},\n",
" {\"nom\": \"Burj Luxury\", \"ville\": \"Dubai\", \"etoiles\": 5, \"prix_nuit\": 380, \"note\": 9.4},\n",
" {\"nom\": \"Sydney Harbour\", \"ville\": \"Sydney\", \"etoiles\": 4, \"prix_nuit\": 200, \"note\": 8.9}\n",
"]\n",
"\n",
"# Base de donnees des vols (depuis Paris)\n",
"# Chaque vol : (compagnie, depart, arrivee, prix, escales)\n",
"vols = [\n",
" (\"Air France\", \"Paris\", \"Londres\", 120, 0),\n",
" (\"EasyJet\", \"Paris\", \"Londres\", 65, 0),\n",
" (\"Air France\", \"Paris\", \"New York\", 480, 0),\n",
" (\"Delta\", \"Paris\", \"New York\", 420, 0),\n",
" (\"United\", \"Paris\", \"New York\", 350, 1),\n",
" (\"JAL\", \"Paris\", \"Tokyo\", 750, 0),\n",
" (\"Air France\", \"Paris\", \"Tokyo\", 680, 0),\n",
" (\"ANA\", \"Paris\", \"Tokyo\", 620, 1),\n",
" (\"Vueling\", \"Paris\", \"Barcelone\", 85, 0),\n",
" (\"Air France\", \"Paris\", \"Barcelone\", 130, 0),\n",
" (\"Alitalia\", \"Paris\", \"Rome\", 110, 0),\n",
" (\"EasyJet\", \"Paris\", \"Rome\", 75, 0),\n",
" (\"KLM\", \"Paris\", \"Amsterdam\", 95, 0),\n",
" (\"Lufthansa\", \"Paris\", \"Berlin\", 110, 0),\n",
" (\"Emirates\", \"Paris\", \"Dubai\", 450, 0),\n",
" (\"Qantas\", \"Paris\", \"Sydney\", 980, 1),\n",
" (\"Emirates\", \"Paris\", \"Sydney\", 1100, 1)\n",
"]\n",
"\n",
"# Activites par ville\n",
"activites = {\n",
" \"Paris\": [\n",
" {\"nom\": \"Tour Eiffel\", \"prix\": 26, \"duree\": 2, \"type\": \"monument\"},\n",
" {\"nom\": \"Louvre\", \"prix\": 17, \"duree\": 4, \"type\": \"musee\"},\n",
" {\"nom\": \"Croisiere Seine\", \"prix\": 15, \"duree\": 1, \"type\": \"excursion\"}\n",
" ],\n",
" \"Londres\": [\n",
" {\"nom\": \"British Museum\", \"prix\": 0, \"duree\": 3, \"type\": \"musee\"},\n",
" {\"nom\": \"London Eye\", \"prix\": 32, \"duree\": 1, \"type\": \"attraction\"},\n",
" {\"nom\": \"Tower of London\", \"prix\": 28, \"duree\": 2, \"type\": \"monument\"}\n",
" ],\n",
" \"New York\": [\n",
" {\"nom\": \"Statue of Liberty\", \"prix\": 24, \"duree\": 4, \"type\": \"monument\"},\n",
" {\"nom\": \"Empire State Building\", \"prix\": 44, \"duree\": 2, \"type\": \"monument\"},\n",
" {\"nom\": \"Broadway Show\", \"prix\": 150, \"duree\": 3, \"type\": \"spectacle\"}\n",
" ],\n",
" \"Tokyo\": [\n",
" {\"nom\": \"Temple Senso-ji\", \"prix\": 0, \"duree\": 2, \"type\": \"monument\"},\n",
" {\"nom\": \"Tokyo Skytree\", \"prix\": 20, \"duree\": 2, \"type\": \"attraction\"},\n",
" {\"nom\": \"Robot Restaurant\", \"prix\": 80, \"duree\": 2, \"type\": \"spectacle\"}\n",
" ],\n",
" \"Barcelone\": [\n",
" {\"nom\": \"Sagrada Familia\", \"prix\": 26, \"duree\": 2, \"type\": \"monument\"},\n",
" {\"nom\": \"Parc Guell\", \"prix\": 10, \"duree\": 2, \"type\": \"parc\"},\n",
" {\"nom\": \"Camp Nou\", \"prix\": 28, \"duree\": 2, \"type\": \"sport\"}\n",
" ],\n",
" \"Rome\": [\n",
" {\"nom\": \"Colisee\", \"prix\": 16, \"duree\": 2, \"type\": \"monument\"},\n",
" {\"nom\": \"Vatican\", \"prix\": 20, \"duree\": 4, \"type\": \"monument\"},\n",
" {\"nom\": \"Fontaine de Trevi\", \"prix\": 0, \"duree\": 1, \"type\": \"monument\"}\n",
" ]\n",
"}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"## Exercice 1 - Exploration des données (25 min)\n",
"\n",
"### 1.1 Affichage d'une ville (4 pts)\n",
"\n",
"Écrivez une fonction `afficher_ville(ville)` qui affiche les informations d'une ville.\n",
"\n",
"Exemple :\n",
"```\n",
"Tokyo (Japon)\n",
"Langue : Japonais | Monnaie : JPY\n",
"Decalage horaire : +8h\n",
"```\n",
"\n",
"*Rappel : ville[0] = nom, ville[1] = pays, ville[2] = langue, ville[3] = monnaie, ville[4] = decalage*"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def afficher_ville(ville):\n",
" nom = ville[0]\n",
" pays = ville[1]\n",
" langue = ville[2]\n",
" monnaie = ville[3]\n",
" decalage = ville[4]\n",
" \n",
" # Votre code ici : afficher les informations\n",
" pass\n",
"\n",
"# Test\n",
"afficher_ville(villes[3]) # Tokyo"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1.2 Rechercher une ville (4 pts)\n",
"\n",
"Écrivez une fonction `rechercher_ville(nom, villes)` qui renvoie le tuple de la ville correspondante, ou `None` si non trouvée."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def rechercher_ville(nom, villes):\n",
" for ville in villes:\n",
" # Votre code ici\n",
" pass\n",
" return None\n",
"\n",
"# Test\n",
"v = rechercher_ville(\"Rome\", villes)\n",
"if v:\n",
" afficher_ville(v)\n",
"print()\n",
"print(\"Madrid :\", rechercher_ville(\"Madrid\", villes))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1.3 Villes par monnaie (4 pts)\n",
"\n",
"Écrivez une fonction `villes_par_monnaie(villes, monnaie)` qui renvoie la liste des noms de villes utilisant cette monnaie."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def villes_par_monnaie(villes, monnaie):\n",
" resultats = []\n",
" \n",
" for ville in villes:\n",
" # Votre code ici\n",
" pass\n",
" \n",
" return resultats\n",
"\n",
"# Test\n",
"print(\"Villes en zone Euro :\", villes_par_monnaie(villes, \"EUR\"))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"## Exercice 2 - Recherche d'hôtels et vols (35 min)\n",
"\n",
"### 2.1 Hôtels dans une ville (5 pts)\n",
"\n",
"Écrivez une fonction `hotels_ville(ville, hotels)` qui renvoie la liste des hôtels d'une ville, triés par note décroissante."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def hotels_ville(ville, hotels):\n",
" resultats = []\n",
" \n",
" for hotel in hotels:\n",
" # Votre code ici\n",
" pass\n",
" \n",
" # Trier par note decroissante\n",
" # Votre code ici\n",
" pass\n",
" \n",
" return resultats\n",
"\n",
"# Test\n",
"print(\"Hotels a Paris :\")\n",
"for h in hotels_ville(\"Paris\", hotels):\n",
" print(\" \", h[\"nom\"], \"-\", h[\"etoiles\"], \"etoiles -\", h[\"prix_nuit\"], \"euros/nuit - Note:\", h[\"note\"])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.2 Vols vers une destination (5 pts)\n",
"\n",
"Écrivez une fonction `vols_vers(destination, vols)` qui renvoie la liste des vols vers cette destination, triés par prix croissant.\n",
"\n",
"*Rappel : vol[2] = arrivee, vol[3] = prix*"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def vols_vers(destination, vols):\n",
" resultats = []\n",
" \n",
" for vol in vols:\n",
" # Votre code ici\n",
" pass\n",
" \n",
" # Trier par prix croissant\n",
" # Votre code ici\n",
" pass\n",
" \n",
" return resultats\n",
"\n",
"# Test\n",
"print(\"Vols vers Tokyo :\")\n",
"for v in vols_vers(\"Tokyo\", vols):\n",
" escales = \"direct\" if v[4] == 0 else str(v[4]) + \" escale(s)\"\n",
" print(\" \", v[0], \":\", v[3], \"euros (\", escales, \")\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.3 Vol le moins cher (5 pts)\n",
"\n",
"Écrivez une fonction `vol_moins_cher(destination, vols, direct_seulement)` qui renvoie le vol le moins cher vers une destination.\n",
"\n",
"Si `direct_seulement` est `True`, ne considérer que les vols sans escale."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def vol_moins_cher(destination, vols, direct_seulement):\n",
" meilleur = None\n",
" meilleur_prix = 999999\n",
" \n",
" for vol in vols:\n",
" if vol[2] == destination:\n",
" # Verifier si on veut que des vols directs\n",
" if direct_seulement and vol[4] > 0:\n",
" continue\n",
" \n",
" # Votre code ici : garder le vol le moins cher\n",
" pass\n",
" \n",
" return meilleur\n",
"\n",
"# Tests\n",
"vol = vol_moins_cher(\"New York\", vols, True)\n",
"if vol:\n",
" print(\"Vol direct le moins cher vers New York :\", vol[0], \"-\", vol[3], \"euros\")\n",
"\n",
"vol = vol_moins_cher(\"New York\", vols, False)\n",
"if vol:\n",
" print(\"Vol le moins cher vers New York (avec escales) :\", vol[0], \"-\", vol[3], \"euros\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.4 Budget hotel (6 pts)\n",
"\n",
"Écrivez une fonction `hotels_budget(ville, hotels, budget_max, etoiles_min)` qui renvoie les hôtels correspondant aux critères, triés par prix croissant."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def hotels_budget(ville, hotels, budget_max, etoiles_min):\n",
" resultats = []\n",
" \n",
" for hotel in hotels:\n",
" # Verifier ville, budget et etoiles\n",
" # Votre code ici\n",
" pass\n",
" \n",
" # Trier par prix croissant\n",
" # Votre code ici\n",
" pass\n",
" \n",
" return resultats\n",
"\n",
"# Test\n",
"print(\"Hotels a Paris, max 150 euros, min 3 etoiles :\")\n",
"for h in hotels_budget(\"Paris\", hotels, 150, 3):\n",
" print(\" \", h[\"nom\"], \"-\", h[\"prix_nuit\"], \"euros/nuit\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"## Exercice 3 - Bonus (20 min)\n",
"\n",
"### 3.1 Calculer le budget voyage (5 pts)\n",
"\n",
"Écrivez une fonction `calculer_budget(destination, nuits, vol, hotel, activites_choisies, activites)` qui calcule le budget total.\n",
"\n",
"Budget = prix vol + (prix hotel × nuits) + somme des activités"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def calculer_budget(destination, nuits, vol, hotel, activites_choisies, activites):\n",
" budget = {}\n",
" \n",
" # Vol\n",
" budget[\"vol\"] = vol[3]\n",
" \n",
" # Hotel\n",
" budget[\"hotel\"] = hotel[\"prix_nuit\"] * nuits\n",
" \n",
" # Activites\n",
" budget[\"activites\"] = 0\n",
" if destination in activites:\n",
" for act in activites[destination]:\n",
" # Votre code ici : ajouter le prix si l'activite est choisie\n",
" pass\n",
" \n",
" budget[\"total\"] = budget[\"vol\"] + budget[\"hotel\"] + budget[\"activites\"]\n",
" \n",
" return budget\n",
"\n",
"# Test\n",
"vol_choisi = vols[6] # Air France Paris-Tokyo\n",
"hotel_choisi = hotels[7] # Tokyo Garden\n",
"acts = [\"Temple Senso-ji\", \"Tokyo Skytree\"]\n",
"\n",
"budget = calculer_budget(\"Tokyo\", 5, vol_choisi, hotel_choisi, acts, activites)\n",
"print(\"Budget voyage Tokyo :\")\n",
"for poste, montant in budget.items():\n",
" print(\" \", poste, \":\", montant, \"euros\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 3.2 Activités gratuites (4 pts)\n",
"\n",
"Écrivez une fonction `activites_gratuites(activites)` qui renvoie la liste de toutes les activités gratuites (prix = 0).\n",
"\n",
"Renvoie une liste de dictionnaires `{\"ville\": ..., \"activite\": ...}`."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def activites_gratuites(activites):\n",
" gratuites = []\n",
" \n",
" for ville, liste_acts in activites.items():\n",
" for act in liste_acts:\n",
" # Votre code ici\n",
" pass\n",
" \n",
" return gratuites\n",
"\n",
"# Test\n",
"print(\"Activites gratuites :\")\n",
"for a in activites_gratuites(activites):\n",
" print(\" \", a[\"ville\"], \":\", a[\"activite\"])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 3.3 Destination la moins chère (5 pts)\n",
"\n",
"Écrivez une fonction `destination_moins_chere(vols, hotels, nuits)` qui trouve la destination la moins chère (vol + hotel × nuits).\n",
"\n",
"Pour chaque destination, prendre le vol le moins cher et l'hotel le moins cher."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def destination_moins_chere(vols, hotels, nuits):\n",
" # Trouver toutes les destinations\n",
" destinations = []\n",
" for vol in vols:\n",
" if vol[2] not in destinations:\n",
" destinations.append(vol[2])\n",
" \n",
" meilleure = None\n",
" meilleur_prix = 999999\n",
" \n",
" for dest in destinations:\n",
" # Trouver le vol le moins cher\n",
" vol = vol_moins_cher(dest, vols, False)\n",
" if vol == None:\n",
" continue\n",
" \n",
" # Trouver l'hotel le moins cher\n",
" hotels_dest = hotels_ville(dest, hotels)\n",
" if len(hotels_dest) == 0:\n",
" continue\n",
" \n",
" hotel_min = hotels_dest[0]\n",
" for h in hotels_dest:\n",
" if h[\"prix_nuit\"] < hotel_min[\"prix_nuit\"]:\n",
" hotel_min = h\n",
" \n",
" # Calculer le prix total\n",
" # Votre code ici : mettre a jour meilleure si prix_total est inferieur\n",
" prix_total = 0\n",
" \n",
" return meilleure\n",
"\n",
"# Test\n",
"dest = destination_moins_chere(vols, hotels, 3)\n",
"if dest:\n",
" print(\"Destination la moins chere pour 3 nuits :\")\n",
" print(\" Destination :\", dest[\"destination\"])\n",
" print(\" Vol :\", dest[\"vol\"], \"-\", dest[\"prix_vol\"], \"euros\")\n",
" print(\" Hotel :\", dest[\"hotel\"], \"-\", dest[\"prix_hotel\"], \"euros/nuit\")\n",
" print(\" Total :\", dest[\"total\"], \"euros\")"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"name": "python",
"version": "3.9.0"
}
},
"nbformat": 4,
"nbformat_minor": 4
}