-
Notifications
You must be signed in to change notification settings - Fork 0
/
gloutonne1.py
53 lines (40 loc) · 1.81 KB
/
gloutonne1.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
from donnees import import_donnees_from_json
from itertools import chain, combinations
def gloutonne1(D):
C = sum(D.capacites)
print("Borne trivial de l'instance : " + str(D.borne_trivial()))
print("Somme des capacités : " + str(C))
# Lots possibles
lots = list(chain(*map(lambda x: combinations(D.Articles, x),
range(D.e_min, D.e_max + 1))))
print("Nombre de lots possibles : " + str(len(lots)))
# Lots avec un indice commercial suffisant
lots = list(filter(lambda x: sum(
[article.indice for article in x]) >= D.r_min, lots))
print("Nombre de lots avec un indice commercial suffisant : " + str(len(lots)))
# Trie par profit net décroissant/ nombre d'articles
lots = sorted(lots, key=lambda x: len(
x) / (sum([article.prix for article in x]) - D.cd * len(x)))
lots = [list(lot) for lot in lots]
lots_utilisés = []
for lot in lots:
if C == 0 or len(lots_utilisés) == D.L_max:
break
# lot_possible if there is nombre > 0 for each article in the lot
lot_possible = all([article.nombre > 0 for article in lot])
if lot_possible:
N = min([article.nombre for article in lot] + [C])
for article in lot:
article.nombre -= N
lots_utilisés.append([lot, N, 0])
print("Nombre de lots utilisés : " + str(len(lots_utilisés)))
for lot in lots_utilisés:
for capacite in D.capacites:
if capacite > 0:
N = min(lot[1] * len(lot[0]), capacite)
D.capacites[D.capacites.index(capacite)] -= N
lot[2] += N / len(lot[0])
break
print("Capacités finales : " + str(D.capacites))
print("Capacités restantes : " + str(sum(D.capacites)))
return D, lots_utilisés