Réseau de dépôts - Gestion des liaisons et stocks
On modélise un réseau de dépôts et de liaisons entre eux. Un réseau est représenté par un dictionnaire :
reseau = {
1: [(2, 5), (3, 2)],
2: [(1, 5), (3, 4), (4, 7)],
3: [(1, 2), (2, 4), (4, 1)],
4: [(2, 7), (3, 1)]
}
- Les clés sont des entiers représentant les dépôts.
- À chaque dépôt est associée une liste de tuples.
- Chaque tuple
(j, c)signifie qu'il existe une liaison vers le dépôt j de coût c.
Écrire une fonction voisins(reseau, i) qui retourne la liste des dépôts voisins de i.
Exemple
voisins(reseau, 1)
[2, 3]
def voisins(reseau, i):
if i not in reseau:
return []
liste_voisins = []
for j, cout in reseau[i]:
liste_voisins.append(j)
return liste_voisins
Écrire une fonction cout_total_sortant(reseau, i) qui calcule la somme des coûts des liaisons sortant du dépôt i.
Exemple
cout_total_sortant(reseau, 2)
16
def cout_total_sortant(reseau, i):
if i not in reseau:
return 0
total = 0
for j, cout in reseau[i]:
total += cout
return total
Écrire une fonction nombre_liaisons(reseau) qui retourne le nombre total de liaisons du réseau. (On suppose que le réseau est symétrique.)
Exemple
nombre_liaisons(reseau)
5
def nombre_liaisons(reseau):
total = 0
for i, liste_voisins in reseau.items():
total += len(liste_voisins)
# Le réseau est symétrique, chaque liaison est comptée deux fois
return total // 2
Écrire une fonction depot_plus_connecte(reseau) qui retourne le dépôt ayant le plus grand nombre de voisins. En cas d'égalité, retourner le plus petit numéro.
Exemple
depot_plus_connecte(reseau)
2
def depot_plus_connecte(reseau):
max_voisins = -1
meilleur_depot = None
for depot, liste_voisins in reseau.items():
nb_voisins = len(liste_voisins)
if nb_voisins > max_voisins:
max_voisins = nb_voisins
meilleur_depot = depot
elif nb_voisins == max_voisins:
if meilleur_depot is None or depot < meilleur_depot:
meilleur_depot = depot
return meilleur_depot
Écrire une fonction ajouter_liaison(reseau, i, j, c) qui ajoute une liaison bidirectionnelle entre i et j de coût c.
def ajouter_liaison(reseau, i, j, c):
# Ajouter la liaison i -> j
if i not in reseau:
reseau[i] = []
reseau[i].append((j, c))
# Ajouter la liaison j -> i (bidirectionnelle)
if j not in reseau:
reseau[j] = []
reseau[j].append((i, c))
# Modification en place, pas de return
Écrire une fonction supprimer_liaison(reseau, i, j) qui supprime la liaison entre i et j.
def supprimer_liaison(reseau, i, j):
# Supprimer la liaison i -> j
if i in reseau:
reseau[i] = [(voisin, cout) for voisin, cout in reseau[i] if voisin != j]
# Supprimer la liaison j -> i
if j in reseau:
reseau[j] = [(voisin, cout) for voisin, cout in reseau[j] if voisin != i]
# Modification en place, pas de return
Écrire une fonction cout_minimal_sortant(reseau, i) qui retourne le plus petit coût des liaisons sortant du dépôt i.
Exemple
cout_minimal_sortant(reseau, 3)
1
def cout_minimal_sortant(reseau, i):
if i not in reseau or not reseau[i]:
return None
min_cout = float('inf')
for j, cout in reseau[i]:
if cout < min_cout:
min_cout = cout
return min_cout
On définit un dépôt comme central si la somme de ses coûts sortants est minimale. Écrire une fonction depot_central(reseau) qui retourne le dépôt central.
Exemple
depot_central(reseau)
3
def depot_central(reseau):
min_cout = float('inf')
depot_min = None
for depot in reseau:
cout = cout_total_sortant(reseau, depot)
if cout < min_cout:
min_cout = cout
depot_min = depot
elif cout == min_cout:
if depot_min is None or depot < depot_min:
depot_min = depot
return depot_min
On définit une structure secondaire :
stock = {
1: [12, 7, 4],
2: [5, 9],
3: [3, 3, 8, 1],
4: []
}
Chaque dépôt possède une liste de quantités.
Écrire une fonction total_stock(stock) qui retourne le stock total du réseau.
Exemple
total_stock(stock)
52
def total_stock(stock):
total = 0
for depot, liste_quantites in stock.items():
for quantite in liste_quantites:
total += quantite
return total
Écrire une fonction depot_max_stock(stock) qui retourne le dépôt ayant le plus grand stock total.
Exemple
depot_max_stock(stock)
1
def depot_max_stock(stock):
max_stock = -1
meilleur_depot = None
for depot, liste_quantites in stock.items():
# Calculer le stock total du dépôt
total = 0
for quantite in liste_quantites:
total += quantite
if total > max_stock:
max_stock = total
meilleur_depot = depot
elif total == max_stock:
if meilleur_depot is None or depot < meilleur_depot:
meilleur_depot = depot
return meilleur_depot
Discussion (0)
Soyez le premier à laisser un commentaire !
Laisser un commentaire
Votre commentaire sera visible après modération.