İşlemeleri karşılaştır

...

19 commits

Yazar SHA1 Mesaj Tarih
Paul ALNET
df98bff285 tex: comment probabilistic annex 2023-06-04 08:54:56 +02:00
Paul ALNET
ad8d300348 Merge branch 'master' into latex 2023-06-04 08:50:31 +02:00
Paul ALNET
8fa29790f8 fix: remove accents in python script 2023-06-04 08:50:00 +02:00
Paul ALNET
de854e9fe6 tex: add code annex 2023-06-04 08:45:51 +02:00
Paul ALNET
836ffd538e fix: missing comma in perf annex 2023-06-04 08:43:26 +02:00
Paul ALNET
67bc7efd5c chore: add todos 2023-06-04 08:39:42 +02:00
Paul ALNET
6cd6df4b89 fix: better legend placement on graphs 2023-06-04 08:39:29 +02:00
Paul ALNET
316c910c3a chore: lint 2023-06-04 08:27:24 +02:00
Paul ALNET
6bb38429d1 fix: V_i in NFDBP algo 2023-06-04 08:17:35 +02:00
Paul ALNET
7e0c5a84bb fix: correct NFDBP algo 2023-06-04 08:12:30 +02:00
Paul ALNET
cf7a4cf7a6 chore: move legacy output to unused function 2023-06-04 08:12:10 +02:00
Paul ALNET
0cdc13b869 chore: clean up "zero padding" 2023-06-04 08:11:26 +02:00
Paul ALNET
7bee845a97 chore: clean up outputs + add comments 2023-06-04 08:10:42 +02:00
Paul ALNET
5f56b578d2 fix: rename packages to items 2023-06-04 07:14:37 +02:00
Paul ALNET
d8b470c9d4 fix: rename boxes to bins 2023-06-04 07:14:30 +02:00
Clément Lacau
8284d7bf03 Added many thing, check the code Paul 2023-06-04 00:28:24 +02:00
Clément Lacau
7804bbfc43 Beautiful graphs 2023-06-03 22:57:02 +02:00
Clément Lacau
ce5b4e560c aled paul 2023-06-03 17:27:38 +02:00
Clément Lacau
ebf87d231c Adding T,V,H graphs for NFBP algorithm 2023-06-03 01:01:13 +02:00
4 değiştirilmiş dosya ile 282 ekleme ve 75 silme

344
Probas.py Normal dosya → Çalıştırılabilir dosya
Dosyayı Görüntüle

