From ebf87d231cfba20f966f58d48f4754e147b1a925 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Lacau?= Date: Sat, 3 Jun 2023 01:01:13 +0200 Subject: [PATCH 01/15] Adding T,V,H graphs for NFBP algorithm --- Probas.py | 89 +++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 67 insertions(+), 22 deletions(-) mode change 100644 => 100755 Probas.py diff --git a/Probas.py b/Probas.py old mode 100644 new mode 100755 index 240a19e..cf40d49 --- a/Probas.py +++ b/Probas.py @@ -1,11 +1,14 @@ +#!/usr/bin/python3 from random import random from math import floor, sqrt from statistics import mean, variance -# from matplotlib import pyplot +from matplotlib import pyplot as plt +from pylab import * +import numpy as np 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 packages of random size. """ i = 0 # Nombre de boites R = [0] # Remplissage de la i-eme boite @@ -44,7 +47,7 @@ def stats_NFBP(R, N): print("Running {} NFBP simulations with {} packages".format(R, N)) I = [] H = [[] for _ in range(N)] # List of empty lists - + for i in range(R): sim = simulate_NFBP(N) I.append(sim["i"]) @@ -61,12 +64,15 @@ def stats_NFBP_iter(R, N): Runs R runs of NFBP (for N packages) and studies distribution, variance, mean... Calculates stats during runtime instead of after to avoid excessive memory usage. """ + P=R*N print("Running {} NFBP simulations with {} packages".format(R, N)) ISum = 0 IVarianceSum = 0 HSum = [0 for _ in range(N)] HSumVariance = [0 for _ in range(N)] - + Sum_T=[] + Sum_V=[] + Sum_H=[] for i in range(R): sim = simulate_NFBP(N) ISum += sim["i"] @@ -74,11 +80,49 @@ def stats_NFBP_iter(R, N): for n in range(N): HSum[n] += sim["H"][n] HSumVariance[n] += sim["H"][n]**2 - + Sum_T=Sum_T+sim['T'] + Sum_H=Sum_H+sim['H'] + for k in range(sim['i']): + #we use round to approximate variations of continuous variable V + Sum_V.append(round(sim['V'][k],2)) I = ISum/R IVariance = sqrt(IVarianceSum/(R-1) - I**2) - - print("Mean number of boxes : {} (variance {})".format(I, IVariance)) + print("Mean number of boxes : {} (variance {})".format(I, IVariance),'\n') + print(" {} * {} iterations of T".format(R,N),'\n') + +#Plotting + #fig = plt.figure() + #ax = fig.add_subplot(111) + #matplotlib.stairs(Sum_T,bins=[0,1,2,3,4]) + #ax.hist(Sum_T, bins=8, edgecolor='k', density=True, label='Valeurs empiriques') + #ax.set(xlim=(0, 8), xticks=np.arange(1, 8), + #ylim=(0, 500), yticks=np.linspace(0, 56, 9)) + #ax.legend() + #plt.show() + #plt.style.use('_mpl-gallery') + #make data + #plot: + #fig = plt.subplots() + fig = plt.figure() + #T plot + ax = fig.add_subplot(221) + ax.hist(Sum_T, bins=6, linewidth=0.5, edgecolor="white", label='Empirical values') + ax.set(xlim=(0, 6), xticks=np.arange(0, 6),ylim=(0, 6000), yticks=np.linspace(0, 6000, 9)) + ax.set_title('T histogram for {} packages (Number of packages in each box)'.format(P)) + ax.legend() + #V plot + bx = fig.add_subplot(222) + bx.hist(Sum_V, bins=10, linewidth=0.5, edgecolor="white", label='Empirical values') + bx.set(xlim=(0, 1), xticks=np.arange(0, 1),ylim=(0, 1000), yticks=np.linspace(0, 1000, 9)) + bx.set_title('V histogram for {} packages (first package size of each box)'.format(P)) + bx.legend() + #H plot + cx = fig.add_subplot(223) + cx.hist(Sum_H, bins=10, linewidth=0.5, edgecolor="white", label='Empirical values') + cx.set(xlim=(0, 10), xticks=np.arange(0, 10),ylim=(0, 2000), yticks=np.linspace(0, 2000, 9)) + cx.set_title('H histogram for {} packages'.format(P)) + cx.legend() + plt.show() for n in range(n): Hn = HSum[n]/R HVariance = sqrt(HSumVariance[n]/(R-1) - Hn**2) @@ -86,7 +130,7 @@ def stats_NFBP_iter(R, 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 packages of random size. """ i = 0 # Nombre de boites R = [0] # Remplissage de la i-eme boite @@ -127,22 +171,24 @@ def stats_NFDBP(R, N): I = [] H = [[] for _ in range(N)] # List of empty lists Tmean=[] + T=[] for i in range(R): sim = simulate_NFDBP(N) I.append(sim["i"]) for n in range(N): H[n].append(sim["H"][n]) - + T=sim["T"] for k in range(sim["i"]): # for o in range(sim["i"]): - Tmean+=sim["T"] + #Tmean+=sim["T"] + Tmean.append(T[k]) + print("Mean number of boxes : {} (variance {})".format(mean(I), variance(I))) for n in range(N): print("Mean H_{} : {} (variance {})".format(n, mean(H[n]), variance(H[n]))) - for k in range(int(mean(I))+1): - print(Tmean[7]) - # print("Mean T_{} : {} (variance {})".format(k, mean(Tmean[k]), variance(Tmean[k]))) + for k in range(int(sim["i"])): + print("Mean T_{} : {} (variance {})".format(k, mean(Tmean), variance(Tmean))) N = 10 ** 1 sim = simulate_NFBP(N) @@ -154,7 +200,7 @@ for j in range(sim["i"] + 1): sim["V"][j])) print() -stats_NFBP(10 ** 4, 10) +stats_NFBP(10 ** 3, 10) N = 10 ** 1 sim = simulate_NFDBP(N) @@ -166,12 +212,11 @@ for j in range(sim["i"] + 1): sim["V"][j])) print() -stats_NFDBP(10 ** 4, 10) -stats_NFBP_iter(10**6, 10) - +stats_NFBP_iter(10**3, 10) +stats_NFDBP(10 ** 3, 10) # -# pyplot.plot([1, 2, 4, 4, 2, 1], color = 'red', linestyle = 'dashed', linewidth = 2, -# markerfacecolor = 'blue', markersize = 5) -# pyplot.ylim(0, 5) -# pyplot.title('Un exemple') - +#pyplot.plot([1, 2, 4, 4, 2, 1], color = 'red', linestyle = 'dashed', linewidth = 2, +#markerfacecolor = 'blue', markersize = 5) +#pyplot.ylim(0, 5) +#pyplot.title('Un exemple') +#show() From ce5b4e560cfa36bf56331155a2f6f7c14bcdc6f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Lacau?= Date: Sat, 3 Jun 2023 17:27:38 +0200 Subject: [PATCH 02/15] aled paul --- Probas.py | 57 +++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 41 insertions(+), 16 deletions(-) diff --git a/Probas.py b/Probas.py index cf40d49..318a39f 100755 --- a/Probas.py +++ b/Probas.py @@ -70,7 +70,7 @@ def stats_NFBP_iter(R, N): IVarianceSum = 0 HSum = [0 for _ in range(N)] HSumVariance = [0 for _ in range(N)] - Sum_T=[] + Sum_T=[0 for _ in range(10)] Sum_V=[] Sum_H=[] for i in range(R): @@ -80,34 +80,36 @@ def stats_NFBP_iter(R, N): for n in range(N): HSum[n] += sim["H"][n] HSumVariance[n] += sim["H"][n]**2 - Sum_T=Sum_T+sim['T'] + T=sim['T'] + for i in range(5): + T.append(0) + Sum_T=[x+y for x,y in zip(Sum_T,T)] Sum_H=Sum_H+sim['H'] for k in range(sim['i']): #we use round to approximate variations of continuous variable V Sum_V.append(round(sim['V'][k],2)) + Sum_T=[x/R for x in Sum_T] + print(Sum_T) I = ISum/R IVariance = sqrt(IVarianceSum/(R-1) - I**2) print("Mean number of boxes : {} (variance {})".format(I, IVariance),'\n') print(" {} * {} iterations of T".format(R,N),'\n') #Plotting - #fig = plt.figure() - #ax = fig.add_subplot(111) #matplotlib.stairs(Sum_T,bins=[0,1,2,3,4]) #ax.hist(Sum_T, bins=8, edgecolor='k', density=True, label='Valeurs empiriques') #ax.set(xlim=(0, 8), xticks=np.arange(1, 8), #ylim=(0, 500), yticks=np.linspace(0, 56, 9)) - #ax.legend() - #plt.show() - #plt.style.use('_mpl-gallery') - #make data #plot: #fig = plt.subplots() fig = plt.figure() #T plot + x = np.arange(7) + print(x) ax = fig.add_subplot(221) - ax.hist(Sum_T, bins=6, linewidth=0.5, edgecolor="white", label='Empirical values') - ax.set(xlim=(0, 6), xticks=np.arange(0, 6),ylim=(0, 6000), yticks=np.linspace(0, 6000, 9)) + ax.bar(x,Sum_T, width=1, edgecolor="white", linewidth=0.7) + # ax.hist(Sum_T, bins=6, linewidth=0.5, edgecolor="white", label='Empirical values') + ax.set(xlim=(0, 10), xticks=np.arange(0, 10),ylim=(0,10), yticks=np.linspace(0, 10, 1)) ax.set_title('T histogram for {} packages (Number of packages in each box)'.format(P)) ax.legend() #V plot @@ -168,27 +170,50 @@ def stats_NFDBP(R, N): Runs R runs of NFDBP (for N packages) and studies distribution, variance, mean... """ print("Running {} NFDBP simulations with {} packages".format(R, N)) + P=N*R I = [] H = [[] for _ in range(N)] # List of empty lists Tmean=[] T=[] + Sum_T=[] + #First iteration to use zip after + sim=simulate_NFDBP(N) + Sum_T=sim["T"] for i in range(R): sim = simulate_NFDBP(N) I.append(sim["i"]) for n in range(N): H[n].append(sim["H"][n]) T=sim["T"] + for k in range(10): + Sum_T.append(0) for k in range(sim["i"]): - # for o in range(sim["i"]): - #Tmean+=sim["T"] Tmean.append(T[k]) - + Sum_T=[x+y for x,y in zip(Sum_T,sim["T"])] + print(Sum_T) + print(sum(Sum_T)) + print(P) + Sum_T=[x*100/(sum(Sum_T)) for x in Sum_T] + print(Sum_T) print("Mean number of boxes : {} (variance {})".format(mean(I), variance(I))) for n in range(N): print("Mean H_{} : {} (variance {})".format(n, mean(H[n]), variance(H[n]))) - for k in range(int(sim["i"])): - print("Mean T_{} : {} (variance {})".format(k, mean(Tmean), variance(Tmean))) + print("Mean T_{} : {} (variance {})".format(k, mean(Tmean), variance(Tmean))) + +#Plotting + fig, ax = plt.subplots() + #T plot + x = 0.5 + np.arange(8) + x=x.tolist() + print(type(x)) + print(x) + ax.bar(x, Sum_T, width=1, edgecolor="white", linewidth=0.5) + ax.set(xlim=(0, 10), xticks=np.arange(0, 10),ylim=(0, 25), yticks=np.linspace(0, 25, 9)) + ax.set_title('Repartition of packets in each box percents for {} packages '.format(P)) + ax.legend() + plt.show() + N = 10 ** 1 sim = simulate_NFBP(N) @@ -213,7 +238,7 @@ for j in range(sim["i"] + 1): print() stats_NFBP_iter(10**3, 10) -stats_NFDBP(10 ** 3, 10) +#stats_NFDBP(10 ** 3, 10) # #pyplot.plot([1, 2, 4, 4, 2, 1], color = 'red', linestyle = 'dashed', linewidth = 2, #markerfacecolor = 'blue', markersize = 5) From 7804bbfc4300f603d19d7167bd7906d6a8ea7ab4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Lacau?= Date: Sat, 3 Jun 2023 22:57:02 +0200 Subject: [PATCH 03/15] Beautiful graphs --- Probas.py | 125 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 72 insertions(+), 53 deletions(-) diff --git a/Probas.py b/Probas.py index 318a39f..0668bbf 100755 --- a/Probas.py +++ b/Probas.py @@ -5,6 +5,7 @@ from statistics import mean, variance from matplotlib import pyplot as plt from pylab import * import numpy as np +import matplotlib.pyplot as pt def simulate_NFBP(N): """ @@ -70,9 +71,8 @@ def stats_NFBP_iter(R, N): IVarianceSum = 0 HSum = [0 for _ in range(N)] HSumVariance = [0 for _ in range(N)] - Sum_T=[0 for _ in range(10)] - Sum_V=[] - Sum_H=[] + Sum_T=[0 for _ in range(N)] + Sum_V=[0 for _ in range(N)] for i in range(R): sim = simulate_NFBP(N) ISum += sim["i"] @@ -81,54 +81,63 @@ def stats_NFBP_iter(R, N): HSum[n] += sim["H"][n] HSumVariance[n] += sim["H"][n]**2 T=sim['T'] - for i in range(5): + V=sim['V'] + for i in range(N): T.append(0) + V.append(0) Sum_T=[x+y for x,y in zip(Sum_T,T)] - Sum_H=Sum_H+sim['H'] - for k in range(sim['i']): + Sum_V=[x+y for x,y in zip(Sum_V,V)] #we use round to approximate variations of continuous variable V - Sum_V.append(round(sim['V'][k],2)) + # Sum_V= round(sim['V'],2)) Sum_T=[x/R for x in Sum_T] - print(Sum_T) + 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 boxes : {} (variance {})".format(I, IVariance),'\n') print(" {} * {} iterations of T".format(R,N),'\n') - + + for n in range(N): + Hn = HSum[n]/R # moyenne + HVariance = sqrt(HSumVariance[n]/(R-1) - Hn**2) # Variance + print("Index of box containing the {}th package (H_{}) : {} (variance {})".format(n, n, Hn, HVariance)) + HSum=[x/R for x in HSum] + print(HSum) #Plotting - #matplotlib.stairs(Sum_T,bins=[0,1,2,3,4]) - #ax.hist(Sum_T, bins=8, edgecolor='k', density=True, label='Valeurs empiriques') - #ax.set(xlim=(0, 8), xticks=np.arange(1, 8), - #ylim=(0, 500), yticks=np.linspace(0, 56, 9)) - #plot: - #fig = plt.subplots() fig = plt.figure() #T plot - x = np.arange(7) + x = np.arange(N) print(x) ax = fig.add_subplot(221) - ax.bar(x,Sum_T, width=1, edgecolor="white", linewidth=0.7) - # ax.hist(Sum_T, bins=6, linewidth=0.5, edgecolor="white", label='Empirical values') - ax.set(xlim=(0, 10), xticks=np.arange(0, 10),ylim=(0,10), yticks=np.linspace(0, 10, 1)) + 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('Boxes (1-{})'.format(N)) ax.set_title('T histogram for {} packages (Number of packages in each box)'.format(P)) - ax.legend() + ax.legend(loc='upper left',title='Legend') #V plot bx = fig.add_subplot(222) - bx.hist(Sum_V, bins=10, linewidth=0.5, edgecolor="white", label='Empirical values') - bx.set(xlim=(0, 1), xticks=np.arange(0, 1),ylim=(0, 1000), yticks=np.linspace(0, 1000, 9)) + 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('Boxes (1-{})'.format(N)) bx.set_title('V histogram for {} packages (first package size of each box)'.format(P)) - bx.legend() + bx.legend(loc='upper left',title='Legend') #H plot - cx = fig.add_subplot(223) - cx.hist(Sum_H, bins=10, linewidth=0.5, edgecolor="white", label='Empirical values') - cx.set(xlim=(0, 10), xticks=np.arange(0, 10),ylim=(0, 2000), yticks=np.linspace(0, 2000, 9)) + #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('Box ranking of n-item') + cx.set_xlabel('n-item (1-{})'.format(N)) cx.set_title('H histogram for {} packages'.format(P)) - cx.legend() + 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() - 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): """ @@ -165,7 +174,7 @@ def simulate_NFDBP(N): } -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... """ @@ -173,9 +182,9 @@ def stats_NFDBP(R, N): P=N*R I = [] H = [[] for _ in range(N)] # List of empty lists - Tmean=[] T=[] - Sum_T=[] + Tk=[[] for _ in range(N)] + Ti=[] #First iteration to use zip after sim=simulate_NFDBP(N) Sum_T=sim["T"] @@ -184,37 +193,47 @@ def stats_NFDBP(R, N): I.append(sim["i"]) for n in range(N): H[n].append(sim["H"][n]) + Tk[n].append(sim["T"][n]) T=sim["T"] - for k in range(10): + Ti.append(sim["T"]) + for k in range(N): Sum_T.append(0) - for k in range(sim["i"]): - Tmean.append(T[k]) - Sum_T=[x+y for x,y in zip(Sum_T,sim["T"])] - print(Sum_T) - print(sum(Sum_T)) - print(P) - Sum_T=[x*100/(sum(Sum_T)) for x in Sum_T] - print(Sum_T) + T.append(0) + 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 + print(Tk) print("Mean number of boxes : {} (variance {})".format(mean(I), variance(I))) for n in range(N): print("Mean H_{} : {} (variance {})".format(n, mean(H[n]), variance(H[n]))) - print("Mean T_{} : {} (variance {})".format(k, mean(Tmean), variance(Tmean))) + print("Mean T_{} : {} (variance {})".format(k, mean(Sum_T), variance(Sum_T))) #Plotting - fig, ax = plt.subplots() + fig = plt.figure() #T plot - x = 0.5 + np.arange(8) - x=x.tolist() - print(type(x)) + x = np.arange(N) print(x) - ax.bar(x, Sum_T, width=1, edgecolor="white", linewidth=0.5) - ax.set(xlim=(0, 10), xticks=np.arange(0, 10),ylim=(0, 25), yticks=np.linspace(0, 25, 9)) - ax.set_title('Repartition of packets in each box percents for {} packages '.format(P)) - ax.legend() + ax = fig.add_subplot(121) + 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('Boxes (1-{})'.format(N)) + ax.set_title('T histogram for {} packages (Number of packages in each box)'.format(P)) + ax.legend(loc='upper left',title='Legend') plt.show() - + #Mathematical P(Ti=k) plot + x = np.arange(N) + print(x) + ax = fig.add_subplot(122) + ax.hist(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('Boxes (1-{})'.format(N)) + ax.set_title('T histogram for {} packages (Number of packages in each box)'.format(P)) + ax.legend(loc='upper left',title='Legend') + plt.show() N = 10 ** 1 sim = simulate_NFBP(N) From 8284d7bf03b4597a3cba6353c22372de6c7a3757 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Lacau?= Date: Sun, 4 Jun 2023 00:28:24 +0200 Subject: [PATCH 04/15] Added many thing, check the code Paul --- Probas.py | 76 +++++++++++++++++++++++++++++++++---------------------- 1 file changed, 46 insertions(+), 30 deletions(-) diff --git a/Probas.py b/Probas.py index 0668bbf..d70d8d6 100755 --- a/Probas.py +++ b/Probas.py @@ -1,6 +1,6 @@ #!/usr/bin/python3 from random import random -from math import floor, sqrt +from math import floor, sqrt,factorial from statistics import mean, variance from matplotlib import pyplot as plt from pylab import * @@ -185,55 +185,77 @@ def stats_NFDBP(R, N,t_i): T=[] Tk=[[] for _ in range(N)] Ti=[] + T_maths=[] #First iteration to use zip after sim=simulate_NFDBP(N) - Sum_T=sim["T"] + Sum_T=[0 for _ in range(N)] for i in range(R): sim = simulate_NFDBP(N) I.append(sim["i"]) + for k in range(N): + T.append(0) + T=sim["T"] for n in range(N): H[n].append(sim["H"][n]) Tk[n].append(sim["T"][n]) - T=sim["T"] Ti.append(sim["T"]) - for k in range(N): - Sum_T.append(0) - T.append(0) 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 - print(Tk) + print("Mean number of boxes : {} (variance {})".format(mean(I), variance(I))) for n in range(N): print("Mean H_{} : {} (variance {})".format(n, mean(H[n]), variance(H[n]))) print("Mean T_{} : {} (variance {})".format(k, mean(Sum_T), variance(Sum_T))) - + #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("hep") + 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) - ax = fig.add_subplot(121) + 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,3), yticks=np.linspace(0, 3, 5)) - ax.set_ylabel('Items') + 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('Boxes (1-{})'.format(N)) - ax.set_title('T histogram for {} packages (Number of packages in each box)'.format(P)) + ax.set_title('Items percentage for each box and {} packages (Number of packages in each box)'.format(P)) ax.legend(loc='upper left',title='Legend') + + #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('Boxes i=(1-{}) in %'.format(N)) + bx.set_title('T{} histogram for {} packages (Number of packages in each box)'.format(t_i,P)) + bx.legend(loc='upper left',title='Legend') + + #Loi mathematique + print(T_maths) + cx = fig.add_subplot(224) + cx.bar(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('Boxes i=(1-{})'.format(N)) + cx.set_title('Theoretical T{} values in %'.format(t_i)) + cx.legend(loc='upper left',title='Legend') plt.show() - #Mathematical P(Ti=k) plot - x = np.arange(N) - print(x) - ax = fig.add_subplot(122) - ax.hist(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('Boxes (1-{})'.format(N)) - ax.set_title('T histogram for {} packages (Number of packages in each box)'.format(P)) - ax.legend(loc='upper left',title='Legend') - plt.show() N = 10 ** 1 sim = simulate_NFBP(N) @@ -257,10 +279,4 @@ for j in range(sim["i"] + 1): print() stats_NFBP_iter(10**3, 10) -#stats_NFDBP(10 ** 3, 10) -# -#pyplot.plot([1, 2, 4, 4, 2, 1], color = 'red', linestyle = 'dashed', linewidth = 2, -#markerfacecolor = 'blue', markersize = 5) -#pyplot.ylim(0, 5) -#pyplot.title('Un exemple') -#show() +stats_NFDBP(10 ** 3, 10,1) From d8b470c9d4c36d610b939bf167d0c3fea48f6eb1 Mon Sep 17 00:00:00 2001 From: Paul ALNET Date: Sun, 4 Jun 2023 07:11:06 +0200 Subject: [PATCH 05/15] fix: rename boxes to bins --- Probas.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/Probas.py b/Probas.py index d70d8d6..2fd03ce 100755 --- a/Probas.py +++ b/Probas.py @@ -55,7 +55,7 @@ def stats_NFBP(R, N): for n in range(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): print("Mean H_{} : {} (variance {})".format(n, mean(H[n]), variance(H[n]))) @@ -94,13 +94,13 @@ def stats_NFBP_iter(R, N): print(Sum_V) I = ISum/R IVariance = sqrt(IVarianceSum/(R-1) - I**2) - print("Mean number of boxes : {} (variance {})".format(I, IVariance),'\n') + print("Mean number of bins : {} (variance {})".format(I, IVariance),'\n') print(" {} * {} iterations of T".format(R,N),'\n') for n in range(N): Hn = HSum[n]/R # moyenne HVariance = sqrt(HSumVariance[n]/(R-1) - Hn**2) # Variance - print("Index of box containing the {}th package (H_{}) : {} (variance {})".format(n, n, Hn, HVariance)) + print("Index of bin containing the {}th package (H_{}) : {} (variance {})".format(n, n, Hn, HVariance)) HSum=[x/R for x in HSum] print(HSum) #Plotting @@ -112,23 +112,23 @@ def stats_NFBP_iter(R, N): 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('Boxes (1-{})'.format(N)) - ax.set_title('T histogram for {} packages (Number of packages in each box)'.format(P)) + ax.set_xlabel('Bins (1-{})'.format(N)) + ax.set_title('T histogram for {} packages (Number of packages 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('Boxes (1-{})'.format(N)) - bx.set_title('V histogram for {} packages (first package size of each box)'.format(P)) + bx.set_xlabel('Bins (1-{})'.format(N)) + bx.set_title('V histogram for {} packages (first package 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('Box ranking of n-item') + cx.set_ylabel('Bin ranking of n-item') cx.set_xlabel('n-item (1-{})'.format(N)) cx.set_title('H histogram for {} packages'.format(P)) xb=linspace(0,N,10) @@ -203,7 +203,7 @@ def stats_NFDBP(R, N,t_i): 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 - 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): print("Mean H_{} : {} (variance {})".format(n, mean(H[n]), variance(H[n]))) @@ -231,8 +231,8 @@ def stats_NFDBP(R, N,t_i): 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('Boxes (1-{})'.format(N)) - ax.set_title('Items percentage for each box and {} packages (Number of packages in each box)'.format(P)) + ax.set_xlabel('Bins (1-{})'.format(N)) + ax.set_title('Items percentage for each bin and {} packages (Number of packages in each bin)'.format(P)) ax.legend(loc='upper left',title='Legend') #Mathematical P(Ti=k) plot. It shows the Ti(t_i) law with the probability of each number of items. @@ -241,8 +241,8 @@ def stats_NFDBP(R, N,t_i): 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('Boxes i=(1-{}) in %'.format(N)) - bx.set_title('T{} histogram for {} packages (Number of packages in each box)'.format(t_i,P)) + bx.set_xlabel('Bins i=(1-{}) in %'.format(N)) + bx.set_title('T{} histogram for {} packages (Number of packages in each bin)'.format(t_i,P)) bx.legend(loc='upper left',title='Legend') #Loi mathematique @@ -251,7 +251,7 @@ def stats_NFDBP(R, N,t_i): cx.bar(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('Boxes i=(1-{})'.format(N)) + cx.set_xlabel('Bins i=(1-{})'.format(N)) cx.set_title('Theoretical T{} values in %'.format(t_i)) cx.legend(loc='upper left',title='Legend') plt.show() From 5f56b578d2e386f73aba904af23c65c82df715ed Mon Sep 17 00:00:00 2001 From: Paul ALNET Date: Sun, 4 Jun 2023 07:14:37 +0200 Subject: [PATCH 06/15] fix: rename packages to items --- Probas.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/Probas.py b/Probas.py index 2fd03ce..14baec0 100755 --- a/Probas.py +++ b/Probas.py @@ -9,7 +9,7 @@ import matplotlib.pyplot as pt def simulate_NFBP(N): """ - Tries to simulate T_i, V_i and H_n for N packages of random size. + Tries to simulate T_i, V_i and H_n for N items of random size. """ i = 0 # Nombre de boites R = [0] # Remplissage de la i-eme boite @@ -43,9 +43,9 @@ def simulate_NFBP(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 = [] H = [[] for _ in range(N)] # List of empty lists @@ -62,11 +62,11 @@ def stats_NFBP(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. """ P=R*N - print("Running {} NFBP simulations with {} packages".format(R, N)) + print("Running {} NFBP simulations with {} items".format(R, N)) ISum = 0 IVarianceSum = 0 HSum = [0 for _ in range(N)] @@ -100,7 +100,7 @@ def stats_NFBP_iter(R, N): for n in range(N): Hn = HSum[n]/R # moyenne HVariance = sqrt(HSumVariance[n]/(R-1) - Hn**2) # Variance - print("Index of bin containing the {}th package (H_{}) : {} (variance {})".format(n, n, Hn, HVariance)) + 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 @@ -113,7 +113,7 @@ def stats_NFBP_iter(R, N): 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 {} packages (Number of packages in each bin)'.format(P)) + 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) @@ -121,7 +121,7 @@ def stats_NFBP_iter(R, N): 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 {} packages (first package size of each bin)'.format(P)) + 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 @@ -130,7 +130,7 @@ def stats_NFBP_iter(R, N): 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 {} packages'.format(P)) + cx.set_title('H histogram for {} items'.format(P)) xb=linspace(0,N,10) yb=Hn*xb/10 wb=HVariance*xb/10 @@ -141,7 +141,7 @@ def stats_NFBP_iter(R, N): def simulate_NFDBP(N): """ - Tries to simulate T_i, V_i and H_n for N packages of random size. + Tries to simulate T_i, V_i and H_n for N items of random size. """ i = 0 # Nombre de boites R = [0] # Remplissage de la i-eme boite @@ -176,9 +176,9 @@ def simulate_NFDBP(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)) P=N*R I = [] H = [[] for _ in range(N)] # List of empty lists @@ -232,7 +232,7 @@ def stats_NFDBP(R, N,t_i): 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 {} packages (Number of packages in each bin)'.format(P)) + ax.set_title('Items percentage for each bin and {} items (Number of items in each bin)'.format(P)) ax.legend(loc='upper left',title='Legend') #Mathematical P(Ti=k) plot. It shows the Ti(t_i) law with the probability of each number of items. @@ -242,7 +242,7 @@ def stats_NFDBP(R, N,t_i): 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 {} packages (Number of packages in each bin)'.format(t_i,P)) + bx.set_title('T{} histogram for {} items (Number of items in each bin)'.format(t_i,P)) bx.legend(loc='upper left',title='Legend') #Loi mathematique From 7bee845a975fc1509bc45891c79f6bc86628a525 Mon Sep 17 00:00:00 2001 From: Paul ALNET Date: Sun, 4 Jun 2023 08:10:42 +0200 Subject: [PATCH 07/15] chore: clean up outputs + add comments --- Probas.py | 45 +++++++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/Probas.py b/Probas.py index 14baec0..1c1c00b 100755 --- a/Probas.py +++ b/Probas.py @@ -11,11 +11,11 @@ def simulate_NFBP(N): """ 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 T = [0] # Nombre de paquets de la i-eme boite V = [0] # Taille du premier paquet de la i-eme boite - 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): size = random() if R[i] + size >= 1: @@ -41,6 +41,7 @@ def simulate_NFBP(N): } +# unused def stats_NFBP(R, N): """ Runs R runs of NFBP (for N items) and studies distribution, variance, mean... @@ -65,14 +66,19 @@ def stats_NFBP_iter(R, N): 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. """ - P=R*N - print("Running {} NFBP simulations with {} items".format(R, N)) - ISum = 0 + P=R*N # Total number of items + print("## Running {} NFBP simulations with {} items".format(R, N)) + # number of bins + ISum = 0 IVarianceSum = 0 - HSum = [0 for _ in range(N)] + # index of the bin containing the n-th item + HSum = [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): sim = simulate_NFBP(N) ISum += sim["i"] @@ -87,14 +93,13 @@ def stats_NFBP_iter(R, N): 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)] - #we use round to approximate variations of continuous variable V - # Sum_V= round(sim['V'],2)) Sum_T=[x/R for x in Sum_T] Sum_V=[round(x/R,2) for x in Sum_V] - print(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(N): @@ -102,12 +107,12 @@ def stats_NFBP_iter(R, N): 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) + # print(HSum) #Plotting fig = plt.figure() #T plot x = np.arange(N) - print(x) + # 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)) @@ -142,12 +147,13 @@ def stats_NFBP_iter(R, N): def simulate_NFDBP(N): """ 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 T = [0] # Nombre de paquets de la i-eme boite V = [0] # Taille du premier paquet de la i-eme boite - 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): size = random() R[i] += size @@ -178,9 +184,9 @@ def stats_NFDBP(R, N,t_i): """ Runs R runs of NFDBP (for N items) and studies distribution, variance, mean... """ - print("Running {} NFDBP simulations with {} items".format(R, N)) - P=N*R - I = [] + print("## Running {} NFDBP simulations with {} items".format(R, N)) + P=N*R # Total number of items + I = [] H = [[] for _ in range(N)] # List of empty lists T=[] Tk=[[] for _ in range(N)] @@ -214,14 +220,13 @@ def stats_NFDBP(R, N,t_i): T_maths.append(1/(factorial(u-1))-1/factorial(u)) E=0 sigma2=0 - print("hep") - print(T_maths) + # 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 + #Plotting fig = plt.figure() #T plot x = np.arange(N) @@ -277,6 +282,6 @@ for j in range(sim["i"] + 1): sim["T"][j], sim["V"][j])) -print() stats_NFBP_iter(10**3, 10) +print('\n\n') stats_NFDBP(10 ** 3, 10,1) From 0cdc13b86983263e279f43a6d69fbf1b8151a9c1 Mon Sep 17 00:00:00 2001 From: Paul ALNET Date: Sun, 4 Jun 2023 08:11:26 +0200 Subject: [PATCH 08/15] chore: clean up "zero padding" --- Probas.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Probas.py b/Probas.py index 1c1c00b..2606a7d 100755 --- a/Probas.py +++ b/Probas.py @@ -88,11 +88,13 @@ def stats_NFBP_iter(R, N): HSumVariance[n] += sim["H"][n]**2 T=sim['T'] V=sim['V'] - for i in range(N): + # 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)] + Sum_T=[x/R for x in Sum_T] Sum_V=[round(x/R,2) for x in Sum_V] #print(Sum_V) @@ -102,7 +104,7 @@ def stats_NFBP_iter(R, N): # TODO clarify line below print(" {} * {} iterations of T".format(R,N),'\n') - for n in range(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)) From cf7a4cf7a6d5e0708929d1f63491094f985ffcdb Mon Sep 17 00:00:00 2001 From: Paul ALNET Date: Sun, 4 Jun 2023 08:12:10 +0200 Subject: [PATCH 09/15] chore: move legacy output to unused function --- Probas.py | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/Probas.py b/Probas.py index 2606a7d..525b176 100755 --- a/Probas.py +++ b/Probas.py @@ -263,27 +263,29 @@ def stats_NFDBP(R, N,t_i): cx.legend(loc='upper left',title='Legend') plt.show() -N = 10 ** 1 -sim = simulate_NFBP(N) +# unused +def basic_demo(): + N = 10 ** 1 + sim = simulate_NFBP(N) -print("Simulation NFBP pour {} packaets. Contenu des boites :".format(N)) -for j in range(sim["i"] + 1): - 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() -stats_NFBP(10 ** 3, 10) - -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 à {} % avec {} paquets. Taille du premier paquet : {}".format(j, remplissage, - sim["T"][j], + print("Simulation NFBP pour {} packaets. Contenu des boites :".format(N)) + for j in range(sim["i"] + 1): + 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() + stats_NFBP(10 ** 3, 10) + + 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 à {} % 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) From 7e0c5a84bbcd8f63b4c07472211e208aef30ee31 Mon Sep 17 00:00:00 2001 From: Paul ALNET Date: Sun, 4 Jun 2023 08:12:30 +0200 Subject: [PATCH 10/15] fix: correct NFDBP algo --- Probas.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/Probas.py b/Probas.py index 525b176..6aaff1f 100755 --- a/Probas.py +++ b/Probas.py @@ -158,20 +158,18 @@ def simulate_NFDBP(N): H = [] # Rang de la boite contenant le n-ieme paquet for n in range(N): size = random() - R[i] += size - T[i] += 1 - if R[i] + size >= 1: + if R[i] >= 1: # 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 à la boite suivante (qu'on initialise). i += 1 R.append(0) T.append(0) - V.append(0) - - if V[i] == 0: # C'est le premier paquet de la boite - V[i] = size + V.append(size) H.append(i) + R[i] += size + T[i] += 1 + return { "i": i, From 6bb38429d15fecd828b06a90393cc493ebecea99 Mon Sep 17 00:00:00 2001 From: Paul ALNET Date: Sun, 4 Jun 2023 08:17:35 +0200 Subject: [PATCH 11/15] fix: V_i in NFDBP algo --- Probas.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Probas.py b/Probas.py index 6aaff1f..3e86726 100755 --- a/Probas.py +++ b/Probas.py @@ -164,13 +164,14 @@ def simulate_NFDBP(N): i += 1 R.append(0) T.append(0) + V.append(0) + if V[i] == 0: # C'est le premier paquet de la boite - V.append(size) + V[i] = size H.append(i) R[i] += size T[i] += 1 - return { "i": i, "R": R, From 316c910c3a50b2a9467abdc7a1f9d958cc7d0a2e Mon Sep 17 00:00:00 2001 From: Paul ALNET Date: Sun, 4 Jun 2023 08:27:24 +0200 Subject: [PATCH 12/15] chore: lint --- Probas.py | 345 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 213 insertions(+), 132 deletions(-) diff --git a/Probas.py b/Probas.py index 3e86726..f7009c0 100755 --- a/Probas.py +++ b/Probas.py @@ -1,21 +1,22 @@ #!/usr/bin/python3 from random import random -from math import floor, sqrt,factorial +from math import floor, sqrt, factorial from statistics import mean, variance from matplotlib import pyplot as plt from pylab import * import numpy as np import matplotlib.pyplot as pt + def simulate_NFBP(N): """ 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 T = [0] # Nombre de paquets de la i-eme boite V = [0] # Taille du premier paquet de la i-eme boite - 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): size = random() if R[i] + size >= 1: @@ -32,13 +33,7 @@ def simulate_NFBP(N): V[i] = size H.append(i) - return { - "i": i, - "R": R, - "T": T, - "V": V, - "H": H - } + return {"i": i, "R": R, "T": T, "V": V, "H": H} # unused @@ -49,7 +44,7 @@ def stats_NFBP(R, N): print("Running {} NFBP simulations with {} items".format(R, N)) I = [] H = [[] for _ in range(N)] # List of empty lists - + for i in range(R): sim = simulate_NFBP(N) I.append(sim["i"]) @@ -61,101 +56,137 @@ def stats_NFBP(R, N): for n in range(N): print("Mean H_{} : {} (variance {})".format(n, mean(H[n]), variance(H[n]))) + def stats_NFBP_iter(R, N): """ 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. """ - P=R*N # Total number of items + 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 # 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)] # number of items in the i-th bin - Sum_T=[0 for _ in range(N)] + Sum_T = [0 for _ in range(N)] # size of the first item in the i-th bin - Sum_V=[0 for _ in range(N)] + Sum_V = [0 for _ in range(N)] for i in range(R): sim = simulate_NFBP(N) ISum += sim["i"] - IVarianceSum += sim["i"]**2 + IVarianceSum += sim["i"] ** 2 for n in range(N): HSum[n] += sim["H"][n] - HSumVariance[n] += sim["H"][n]**2 - T=sim['T'] - V=sim['V'] + 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']): + 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)] + Sum_T = [x + y for x, y in zip(Sum_T, T)] + Sum_V = [x + y for x, y in zip(Sum_V, V)] - Sum_T=[x/R for x in Sum_T] - 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') + Sum_T = [x / R for x in Sum_T] + 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') - + 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] + 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 + # Plotting fig = plt.figure() - #T plot - x = np.arange(N) + # 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 + 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() + 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() + def simulate_NFDBP(N): """ 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 T = [0] # Nombre de paquets de la i-eme boite V = [0] # Taille du premier paquet de la i-eme boite - 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): size = random() if R[i] >= 1: @@ -172,119 +203,169 @@ def simulate_NFDBP(N): R[i] += size T[i] += 1 - return { - "i": i, - "R": R, - "T": T, - "V": V, - "H": H - } + return {"i": i, "R": R, "T": T, "V": V, "H": H} -def stats_NFDBP(R, N,t_i): +def stats_NFDBP(R, N, t_i): """ Runs R runs of NFDBP (for N items) and studies distribution, variance, mean... """ print("## Running {} NFDBP simulations with {} items".format(R, N)) - P=N*R # Total number of items - I = [] + # TODO comment this function + P = N * R # Total number of items + I = [] H = [[] for _ in range(N)] # List of empty lists - 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)] + 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): sim = simulate_NFDBP(N) I.append(sim["i"]) for k in range(N): T.append(0) - T=sim["T"] + T = sim["T"] for n in range(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 - + 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 + print("Mean number of bins : {} (variance {})".format(mean(I), variance(I))) for n in range(N): print("Mean H_{} : {} (variance {})".format(n, mean(H[n]), variance(H[n]))) print("Mean T_{} : {} (variance {})".format(k, mean(Sum_T), variance(Sum_T))) - #Loi math + # Loi math for u in range(N): - u=u+2 - T_maths.append(1/(factorial(u-1))-1/factorial(u)) - E=0 - sigma2=0 + 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 + 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) + # 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 left',title='Legend') + 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 left", title="Legend") - #Mathematical P(Ti=k) plot. It shows the Ti(t_i) law with the probability of each number of items. + # 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 left',title='Legend') + 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 left", title="Legend") - #Loi mathematique + # Loi mathematique print(T_maths) cx = fig.add_subplot(224) - cx.bar(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 left',title='Legend') + cx.bar( + 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 left", title="Legend") plt.show() + # unused def basic_demo(): - N = 10 ** 1 + N = 10**1 sim = simulate_NFBP(N) print("Simulation NFBP pour {} packaets. Contenu des boites :".format(N)) for j in range(sim["i"] + 1): 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( + "Boite {} : Rempli à {} % avec {} paquets. Taille du premier paquet : {}".format( + j, remplissage, sim["T"][j], sim["V"][j] + ) + ) print() - stats_NFBP(10 ** 3, 10) + stats_NFBP(10**3, 10) - N = 10 ** 1 + 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 à {} % avec {} paquets. Taille du premier paquet : {}".format(j, remplissage, - sim["T"][j], - sim["V"][j])) + print( + "Boite {} : Rempli à {} % 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) +print("\n\n") +stats_NFDBP(10**3, 10, 1) From 6cd6df4b89d80067126d0b42b277f0ed1b1f23ca Mon Sep 17 00:00:00 2001 From: Paul ALNET Date: Sun, 4 Jun 2023 08:39:29 +0200 Subject: [PATCH 13/15] fix: better legend placement on graphs --- Probas.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Probas.py b/Probas.py index f7009c0..f3ebd2c 100755 --- a/Probas.py +++ b/Probas.py @@ -285,7 +285,7 @@ def stats_NFDBP(R, N, t_i): P ) ) - ax.legend(loc="upper left", title="Legend") + ax.legend(loc="upper right", title="Legend") # 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])) @@ -310,7 +310,7 @@ def stats_NFDBP(R, N, t_i): bx.set_title( "T{} histogram for {} items (Number of items in each bin)".format(t_i, P) ) - bx.legend(loc="upper left", title="Legend") + bx.legend(loc="upper right", title="Legend") # Loi mathematique print(T_maths) @@ -333,7 +333,7 @@ def stats_NFDBP(R, N, t_i): 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 left", title="Legend") + cx.legend(loc="upper right", title="Legend") plt.show() From 67bc7efd5ca42c3048600e86f63104775e4bcbd3 Mon Sep 17 00:00:00 2001 From: Paul ALNET Date: Sun, 4 Jun 2023 08:39:42 +0200 Subject: [PATCH 14/15] chore: add todos --- Probas.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Probas.py b/Probas.py index f3ebd2c..12f1529 100755 --- a/Probas.py +++ b/Probas.py @@ -242,6 +242,7 @@ def stats_NFDBP(R, N, t_i): for n in range(N): print("Mean H_{} : {} (variance {})".format(n, mean(H[n]), variance(H[n]))) + # TODO variance for T_k doesn't see right print("Mean T_{} : {} (variance {})".format(k, mean(Sum_T), variance(Sum_T))) # Loi math for u in range(N): @@ -287,6 +288,7 @@ def stats_NFDBP(R, N, t_i): ) ax.legend(loc="upper right", title="Legend") + # TODO fix the graph below # 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) From 8fa29790f84659cef28f0d96f929aacf11de702c Mon Sep 17 00:00:00 2001 From: Paul ALNET Date: Sun, 4 Jun 2023 08:50:00 +0200 Subject: [PATCH 15/15] fix: remove accents in python script --- Probas.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Probas.py b/Probas.py index 12f1529..ccfa45e 100755 --- a/Probas.py +++ b/Probas.py @@ -21,7 +21,7 @@ def simulate_NFBP(N): size = random() if R[i] + size >= 1: # 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 R.append(0) T.append(0) @@ -191,7 +191,7 @@ def simulate_NFDBP(N): size = random() if R[i] >= 1: # 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 R.append(0) T.append(0) @@ -348,7 +348,7 @@ def basic_demo(): for j in range(sim["i"] + 1): remplissage = floor(sim["R"][j] * 100) print( - "Boite {} : Rempli à {} % avec {} paquets. Taille du premier paquet : {}".format( + "Boite {} : Rempli a {} % avec {} paquets. Taille du premier paquet : {}".format( j, remplissage, sim["T"][j], sim["V"][j] ) ) @@ -362,7 +362,7 @@ def basic_demo(): for j in range(sim["i"] + 1): remplissage = floor(sim["R"][j] * 100) print( - "Boite {} : Rempli à {} % avec {} paquets. Taille du premier paquet : {}".format( + "Boite {} : Rempli a {} % avec {} paquets. Taille du premier paquet : {}".format( j, remplissage, sim["T"][j], sim["V"][j] ) )