Projet_Boites/Boxes.ipynb

350 lines
34 KiB
Text

{
"cells": [
{
"cell_type": "code",
"execution_count": 2,
"id": "006fa323-7c7c-49ab-adb2-33744bd08eb6",
"metadata": {
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Simulation NFBP pour 10 packaets. Contenu des boites :\n",
"Boite 0 : Rempli à 90 % avec 1 paquets. Taille du premier paquet : 0.9012353376749183\n",
"Boite 1 : Rempli à 73 % avec 1 paquets. Taille du premier paquet : 0.7398609903279183\n",
"Boite 2 : Rempli à 66 % avec 1 paquets. Taille du premier paquet : 0.6648347523159137\n",
"Boite 3 : Rempli à 95 % avec 1 paquets. Taille du premier paquet : 0.9586744885370793\n",
"Boite 4 : Rempli à 82 % avec 2 paquets. Taille du premier paquet : 0.418132315478732\n",
"Boite 5 : Rempli à 87 % avec 2 paquets. Taille du premier paquet : 0.6224721961409336\n",
"Boite 6 : Rempli à 46 % avec 2 paquets. Taille du premier paquet : 0.3438108698091238\n",
"\n",
"Running 10000 NFBP simulations with 10 packages\n",
"Mean number of boxes : 5.8359 (variance 1.6849396839683968)\n",
"Mean H_0 : 0 (variance 0)\n",
"Mean H_1 : 0.4964 (variance 0.2500120412041204)\n",
"Mean H_2 : 1.1688 (variance 0.4729538553855386)\n",
"Mean H_3 : 1.832 (variance 0.6382398239823982)\n",
"Mean H_4 : 2.4946 (variance 0.8252533653365337)\n",
"Mean H_5 : 3.1688 (variance 0.9942059805980598)\n",
"Mean H_6 : 3.8353 (variance 1.1706909790979099)\n",
"Mean H_7 : 4.5031 (variance 1.3503254225422543)\n",
"Mean H_8 : 5.1693 (variance 1.5231898289828982)\n",
"Mean H_9 : 5.8359 (variance 1.6849396839683968)\n",
"Simulation NFDBP pour 10 packaets. Contenu des boites :\n",
"Boite 0 : Rempli à 108 % avec 2 paquets. Taille du premier paquet : 0.31147794138922824\n",
"Boite 1 : Rempli à 80 % avec 1 paquets. Taille du premier paquet : 0.7782870817572142\n",
"Boite 2 : Rempli à 85 % avec 1 paquets. Taille du premier paquet : 0.8059423646487478\n",
"Boite 3 : Rempli à 69 % avec 1 paquets. Taille du premier paquet : 0.8549206795563353\n",
"Boite 4 : Rempli à 96 % avec 1 paquets. Taille du premier paquet : 0.6945935478502687\n",
"Boite 5 : Rempli à 127 % avec 2 paquets. Taille du premier paquet : 0.9654096847466607\n",
"Boite 6 : Rempli à 144 % avec 2 paquets. Taille du premier paquet : 0.956489281461433\n",
"Boite 7 : Rempli à 0 % avec 0 paquets. Taille du premier paquet : 0.9563109133116375\n",
"\n",
"Running 10000 NFDBP simulations with 10 packages\n",
"Mean number of boxes : 5.6153 (variance 1.721878097809781)\n",
"Mean H_0 : 0.4911 (variance 0.24994578457845784)\n",
"Mean H_1 : 1.0521 (variance 0.4324288328832883)\n",
"Mean H_2 : 1.6291 (variance 0.5937925692569257)\n",
"Mean H_3 : 2.1943 (variance 0.7550230123012301)\n",
"Mean H_4 : 2.7608 (variance 0.9154749074907491)\n",
"Mean H_5 : 3.3345 (variance 1.080517801780178)\n",
"Mean H_6 : 3.8997 (variance 1.2417640864086408)\n",
"Mean H_7 : 4.4661 (variance 1.404991289128913)\n",
"Mean H_8 : 5.0421 (variance 1.5466822582258226)\n",
"Mean H_9 : 5.6153 (variance 1.721878097809781)\n",
"[2, 1, 2, 1, 1, 1, 2]\n",
"[2, 1, 2, 1, 1, 1, 2]\n",
"[2, 1, 2, 1, 1, 1, 2]\n",
"[2, 1, 2, 1, 1, 1, 2]\n",
"[2, 1, 2, 1, 1, 1, 2]\n",
"[2, 1, 2, 1, 1, 1, 2]\n",
"Mean T_0 : 2.1370185030185387\n",
"Mean T_1 : 1.9589336277669935\n",
"Mean T_2 : 1.9589336277669935\n",
"Mean T_3 : 2.493188253521628\n",
"Mean T_4 : 1.424679002012359\n",
"Mean T_5 : 0.0\n",
"Mean T_6 : 0.0\n"
]
},
{
"data": {
"image/png": "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iY2NNb169TKzZ882Z8+e9evnu910yZIlfu179uwxksyCBQsu+VqHDh0y2dnZJjU11TRt2tS0b9/ejBs3zsyfP98YY8yGDRtMkyZN/G7tNMaYCxcumCFDhpiUlBRz/Pjxivb58+ebwYMHm/j4eNOyZUvTr18/8+STT5r9+/dX9OncubOZOHFilVokmezs7IDv5Te/+U1FW1ZWlmnevLnZtWuXSUtLM82aNTPJyckmJyfHlJWVVfmdlW83rcl7BlB7HmMszIgCgBC6//779eabb+rUqVPhLgXARZhjAQAArCFYAAAAawgWAADAmqCCxaxZs+TxePx+evXqVVe1AUBACxcuZH4FUE8Ffbtpnz59/Nbhb9KEO1YBAIAj6FTQpEkTtW/fvi5qAQAAES7oYLFjxw6lpKQoLi5Ow4cPV25ubpXNhCorLS1VaWlpxePy8nIdO3ZMbdu2DbiZEgAAqH+MMTp58qRSUlIUFVX9TIqg1rFYtmyZTp06pZ49e+rAgQOaPXu29u3bp61bt6ply5YBnzNr1izNnj07+HcAAADqnb1796pjx47VHr+sBbJOnDihzp0767nnntPUqVMD9rn4ioXX61WnTp20d+9eJSQk1PalAQBACBUXFys1NVUnTpyo2HwwkMuaedmqVSv16NFDO3furLZPbGysYmNjq7QnJCQQLAAAiDCXmsZwWetYnDp1Srt27VKHDh0u59cAAIAGIqhg8fjjj6uoqEhffvml1q5dq+9+97uKjo7W3XffXVf1AQCACBLUUMjXX3+tu+++W998843atWun66+/XuvXr//WLYoBAEDjEVSwWLx4cV3VAQAAGgD2CgEAANYQLAAAgDUECwAAYA3BAgAAWEOwAAAA1hAsAACANQQLAABgDcECAABYQ7AAAADWECwAAIA1BAsAAGANwQIAAFhDsAAAANYQLAAAgDUECwAAYA3BAgAAWEOwAAAA1hAsAACANQQLAABgDcECAABYQ7AAAADWECwAAIA1BAsAAGANwQIAAFhDsAAAANYQLAAAgDUECwAAYA3BAgAAWEOwAAAA1hAsAACANQQLAABgDcECAABYQ7AAAADWECwAAIA1BAsAAGANwQIAAFhDsAAAANYQLAAAgDUECwAAYA3BAgAAWEOwAAAA1hAsAACANQQLAABgDcECAABYQ7AAAADWECwAAIA1BAsAAGAN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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 200x200 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from random import random\n",
"from math import floor, sqrt\n",
"from statistics import mean, variance\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"\n",
"# from matplotlib import pyplot\n",
"\n",
"def simulate_NFBP(N):\n",
" \"\"\"\n",
" Tries to simulate T_i, V_i and H_n for N boxes of random size.\n",
" \"\"\"\n",
" i = 0 # Nombre de boites\n",
" R = [0] # Remplissage de la i-eme boite\n",
" T = [0] # Nombre de paquets de la i-eme boite\n",
" V = [0] # Taille du premier paquet de la i-eme boite\n",
" H = [] # Rang de la boite contenant le n-ieme paquet\n",
" for n in range(N):\n",
" size = random()\n",
" if R[i] + size >= 1:\n",
" # Il y n'y a plus de la place dans la boite pour le paquet.\n",
" # On passe à la boite suivante (qu'on initialise)\n",
" i += 1\n",
" R.append(0)\n",
" T.append(0)\n",
" V.append(0)\n",
" R[i] += size\n",
" T[i] += 1\n",
" if V[i] == 0:\n",
" # C'est le premier paquet de la boite\n",
" V[i] = size\n",
" H.append(i)\n",
"\n",
" return {\n",
" \"i\": i,\n",
" \"R\": R,\n",
" \"T\": T,\n",
" \"V\": V,\n",
" \"H\": H\n",
" }\n",
"\n",
"\n",
"def stats_NFBP(R, N):\n",
" \"\"\"\n",
" Runs R runs of NFBP (for N packages) and studies distribution, variance, mean...\n",
" \"\"\"\n",
" print(\"Running {} NFBP simulations with {} packages\".format(R, N))\n",
" I = []\n",
" H = [[] for _ in range(N)] # List of empty lists\n",
"\n",
" for i in range(R):\n",
" sim = simulate_NFBP(N)\n",
" I.append(sim[\"i\"])\n",
" for n in range(N):\n",
" H[n].append(sim[\"H\"][n])\n",
"\n",
" print(\"Mean number of boxes : {} (variance {})\".format(mean(I), variance(I)))\n",
"\n",
" for n in range(N):\n",
" print(\"Mean H_{} : {} (variance {})\".format(n, mean(H[n]), variance(H[n])))\n",
"\n",
"\n",
"def simulate_NFDBP(N):\n",
" \"\"\"\n",
" Tries to simulate T_i, V_i and H_n for N boxes of random size.\n",
" \"\"\"\n",
" i = 0 # Nombre de boites\n",
" R = [0] # Remplissage de la i-eme boite\n",
" T = [0] # Nombre de paquets de la i-eme boite\n",
" V = [0] # Taille du premier paquet de la i-eme boite\n",
" H = [] # Rang de la boite contenant le n-ieme paquet\n",
" for n in range(N):\n",
" size = random()\n",
" R[i] += size\n",
" T[i] += 1\n",
" if R[i] + size >= 1:\n",
" # Il y n'y a plus de la place dans la boite pour le paquet.\n",
" # On passe à la boite suivante (qu'on initialise)\n",
" i += 1\n",
" R.append(0)\n",
" T.append(0)\n",
" V.append(0)\n",
"\n",
" if V[i] == 0:\n",
" # C'est le premier paquet de la boite\n",
" V[i] = size\n",
" H.append(i)\n",
"\n",
" return {\n",
" \"i\": i,\n",
" \"R\": R,\n",
" \"T\": T,\n",
" \"V\": V,\n",
" \"H\": H\n",
" }\n",
"\n",
"\n",
"def stats_NFDBP(R, N):\n",
" \"\"\"\n",
" Runs R runs of NFDBP (for N packages) and studies distribution, variance, mean...\n",
" \"\"\"\n",
" print(\"Running {} NFDBP simulations with {} packages\".format(R, N))\n",
" I = []\n",
" H = [[] for _ in range(N)] # List of empty lists\n",
" Tmean=[]\n",
" Tn=[]\n",
" Tn.append(0)\n",
" Tn.append(0)\n",
" Tn.append(0)\n",
" Tn.append(0)\n",
" Tn.append(0)\n",
" Tn.append(0)\n",
" Tn.append(0)\n",
"\n",
"\n",
"\n",
"\n",
"\n",
" for i in range(R):\n",
" sim = simulate_NFDBP(N)\n",
" I.append(sim[\"i\"])\n",
" for n in range(N):\n",
" H[n].append(sim[\"H\"][n])\n",
"\n",
"\n",
" Tmean.append(sim[\"T\"])\n",
" \n",
" # for k in range(len(sim[\"T\"])+1):\n",
"\n",
" # if Tmean[i][k] == 1:\n",
" # Tn[k]+=Tmean[i][k]\n",
" # elif Tmean[i][k] == 2:\n",
" # Tn[k]+=Tmean[i][k]\n",
" # elif Tmean[i][k] == 3:\n",
" # Tn[k] +=Tmean[i][k]\n",
" print(\"Mean number of boxes : {} (variance {})\".format(mean(I), variance(I)))\n",
"\n",
" for n in range(N):\n",
" print(\"Mean H_{} : {} (variance {})\".format(n, mean(H[n]), variance(H[n])))\n",
" \n",
" for i in range(int(mean(I))+1):\n",
" print(Tmean[7])\n",
" for k in range(len(Tmean[0])-1):\n",
" Tn[k]+=Tmean[i][k]\n",
" for i in range(len(Tn)):\n",
" Tn[i]=Tn[i]/mean(I)\n",
" print(\"Mean T_{} : {}\".format(i, Tn[i]))\n",
" \n",
" plt.plot((mean(H[1]),mean(H[2]),mean(H[3]),mean(H[4])), color = 'red', linestyle = 'dashed', linewidth = 2,markerfacecolor = 'blue', markersize = 5)\n",
" plt.ylim(0, 5)\n",
" plt.title('Un exemple')\n",
" # print(\"Mean T_{} : {} (variance {})\".format(k, mean(Tmean[k]), variance(Tmean[k])))\n",
" \n",
"N = 10 ** 1\n",
"sim = simulate_NFBP(N)\n",
"\n",
"print(\"Simulation NFBP pour {} packaets. Contenu des boites :\".format(N))\n",
"for j in range(sim[\"i\"] + 1):\n",
" remplissage = floor(sim[\"R\"][j] * 100)\n",
" print(\"Boite {} : Rempli à {} % avec {} paquets. Taille du premier paquet : {}\".format(j, remplissage, sim[\"T\"][j],\n",
" sim[\"V\"][j]))\n",
"\n",
"print()\n",
"stats_NFBP(10 ** 4, 10)\n",
"\n",
"N = 10 ** 1\n",
"sim = simulate_NFDBP(N)\n",
"print(\"Simulation NFDBP pour {} packaets. Contenu des boites :\".format(N))\n",
"for j in range(sim[\"i\"] + 1):\n",
" remplissage = floor(sim[\"R\"][j] * 100)\n",
" print(\"Boite {} : Rempli à {} % avec {} paquets. Taille du premier paquet : {}\".format(j, remplissage,\n",
" sim[\"T\"][j],\n",
" sim[\"V\"][j]))\n",
"\n",
"print()\n",
"stats_NFDBP(10 ** 4, 10)\n",
"\n",
"\n",
"#Debut de l'illustration\n",
"\n",
"plt.style.use('_mpl-gallery')\n",
"\n",
"# make data\n",
"np.random.seed(1)\n",
"x = 4 + np.random.normal(0, 1.5, 200)\n",
"\n",
"# plot:\n",
"fig, ax = plt.subplots()\n",
"\n",
"ax.hist(x, bins=8, linewidth=0.5, edgecolor=\"white\")\n",
"\n",
"ax.set(xlim=(0, 9), xticks=np.arange(1, 9),\n",
" ylim=(0, 8), yticks=np.linspace(0, 8, 9))\n",
"\n",
"plt.show()\n",
"\n",
"\n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "b2c8c9aa-5136-4cd7-84c1-218ff5ba924c",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "98de2b0d-fa9e-4565-a548-211d227cd026",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "738920b2",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "240a6135",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.4"
}
},
"nbformat": 4,
"nbformat_minor": 5
}