@ -1,11 +1,16 @@
#!/usr/bin/python3
from random import random from random import random
from math import floor, sqrt from math import floor, sqrt, factorial
from statistics import mean, variance from statistics import mean, variance
# from matplotlib import pyplot from matplotlib import pyplot as plt
from pylab import *
import numpy as np
import matplotlib.pyplot as pt
def simulate_NFBP(N): def simulate_NFBP(N):
""" """
Tries to simulate T_i, V_i and H_n for N boxes of random size. Tries to simulate T_i, V_i and H_n for N items of random size.
""" """
i = 0 # Nombre de boites i = 0 # Nombre de boites
R = [0] # Remplissage de la i-eme boite R = [0] # Remplissage de la i-eme boite
@ -16,7 +21,7 @@ def simulate_NFBP(N):
size = random() size = random()
if R[i] + size >= 1: if R[i] + size >= 1:
# Il y n'y a plus de la place dans la boite pour le paquet. # Il y n'y a plus de la place dans la boite pour le paquet.
# On passe à la boite suivante (qu'on initialise) # On passe a la boite suivante (qu'on initialise)
i += 1 i += 1
R.append(0) R.append(0)
T.append(0) T.append(0)
@ -28,20 +33,15 @@ def simulate_NFBP(N):
V[i] = size V[i] = size
H.append(i) H.append(i)
return { return {"i": i, "R": R, "T": T, "V": V, "H": H}
"i": i,
"R": R,
"T": T,
"V": V,
"H": H
}
# unused
def stats_NFBP(R, N): def stats_NFBP(R, N):
""" """
Runs R runs of NFBP (for N packages) and studies distribution, variance, mean... Runs R runs of NFBP (for N items) and studies distribution, variance, mean...
""" """
print("Running {} NFBP simulations with {} packages".format(R, N)) print("Running {} NFBP simulations with {} items".format(R, N))
I = [] I = []
H = [[] for _ in range(N)] # List of empty lists H = [[] for _ in range(N)] # List of empty lists
@ -51,42 +51,136 @@ def stats_NFBP(R, N):
for n in range(N): for n in range(N):
H[n].append(sim["H"][n]) H[n].append(sim["H"][n])
print("Mean number of boxes : {} (variance {})".format(mean(I), variance(I))) print("Mean number of bins : {} (variance {})".format(mean(I), variance(I)))
for n in range(N): for n in range(N):
print("Mean H_{} : {} (variance {})".format(n, mean(H[n]), variance(H[n]))) print("Mean H_{} : {} (variance {})".format(n, mean(H[n]), variance(H[n])))
def stats_NFBP_iter(R, N): def stats_NFBP_iter(R, N):
""" """
Runs R runs of NFBP (for N packages) and studies distribution, variance, mean... Runs R runs of NFBP (for N items) and studies distribution, variance, mean...
Calculates stats during runtime instead of after to avoid excessive memory usage. Calculates stats during runtime instead of after to avoid excessive memory usage.
""" """
print("Running {} NFBP simulations with {} packages".format(R, N)) P = R * N # Total number of items
print("## Running {} NFBP simulations with {} items".format(R, N))
# number of bins
ISum = 0 ISum = 0
IVarianceSum = 0 IVarianceSum = 0
# index of the bin containing the n-th item
HSum = [0 for _ in range(N)] HSum = [0 for _ in range(N)]
HSumVariance = [0 for _ in range(N)] HSumVariance = [0 for _ in range(N)]
# number of items in the i-th bin
Sum_T = [0 for _ in range(N)]
# size of the first item in the i-th bin
Sum_V = [0 for _ in range(N)]
for i in range(R): for i in range(R):
sim = simulate_NFBP(N) sim = simulate_NFBP(N)
ISum += sim["i"] ISum += sim["i"]
IVarianceSum += sim["i"]**2 IVarianceSum += sim["i"] ** 2
for n in range(N): for n in range(N):
HSum[n] += sim["H"][n] HSum[n] += sim["H"][n]
HSumVariance[n] += sim["H"][n]**2 HSumVariance[n] += sim["H"][n] ** 2
T = sim["T"]
V = sim["V"]
# ensure that T, V have the same length as Sum_T, Sum_V
for i in range(N - sim["i"]):
T.append(0)
V.append(0)
Sum_T = [x + y for x, y in zip(Sum_T, T)]
Sum_V = [x + y for x, y in zip(Sum_V, V)]
I = ISum/R Sum_T = [x / R for x in Sum_T]
IVariance = sqrt(IVarianceSum/(R-1) - I**2) Sum_V = [round(x / R, 2) for x in Sum_V]
# print(Sum_V)
I = ISum / R
IVariance = sqrt(IVarianceSum / (R - 1) - I**2)
print("Mean number of bins : {} (variance {})".format(I, IVariance), "\n")
# TODO clarify line below
print(" {} * {} iterations of T".format(R, N), "\n")
for n in range(min(N, 10)):
Hn = HSum[n] / R # moyenne
HVariance = sqrt(HSumVariance[n] / (R - 1) - Hn**2) # Variance
print(
"Index of bin containing the {}th item (H_{}) : {} (variance {})".format(
n, n, Hn, HVariance
)
)
HSum = [x / R for x in HSum]
# print(HSum)
# Plotting
fig = plt.figure()
# T plot
x = np.arange(N)
# print(x)
ax = fig.add_subplot(221)
ax.bar(
x,
Sum_T,
width=1,
label="Empirical values",
edgecolor="blue",
linewidth=0.7,
color="red",
)
ax.set(
xlim=(0, N), xticks=np.arange(0, N), ylim=(0, 3), yticks=np.linspace(0, 3, 5)
)
ax.set_ylabel("Items")
ax.set_xlabel("Bins (1-{})".format(N))
ax.set_title("T histogram for {} items (Number of items in each bin)".format(P))
ax.legend(loc="upper left", title="Legend")
# V plot
bx = fig.add_subplot(222)
bx.bar(
x,
Sum_V,
width=1,
label="Empirical values",
edgecolor="blue",
linewidth=0.7,
color="orange",
)
bx.set(
xlim=(0, N), xticks=np.arange(0, N), ylim=(0, 1), yticks=np.linspace(0, 1, 10)
)
bx.set_ylabel("First item size")
bx.set_xlabel("Bins (1-{})".format(N))
bx.set_title("V histogram for {} items (first item size of each bin)".format(P))
bx.legend(loc="upper left", title="Legend")
# H plot
# We will simulate this part for a asymptotic study
cx = fig.add_subplot(223)
cx.bar(
x,
HSum,
width=1,
label="Empirical values",
edgecolor="blue",
linewidth=0.7,
color="green",
)
cx.set(
xlim=(0, N), xticks=np.arange(0, N), ylim=(0, 10), yticks=np.linspace(0, N, 5)
)
cx.set_ylabel("Bin ranking of n-item")
cx.set_xlabel("n-item (1-{})".format(N))
cx.set_title("H histogram for {} items".format(P))
xb = linspace(0, N, 10)
yb = Hn * xb / 10
wb = HVariance * xb / 10
cx.plot(xb, yb, label="Theoretical E(Hn)", color="brown")
cx.plot(xb, wb, label="Theoretical V(Hn)", color="purple")
cx.legend(loc="upper left", title="Legend")
plt.show()
print("Mean number of boxes : {} (variance {})".format(I, IVariance))
for n in range(n):
Hn = HSum[n]/R
HVariance = sqrt(HSumVariance[n]/(R-1) - Hn**2)
print("Index of box containing the {}th package (H_{}) : {} (variance {})".format(n, n, Hn, HVariance))
def simulate_NFDBP(N): def simulate_NFDBP(N):
""" """
Tries to simulate T_i, V_i and H_n for N boxes of random size. Tries to simulate T_i, V_i and H_n for N items of random size.
Next Fit Dual Bin Packing : bins should overflow
""" """
i = 0 # Nombre de boites i = 0 # Nombre de boites
R = [0] # Remplissage de la i-eme boite R = [0] # Remplissage de la i-eme boite
@ -95,83 +189,185 @@ def simulate_NFDBP(N):
H = [] # Rang de la boite contenant le n-ieme paquet H = [] # Rang de la boite contenant le n-ieme paquet
for n in range(N): for n in range(N):
size = random() size = random()
R[i] += size if R[i] >= 1:
T[i] += 1
if R[i] + size >= 1:
# Il y n'y a plus de la place dans la boite pour le paquet. # Il y n'y a plus de la place dans la boite pour le paquet.
# On passe à la boite suivante (qu'on initialise) # On passe a la boite suivante (qu'on initialise).
i += 1 i += 1
R.append(0) R.append(0)
T.append(0) T.append(0)
V.append(0) V.append(0)
if V[i] == 0: if V[i] == 0:
# C'est le premier paquet de la boite # C'est le premier paquet de la boite
V[i] = size V[i] = size
H.append(i) H.append(i)
R[i] += size
T[i] += 1
return { return {"i": i, "R": R, "T": T, "V": V, "H": H}
"i": i,
"R": R,
"T": T,
"V": V,
"H": H
}
def stats_NFDBP(R, N): def stats_NFDBP(R, N, t_i):
""" """
Runs R runs of NFDBP (for N packages) and studies distribution, variance, mean... Runs R runs of NFDBP (for N items) and studies distribution, variance, mean...
""" """
print("Running {} NFDBP simulations with {} packages".format(R, N)) print("## Running {} NFDBP simulations with {} items".format(R, N))
# TODO comment this function
P = N * R # Total number of items
I = [] I = []
H = [[] for _ in range(N)] # List of empty lists H = [[] for _ in range(N)] # List of empty lists
Tmean=[] T = []
Tk = [[] for _ in range(N)]
Ti = []
T_maths = []
# First iteration to use zip after
sim = simulate_NFDBP(N)
Sum_T = [0 for _ in range(N)]
for i in range(R): for i in range(R):
sim = simulate_NFDBP(N) sim = simulate_NFDBP(N)
I.append(sim["i"]) I.append(sim["i"])
for k in range(N):
T.append(0)
T = sim["T"]
for n in range(N): for n in range(N):
H[n].append(sim["H"][n]) H[n].append(sim["H"][n])
Tk[n].append(sim["T"][n])
Ti.append(sim["T"])
Sum_T = [x + y for x, y in zip(Sum_T, T)]
Sum_T = [x / R for x in Sum_T] # Experimental [Ti=k]
Sum_T = [
x * 100 / (sum(Sum_T)) for x in Sum_T
] # Pourcentage de la repartition des items
for k in range(sim["i"]): print("Mean number of bins : {} (variance {})".format(mean(I), variance(I)))
# for o in range(sim["i"]):
Tmean+=sim["T"]
print("Mean number of boxes : {} (variance {})".format(mean(I), variance(I)))
for n in range(N): for n in range(N):
print("Mean H_{} : {} (variance {})".format(n, mean(H[n]), variance(H[n]))) print("Mean H_{} : {} (variance {})".format(n, mean(H[n]), variance(H[n])))
for k in range(int(mean(I))+1): # TODO variance for T_k doesn't see right
print(Tmean[7]) print("Mean T_{} : {} (variance {})".format(k, mean(Sum_T), variance(Sum_T)))
# print("Mean T_{} : {} (variance {})".format(k, mean(Tmean[k]), variance(Tmean[k]))) # Loi math
for u in range(N):
u = u + 2
T_maths.append(1 / (factorial(u - 1)) - 1 / factorial(u))
E = 0
sigma2 = 0
# print(T_maths)
for p in range(len(T_maths)):
E = E + (p + 1) * T_maths[p]
sigma2 = ((T_maths[p] - E) ** 2) / (len(T_maths) - 1)
print(
"Mathematical values : Empiric mean T_{} : {} Variance {})".format(
t_i, E, sqrt(sigma2)
)
)
T_maths = [x * 100 for x in T_maths]
# Plotting
fig = plt.figure()
# T plot
x = np.arange(N)
print(x)
print(Sum_T)
ax = fig.add_subplot(221)
ax.bar(
x,
Sum_T,
width=1,
label="Empirical values",
edgecolor="blue",
linewidth=0.7,
color="red",
)
ax.set(
xlim=(0, N), xticks=np.arange(0, N), ylim=(0, 20), yticks=np.linspace(0, 20, 2)
)
ax.set_ylabel("Items(n) in %")
ax.set_xlabel("Bins (1-{})".format(N))
ax.set_title(
"Items percentage for each bin and {} items (Number of items in each bin)".format(
P
)
)
ax.legend(loc="upper right", title="Legend")
N = 10 ** 1 # TODO fix the graph below
sim = simulate_NFBP(N) # Mathematical P(Ti=k) plot. It shows the Ti(t_i) law with the probability of each number of items.
print(len(Tk[t_i]))
bx = fig.add_subplot(222)
bx.hist(
Tk[t_i],
bins=10,
width=1,
label="Empirical values",
edgecolor="blue",
linewidth=0.7,
color="red",
)
bx.set(
xlim=(0, N),
xticks=np.arange(0, N),
ylim=(0, len(Tk[t_i])),
yticks=np.linspace(0, 1, 1),
)
bx.set_ylabel("P(T{}=i)".format(t_i))
bx.set_xlabel("Bins i=(1-{}) in %".format(N))
bx.set_title(
"T{} histogram for {} items (Number of items in each bin)".format(t_i, P)
)
bx.legend(loc="upper right", title="Legend")
print("Simulation NFBP pour {} packaets. Contenu des boites :".format(N)) # Loi mathematique
for j in range(sim["i"] + 1): print(T_maths)
remplissage = floor(sim["R"][j] * 100) cx = fig.add_subplot(224)
print("Boite {} : Rempli à {} % avec {} paquets. Taille du premier paquet : {}".format(j, remplissage, sim["T"][j], cx.bar(
sim["V"][j])) x,
T_maths,
width=1,
label="Theoretical values",
edgecolor="blue",
linewidth=0.7,
color="red",
)
cx.set(
xlim=(0, N),
xticks=np.arange(0, N),
ylim=(0, 100),
yticks=np.linspace(0, 100, 10),
)
cx.set_ylabel("P(T{}=i)".format(t_i))
cx.set_xlabel("Bins i=(1-{})".format(N))
cx.set_title("Theoretical T{} values in %".format(t_i))
cx.legend(loc="upper right", title="Legend")
plt.show()
print()
stats_NFBP(10 ** 4, 10)
N = 10 ** 1 # unused
sim = simulate_NFDBP(N) def basic_demo():
print("Simulation NFDBP pour {} packaets. Contenu des boites :".format(N)) N = 10**1
for j in range(sim["i"] + 1): sim = simulate_NFBP(N)
remplissage = floor(sim["R"][j] * 100)
print("Boite {} : Rempli à {} % avec {} paquets. Taille du premier paquet : {}".format(j, remplissage,
sim["T"][j],
sim["V"][j]))
print() print("Simulation NFBP pour {} packaets. Contenu des boites :".format(N))
stats_NFDBP(10 ** 4, 10) for j in range(sim["i"] + 1):
stats_NFBP_iter(10**6, 10) remplissage = floor(sim["R"][j] * 100)
print(
"Boite {} : Rempli a {} % avec {} paquets. Taille du premier paquet : {}".format(
j, remplissage, sim["T"][j], sim["V"][j]
)
)
# print()
# pyplot.plot([1, 2, 4, 4, 2, 1], color = 'red', linestyle = 'dashed', linewidth = 2, stats_NFBP(10**3, 10)
# markerfacecolor = 'blue', markersize = 5)
# pyplot.ylim(0, 5)
# pyplot.title('Un exemple')
N = 10**1
sim = simulate_NFDBP(N)
print("Simulation NFDBP pour {} packaets. Contenu des boites :".format(N))
for j in range(sim["i"] + 1):
remplissage = floor(sim["R"][j] * 100)
print(
"Boite {} : Rempli a {} % avec {} paquets. Taille du premier paquet : {}".format(
j, remplissage, sim["T"][j], sim["V"][j]
)
)
stats_NFBP_iter(10**3, 10)
print("\n\n")
stats_NFDBP(10**3, 10, 1)

Dosyayı Görüntüle

@ -1,5 +1,5 @@
For simplicity, we only include the script for the improved algorithm. For the For simplicity, we only include the script for the improved algorithm. For the
intuitive algorithm, simply replace the algorithm. The imports timing and memory intuitive algorithm, simply replace the algorithm. The imports, timing and memory
usage tracking code are nearly identical. usage tracking code are nearly identical.
\begin{lstlisting}[language=python] \begin{lstlisting}[language=python]

Dosyayı Görüntüle

@ -0,0 +1,5 @@
Script should have been provided with report. % TODO
\lstinputlisting[language=Python]{../Probas.py}
% TODO include output example

Dosyayı Görüntüle

@ -113,6 +113,12 @@
\clearpage \clearpage
\subsection{Probabilistic analysis script}
\label{annex:probabilistic}
\input{annex-probabilistic}
\clearpage
% \includepdf[pages={1}, scale=0.96, % \includepdf[pages={1}, scale=0.96,
% pagecommand=\subsection{Questionnaire 1 : Sensibilisation à l’Hygiène et à la Sécurité}] % pagecommand=\subsection{Questionnaire 1 : Sensibilisation à l’Hygiène et à la Sécurité}]