On observe en particulier que la partie de gauche de la précédente matrice est la matrice identité. L'algorithme de Gauss-Jordan indique alors que la partie de droite est la matrice inverse.
\n",
"Observez les opérations suivantes qui permettent de réaliser ce processus sur la seconde matrice exemple.
\n",
"\n",
"A l'issu de toutes ces exécutions la matrice inverse s'approche par \n",
"$$\\begin{pmatrix}\n",
" 0.5& -0.15& 0.25& -0.4\\\\\n",
"-0.5& 0.25& -0.75& 1.0\\\\\n",
" 0.5& -0.4 & 1.0 & -0.9\\\\\n",
"-0.5& 0.5 & -0.5 & 0.5\n",
"\\end{pmatrix}$$\n",
"
"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "de6fbf7d-8042-4c85-a718-00a254d3baa5",
"metadata": {},
"outputs": [],
"source": [
"exemple2_A_1 = operationGaussCombinaison(exemple2_A_0, 1, 0, -exemple2_A_0[1][0])\n",
"exemple2_A_2 = operationGaussCombinaison(exemple2_A_1, 2, 0, -exemple2_A_1[2][0])\n",
"exemple2_A_3 = operationGaussCombinaison(exemple2_A_2, 3, 0, -exemple2_A_2[3][0])\n",
"\n",
"print(\"Exemple 2\")\n",
"print(\"Matrice de départ\")\n",
"printM(exemple2)\n",
"print(\"Matrice augmentée\")\n",
"printM(exemple2_A)\n",
"print(\"Échange : L_3<->L_1\")\n",
"printM(exemple2_A_0)\n",
"print(\"Combinaison : L2<-L2-3L1\")\n",
"printM(exemple2_A_1)\n",
"print(\"Combinaison : L3<-L2-4L1\")\n",
"printM(exemple2_A_2)\n",
"print(\"Combinaison : L4<-L4-2L1\")\n",
"printM(exemple2_A_3)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "adb87e91-b5a0-430e-9813-731139c2502f",
"metadata": {},
"outputs": [],
"source": [
"#Permet de faire apparaitre un '1' (pivot)\n",
"exemple2_A_4 = operationGaussDilatation(exemple2_A_3, 1, 1/exemple2_A_3[1][1]) \n",
"\n",
"#Utilise le pivot pour faire apparaitre des '0'\n",
"exemple2_A_5 = operationGaussCombinaison(exemple2_A_4, 2, 1, -exemple2_A_4[2][1])\n",
"exemple2_A_6 = operationGaussCombinaison(exemple2_A_5, 3, 1, -exemple2_A_5[3][1])\n",
"\n",
"\n",
"print(\"Dernière itération de l'algorithme\")\n",
"printM(exemple2_A_3)\n",
"print(\"Faire apparaitre un '1' dans la seconde ligne (pivot)\")\n",
"printM(exemple2_A_4)\n",
"print(\"Faire apparaitre des '0' dans le reste de la colonne\")\n",
"printM(exemple2_A_6)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e0f1f3e6-644b-4b34-9198-9f3aad35529a",
"metadata": {},
"outputs": [],
"source": [
"#Permet de faire apparaitre un '1' (pivot)\n",
"exemple2_A_7 = operationGaussDilatation(exemple2_A_6, 2, 1/exemple2_A_6[2][2]) \n",
"\n",
"#Utilise le pivot pour faire apparaitre des '0'\n",
"exemple2_A_8 = operationGaussCombinaison(exemple2_A_7, 3, 2, -exemple2_A_7[3][2])\n",
"\n",
"\n",
"print(\"Dernière itération de l'algorithme\")\n",
"printM(exemple2_A_6)\n",
"print(\"Faire apparaitre un '1' dans la troisième ligne (pivot)\")\n",
"printM(exemple2_A_7)\n",
"print(\"Faire apparaitre des '0' dans le reste de la colonne\")\n",
"printM(exemple2_A_8)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d358a5f8-a598-4957-95af-bb100464280e",
"metadata": {},
"outputs": [],
"source": [
"exemple2_A_9 = operationGaussDilatation(exemple2_A_8, 3, 1/exemple2_A_8[3][3])\n",
"\n",
"exemple2_A_10 = operationGaussCombinaison(exemple2_A_9, 2, 3, -exemple2_A_9[2][3])\n",
"exemple2_A_11 = operationGaussCombinaison(exemple2_A_10, 1, 3, -exemple2_A_10[1][3])\n",
"exemple2_A_12 = operationGaussCombinaison(exemple2_A_11, 0, 3, -exemple2_A_11[0][3])\n",
"\n",
"exemple2_A_13 = operationGaussCombinaison(exemple2_A_12, 1, 2, -exemple2_A_12[1][2])\n",
"exemple2_A_14 = operationGaussCombinaison(exemple2_A_13, 0, 2, -exemple2_A_13[0][2])\n",
"\n",
"exemple2_A_15 = operationGaussCombinaison(exemple2_A_14, 0, 1, -exemple2_A_14[0][1])\n",
"\n",
"print(\"Dernière itération de l'algorithme\")\n",
"printM(exemple2_A_8)\n",
"print(\"Faire apparaitre un '1' dans la dernière ligne (pivot)\")\n",
"printM(exemple2_A_9)\n",
"print(\"Faire apparaitre des '0' dans le reste des colonnes\")\n",
"printM(exemple2_A_15)\n",
"print(\"Matrice inverse\")\n",
"printM(recupInv(exemple2_A_15))"
]
},
{
"cell_type": "markdown",
"id": "1138de1e-3aab-4625-89f5-bdb93206f58f",
"metadata": {},
"source": [
"L'objectif de la suite de ce TP est d'automatiser ce processus d'inversion.
Le théorème de Gauss (enfin l'un des nombreux théorèmes de Gauss) indique que par l'utilisation des opérations élémentaires sur les lignes, il est toujours possible d'échelonner une matrice... enfin toujours possible si la matrice est inversible. En particulier, si en appliquant les opérations sur les lignes, il n'est pas possible d'échelonner la matrice, c'est que cette matrice n'est pas inversible\n",
"\n",
"Écrire une fonction echelonnage(M, precision=2)
qui prend en paramètre une matrice M
et qui renvoie la matrice après échelonnage.
\n",
"A propos de la precision
: python, en tout cas l'utilisation que nous en faisons ici, ne fait pas de calcul formelle. Tout ce que fait python dans ses calculs sont des approximations numérique. De ce point de vu, il est peut être (très) risqué de réaliser un test du type x==0
qui teste si x
est exactement égale à zéro. D'un point de vu 'approximation', il est très rare que x
soit exactement égale à zéro, mais elle peut s'en approcher. C'est l'objectif de la variable precision
.
\n",
"En effet, pour demander si $x=0$, on peut approximativement demander que $|x|<10^{-2}$.
\n",
"La variable precision
correspond à l'exposant de dix considéré.\n",
"
\n",
"Si $x=0.005$ alors $|x|<10^{-2}$ est vrai et on peut donc dire $x\\simeq 0$
\n",
"Si $x=0.005$ alors $|x|<10^{-3}$ est faux et on peut donc dire $x\\neq 0$
\n",
"\n",
" \n",
"\n",
"
\n",
"\n",
"\n",
"\n",
" Aide Cliquez pour dérouler
\n",
" \n",
" - \n",
"
Les développements de la partie 1 : L'algorithme de Gauss
\n",
" \n",
" \n",
" printM(M, pecision=2) | \n",
" Cette procédure affiche, en $\\LaTeX$, la matrice passée en paramètre. En cas d'erreur dans la saisie, cette procédure renvoie la chaine de caractère \"\" . Le paramètre optionnelle precision permet d'indiquer combien de décimale nous souhaitons afficher au maximum. Par défaut, il vaut 2 | \n",
"
\n",
" \n",
" matriceAugmentee(M) | \n",
" Cette fonction renvoie la matrice augmentée de la matrice passée en paramètre. En cas de problème de dimension la fonction renvoie None . | \n",
"
\n",
" \n",
" operationGaussEchange(M, I, J) | \n",
" Cette fonction renvoie la matrice M où les lignes I et J ont été échangée. | \n",
"
\n",
" \n",
" operationGaussDilatation(M, I, coef) | \n",
" Cette fonction renvoie la matrice M où la ligne I est multipliée par un coefficient coef . | \n",
"
\n",
" \n",
" operationGaussCombinaison(M, I, J, coef) | \n",
" Cette fonction renvoie la matrice M où on a ajouté à la ligne I la ligne J multipliée par coef . | \n",
"
\n",
" \n",
" recupInv(MAugmentee) | \n",
" Cette fonction renvoie l'inverse de la matrice M à partir de la matrice augmenté passé en paramètre. La fonction renvoie None si ce n'est pas possible. | \n",
"
\n",
" \n",
" echelonnage(M, precision=2) | \n",
" Cette fonction renvoie la matrice passé en paramètre après échelonnage. La variable precision permet de rafiner sur les approximations numérique. | \n",
"
\n",
" \n",
" algoGauss(M, precision=2) | \n",
" Cette fonction renvoie la matrice augmentée de la matrice passée en paramètre et renvoie la matrice augmentée après des opérations sur les lignes et permettant de faire apparaitre la matrice identité à gauche. Si ce n'est pas possible la fonction renvoie None . | \n",
"
\n",
" \n",
" invMat(M, precision=2) | \n",
" Cette fonction renvoie l'inverse de la matrice passé en paramètre. Si ce n'est pas possible la fonction renvoie None . | \n",
"
\n",
"
\n",
" \n",
" \n",
" - \n",
"
Les développements de la partie 2 : L'algorithme du simplexe
\n",
" \n",
" \n",
" {\n",
" 'VAR':[\"x\", \"y\"],\n",
" 'A':[\n",
" [2, 1],\n",
" [1, 2]\n",
" ],\n",
" 'SYMB':['<', '<'],\n",
" 'MINouMAX':'Max',\n",
" 'B':[11, 10],\n",
" 'C':[1, 1]\n",
"} | \n",
" Structure d'un problème linéaire dans ce TP | \n",
"
\n",
" \n",
" printPL(PL, precision=2) | \n",
" Affiche un problème linéaire avec la precision spécifié. Si le problème est mal saisi, la fonction renvoie la chaine vide. | \n",
"
\n",
" \n",
" {\n",
" 'VAR_E':[\"x\", \"y\", \"e_{1}\", \"e_{2}\"],\n",
" 'VAR_S':[2, 3],\n",
" 'MAT':[\n",
" [2, 1, 1, 0, 11],\n",
" [1, 2, 0, 1, 10],\n",
" [1, 1, 0, 0, 0]\n",
" ]\n",
"} | \n",
" Structure d'un tableau de simplexe dans ce TP | \n",
"
\n",
" \n",
" printTAB(TAB, precision=2) | \n",
" Affiche un tableau de simplexe avec la precision spécifié. Si le problème est mal saisi, la fonction renvoie la chaine vide. | \n",
"
\n",
" \n",
" init_simplexe(PL) | \n",
" Cette fonction prend en a paramètre un problème linéaire et renvoie le tableau de simplexe initiale | \n",
"
\n",
" \n",
" cherchePivot(TAB) | \n",
" Cette fonction prend en a paramètre un tableau de simplexe et renvoie le tuple i, j correspondant à la ligne et la colonne du pivot. Si ce n'est pas possible alors la fonction renvoie -1, -1 . | \n",
"
\n",
" \n",
" unTour(TAB, I, J) | \n",
" Cette fonction renvoie le tableau de simplexe passé en paramètre après une itération autour du pivot en I , J . | \n",
"
\n",
" \n",
" algoSimplexe(TAB) | \n",
" Cette fonction renvoie le tableau de simplexe passé en paramètre après l'application de l'algorithme du simplexe. | \n",
"
\n",
" \n",
" lectureTABSimplexe(TAB, PL) | \n",
" Cette fonction prend en paramètre un tableau de simplexe et le problème initiale et renvoie le dictionnaire où les étiquettes sont les variables initiale du problème et les valeurs, les valeurs par lecture du tableau du simplexe. | \n",
"
\n",
"
\n",
" \n",
" \n",
" - \n",
"
Les développements de la partie 3 : L'algorithme des deux phases
\n",
" \n",
" \n",
" init_phase1(PL) | \n",
" Cette fonction renvoie l'initialisation de la première phase. | \n",
"
\n",
" \n",
" init_phase2(TAB, PL, precision=2) | \n",
" Cette fonction renvoie l'initialisation de la seconde phase à partir du problème initiale PL et du tableau TAB de la fin de la première phase. | \n",
"
\n",
" \n",
" algo2phase2(PL, precision=2) | \n",
" Cett procédure affiche la première phase et sa conclusion et la seconde phase et sa conclusion, si c'est possible. | \n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
" "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "62ba462d-6e9b-43bd-ba43-491a8b83991a",
"metadata": {},
"outputs": [],
"source": [
"def echelonnage(M, precision=2) : \n",
" return None"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "1a5df28f-0c0b-4ed6-aefc-98e4afeeeb0f",
"metadata": {},
"outputs": [],
"source": [
"#Test\n",
"\n",
"exemple1_E=echelonnage(exemple1_A)\n",
"\n",
"print(\"Matrice initiale\")\n",
"printM(exemple1)\n",
"print(\"Matrice augmentée\")\n",
"printM(exemple1_A)\n",
"print(\"Matrice échelonnée\")\n",
"printM(exemple1_E)\n",
"\"\"\"\n",
"1.0 1.0 0.0 0.5\n",
"0.0 1.0 1.0 0.0\n",
"\"\"\";"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "748f1c88-31c0-4424-a70e-a99342145407",
"metadata": {},
"outputs": [],
"source": [
"#Test\n",
"\n",
"exemple2_E=echelonnage(exemple2_A)\n",
"\n",
"print(\"Matrice initiale\")\n",
"printM(exemple2)\n",
"print(\"Matrice augmentée\")\n",
"printM(exemple2_A)\n",
"print(\"Matrice échelonnée\")\n",
"printM(exemple2_E)\n",
"\"\"\"\n",
" 1.0 0.5 0.25 0.25 0.25 0.0 0.0 0.0\n",
"-0.0 1.0 -2.5 -6.5 1.5 -2.0 -0.0 -0.0\n",
" 0.0 0.0 1.0 1.8 -0.4 0.5 0.1 0.0\n",
" 0.0 0.0 0.0 1.0 -0.5 0.5 -0.5 0.5\n",
"\"\"\";"
]
},
{
"cell_type": "markdown",
"id": "7c51d0d2-7cc7-489a-b545-82aeaeae3522",
"metadata": {},
"source": [
"Une fois que la matrice est échelonnée (si c'est possible), un oeil aguérie pourra faire apparaitre la matrice identité à gauche. Ayez un oeil aguéri (voir même les deux) et instanciez la fonction algoGauss(M, precision=2)
qui prend ne paramètre une matrice M
(la variable precision
a le même sens que la fonction précédente) et qui renvoie la matrice augmentée après des opérations sur les lignes et permettant de faire apparaitre la matrice identité à gauche. Si ce n'est pas possible la fonction renvoie None
.
\n",
"\n",
"\n",
"\n",
" Aide Cliquez pour dérouler
\n",
" \n",
" - \n",
"
Les développements de la partie 1 : L'algorithme de Gauss
\n",
" \n",
" \n",
" printM(M, pecision=2) | \n",
" Cette procédure affiche, en $\\LaTeX$, la matrice passée en paramètre. En cas d'erreur dans la saisie, cette procédure renvoie la chaine de caractère \"\" . Le paramètre optionnelle precision permet d'indiquer combien de décimale nous souhaitons afficher au maximum. Par défaut, il vaut 2 | \n",
"
\n",
" \n",
" matriceAugmentee(M) | \n",
" Cette fonction renvoie la matrice augmentée de la matrice passée en paramètre. En cas de problème de dimension la fonction renvoie None . | \n",
"
\n",
" \n",
" operationGaussEchange(M, I, J) | \n",
" Cette fonction renvoie la matrice M où les lignes I et J ont été échangée. | \n",
"
\n",
" \n",
" operationGaussDilatation(M, I, coef) | \n",
" Cette fonction renvoie la matrice M où la ligne I est multipliée par un coefficient coef . | \n",
"
\n",
" \n",
" operationGaussCombinaison(M, I, J, coef) | \n",
" Cette fonction renvoie la matrice M où on a ajouté à la ligne I la ligne J multipliée par coef . | \n",
"
\n",
" \n",
" recupInv(MAugmentee) | \n",
" Cette fonction renvoie l'inverse de la matrice M à partir de la matrice augmenté passé en paramètre. La fonction renvoie None si ce n'est pas possible. | \n",
"
\n",
" \n",
" echelonnage(M, precision=2) | \n",
" Cette fonction renvoie la matrice passé en paramètre après échelonnage. La variable precision permet de rafiner sur les approximations numérique. | \n",
"
\n",
" \n",
" algoGauss(M, precision=2) | \n",
" Cette fonction renvoie la matrice augmentée de la matrice passée en paramètre et renvoie la matrice augmentée après des opérations sur les lignes et permettant de faire apparaitre la matrice identité à gauche. Si ce n'est pas possible la fonction renvoie None . | \n",
"
\n",
" \n",
" invMat(M, precision=2) | \n",
" Cette fonction renvoie l'inverse de la matrice passé en paramètre. Si ce n'est pas possible la fonction renvoie None . | \n",
"
\n",
"
\n",
" \n",
" \n",
" - \n",
"
Les développements de la partie 2 : L'algorithme du simplexe
\n",
" \n",
" \n",
" {\n",
" 'VAR':[\"x\", \"y\"],\n",
" 'A':[\n",
" [2, 1],\n",
" [1, 2]\n",
" ],\n",
" 'SYMB':['<', '<'],\n",
" 'MINouMAX':'Max',\n",
" 'B':[11, 10],\n",
" 'C':[1, 1]\n",
"} | \n",
" Structure d'un problème linéaire dans ce TP | \n",
"
\n",
" \n",
" printPL(PL, precision=2) | \n",
" Affiche un problème linéaire avec la precision spécifié. Si le problème est mal saisi, la fonction renvoie la chaine vide. | \n",
"
\n",
" \n",
" {\n",
" 'VAR_E':[\"x\", \"y\", \"e_{1}\", \"e_{2}\"],\n",
" 'VAR_S':[2, 3],\n",
" 'MAT':[\n",
" [2, 1, 1, 0, 11],\n",
" [1, 2, 0, 1, 10],\n",
" [1, 1, 0, 0, 0]\n",
" ]\n",
"} | \n",
" Structure d'un tableau de simplexe dans ce TP | \n",
"
\n",
" \n",
" printTAB(TAB, precision=2) | \n",
" Affiche un tableau de simplexe avec la precision spécifié. Si le problème est mal saisi, la fonction renvoie la chaine vide. | \n",
"
\n",
" \n",
" init_simplexe(PL) | \n",
" Cette fonction prend en a paramètre un problème linéaire et renvoie le tableau de simplexe initiale | \n",
"
\n",
" \n",
" cherchePivot(TAB) | \n",
" Cette fonction prend en a paramètre un tableau de simplexe et renvoie le tuple i, j correspondant à la ligne et la colonne du pivot. Si ce n'est pas possible alors la fonction renvoie -1, -1 . | \n",
"
\n",
" \n",
" unTour(TAB, I, J) | \n",
" Cette fonction renvoie le tableau de simplexe passé en paramètre après une itération autour du pivot en I , J . | \n",
"
\n",
" \n",
" algoSimplexe(TAB) | \n",
" Cette fonction renvoie le tableau de simplexe passé en paramètre après l'application de l'algorithme du simplexe. | \n",
"
\n",
" \n",
" lectureTABSimplexe(TAB, PL) | \n",
" Cette fonction prend en paramètre un tableau de simplexe et le problème initiale et renvoie le dictionnaire où les étiquettes sont les variables initiale du problème et les valeurs, les valeurs par lecture du tableau du simplexe. | \n",
"
\n",
"
\n",
" \n",
" \n",
" - \n",
"
Les développements de la partie 3 : L'algorithme des deux phases
\n",
" \n",
" \n",
" init_phase1(PL) | \n",
" Cette fonction renvoie l'initialisation de la première phase. | \n",
"
\n",
" \n",
" init_phase2(TAB, PL, precision=2) | \n",
" Cette fonction renvoie l'initialisation de la seconde phase à partir du problème initiale PL et du tableau TAB de la fin de la première phase. | \n",
"
\n",
" \n",
" algo2phase2(PL, precision=2) | \n",
" Cett procédure affiche la première phase et sa conclusion et la seconde phase et sa conclusion, si c'est possible. | \n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
" "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "34a97c22-b467-421f-9c1d-7c0b7074ba4e",
"metadata": {},
"outputs": [],
"source": [
"def algoGauss(M, precision=2) : \n",
" return None"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "4b6570c9-cc02-4cf1-932b-f250de9f61f4",
"metadata": {},
"outputs": [],
"source": [
"#Test\n",
"\n",
"print(\"Matrice\")\n",
"printM(exemple2)\n",
"print(\"Fin de l'algorithme de Gauss\")\n",
"printM(algoGauss(exemple2))\n",
"\"\"\"\n",
"1.0 0.0 0.0 0.0 0.5 -0.15 0.25 -0.4\n",
"0.0 1.0 0.0 0.0 -0.5 0.25 -0.75 1.0\n",
"0.0 0.0 1.0 0.0 0.5 -0.4 1.0 -0.9\n",
"0.0 0.0 0.0 1.0 -0.5 0.5 -0.5 0.5\n",
"\"\"\";"
]
},
{
"cell_type": "markdown",
"id": "a5ef80e7-3b98-4b40-809c-f6b8153b931c",
"metadata": {},
"source": [
"Assemblez les différentes fonctionnalités précédente pour écrire la fonction invMat(M, precision=2)
qui prend en paramètre une matrice et qui renvoie la matrice inverse sir c'est possible ; si ce n'est pas possible la fonction renvoie None
.
\n",
"\n",
"\n",
"\n",
" Aide Cliquez pour dérouler
\n",
" \n",
" - \n",
"
Les développements de la partie 1 : L'algorithme de Gauss
\n",
" \n",
" \n",
" printM(M, pecision=2) | \n",
" Cette procédure affiche, en $\\LaTeX$, la matrice passée en paramètre. En cas d'erreur dans la saisie, cette procédure renvoie la chaine de caractère \"\" . Le paramètre optionnelle precision permet d'indiquer combien de décimale nous souhaitons afficher au maximum. Par défaut, il vaut 2 | \n",
"
\n",
" \n",
" matriceAugmentee(M) | \n",
" Cette fonction renvoie la matrice augmentée de la matrice passée en paramètre. En cas de problème de dimension la fonction renvoie None . | \n",
"
\n",
" \n",
" operationGaussEchange(M, I, J) | \n",
" Cette fonction renvoie la matrice M où les lignes I et J ont été échangée. | \n",
"
\n",
" \n",
" operationGaussDilatation(M, I, coef) | \n",
" Cette fonction renvoie la matrice M où la ligne I est multipliée par un coefficient coef . | \n",
"
\n",
" \n",
" operationGaussCombinaison(M, I, J, coef) | \n",
" Cette fonction renvoie la matrice M où on a ajouté à la ligne I la ligne J multipliée par coef . | \n",
"
\n",
" \n",
" recupInv(MAugmentee) | \n",
" Cette fonction renvoie l'inverse de la matrice M à partir de la matrice augmenté passé en paramètre. La fonction renvoie None si ce n'est pas possible. | \n",
"
\n",
" \n",
" echelonnage(M, precision=2) | \n",
" Cette fonction renvoie la matrice passé en paramètre après échelonnage. La variable precision permet de rafiner sur les approximations numérique. | \n",
"
\n",
" \n",
" algoGauss(M, precision=2) | \n",
" Cette fonction renvoie la matrice augmentée de la matrice passée en paramètre et renvoie la matrice augmentée après des opérations sur les lignes et permettant de faire apparaitre la matrice identité à gauche. Si ce n'est pas possible la fonction renvoie None . | \n",
"
\n",
" \n",
" invMat(M, precision=2) | \n",
" Cette fonction renvoie l'inverse de la matrice passé en paramètre. Si ce n'est pas possible la fonction renvoie None . | \n",
"
\n",
"
\n",
" \n",
" \n",
" - \n",
"
Les développements de la partie 2 : L'algorithme du simplexe
\n",
" \n",
" \n",
" {\n",
" 'VAR':[\"x\", \"y\"],\n",
" 'A':[\n",
" [2, 1],\n",
" [1, 2]\n",
" ],\n",
" 'SYMB':['<', '<'],\n",
" 'MINouMAX':'Max',\n",
" 'B':[11, 10],\n",
" 'C':[1, 1]\n",
"} | \n",
" Structure d'un problème linéaire dans ce TP | \n",
"
\n",
" \n",
" printPL(PL, precision=2) | \n",
" Affiche un problème linéaire avec la precision spécifié. Si le problème est mal saisi, la fonction renvoie la chaine vide. | \n",
"
\n",
" \n",
" {\n",
" 'VAR_E':[\"x\", \"y\", \"e_{1}\", \"e_{2}\"],\n",
" 'VAR_S':[2, 3],\n",
" 'MAT':[\n",
" [2, 1, 1, 0, 11],\n",
" [1, 2, 0, 1, 10],\n",
" [1, 1, 0, 0, 0]\n",
" ]\n",
"} | \n",
" Structure d'un tableau de simplexe dans ce TP | \n",
"
\n",
" \n",
" printTAB(TAB, precision=2) | \n",
" Affiche un tableau de simplexe avec la precision spécifié. Si le problème est mal saisi, la fonction renvoie la chaine vide. | \n",
"
\n",
" \n",
" init_simplexe(PL) | \n",
" Cette fonction prend en a paramètre un problème linéaire et renvoie le tableau de simplexe initiale | \n",
"
\n",
" \n",
" cherchePivot(TAB) | \n",
" Cette fonction prend en a paramètre un tableau de simplexe et renvoie le tuple i, j correspondant à la ligne et la colonne du pivot. Si ce n'est pas possible alors la fonction renvoie -1, -1 . | \n",
"
\n",
" \n",
" unTour(TAB, I, J) | \n",
" Cette fonction renvoie le tableau de simplexe passé en paramètre après une itération autour du pivot en I , J . | \n",
"
\n",
" \n",
" algoSimplexe(TAB) | \n",
" Cette fonction renvoie le tableau de simplexe passé en paramètre après l'application de l'algorithme du simplexe. | \n",
"
\n",
" \n",
" lectureTABSimplexe(TAB, PL) | \n",
" Cette fonction prend en paramètre un tableau de simplexe et le problème initiale et renvoie le dictionnaire où les étiquettes sont les variables initiale du problème et les valeurs, les valeurs par lecture du tableau du simplexe. | \n",
"
\n",
"
\n",
" \n",
" \n",
" - \n",
"
Les développements de la partie 3 : L'algorithme des deux phases
\n",
" \n",
" \n",
" init_phase1(PL) | \n",
" Cette fonction renvoie l'initialisation de la première phase. | \n",
"
\n",
" \n",
" init_phase2(TAB, PL, precision=2) | \n",
" Cette fonction renvoie l'initialisation de la seconde phase à partir du problème initiale PL et du tableau TAB de la fin de la première phase. | \n",
"
\n",
" \n",
" algo2phase2(PL, precision=2) | \n",
" Cett procédure affiche la première phase et sa conclusion et la seconde phase et sa conclusion, si c'est possible. | \n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
" "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "365b207e-8073-4e10-819a-78e37c6c9868",
"metadata": {},
"outputs": [],
"source": [
"def invMat(M, precision=2) : \n",
" return None"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e2c06a51-5034-43d1-a7e3-7ab9afaaa3e9",
"metadata": {},
"outputs": [],
"source": [
"#Test\n",
"\n",
"print(\"L'inverse de la matrice\")\n",
"printM(exemple2)\n",
"print(\"est\")\n",
"printM(invMat(exemple2))\n",
"\"\"\"\n",
" 0.5 -0.15 0.25 -0.4\n",
"-0.5 0.25 -0.75 1.0\n",
" 0.5 0.4 1.0 -0.9\n",
"-0.5 0.5 -0.5 0.5\n",
"\"\"\";"
]
},
{
"cell_type": "markdown",
"id": "05d7f6d1-286d-4bdd-8272-34b1e1955c52",
"metadata": {},
"source": [
"\n",
" Partie 2 : L'algorithme du simplexe\n",
"
\n",
"\n",
"\n",
" \n",
" Menu de navigation (cliquez pour dérouler)
\n",
" \n",
" \n",
"
"
]
},
{
"cell_type": "markdown",
"id": "c76dd9d4-91ef-4a85-b80a-91888708c713",
"metadata": {},
"source": [
"Nous travaillons avec des problèmes linéaires. Pour plus de détails théorique, consultez ataraXy ici
\n",
"Un problème linéaire sera considéré comme une structure de donnée, c'est à dire un dictionnaire, avec le champs suivants : \n",
"
\n",
" 'VAR'
: ce champ est une liste de chaine de caractère correspondant au nom des variables \n",
" 'A'
: il s'agit de la matrice des contraintes \n",
" 'SYMB'
: ce champ est une liste de chaine de caractère parmi '>', '<' ou '=' correspondant aux contraintes du problème \n",
" 'MINouMAX'
: ce champ est une chaine de caractère parmi 'Max' ou 'Min' indiquant la nature de l'optimum recherché (attention à la casse). \n",
" 'B'
: ce champ est la liste des coefficients constants du système \n",
" 'C'
: ce champ est la liste des coefficients de l'optimum \n",
"
\n",
" Il y a quelques précausion à prendre. Par exemple le nombre de ligne de la matrice 'A'
doit correspondre à la taille de la liste 'SYMB'
etc...\n",
""
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "607e6e3a-e862-4567-ac8e-e19e6ff808c5",
"metadata": {},
"outputs": [],
"source": [
"PL1 = {\n",
" 'VAR':[\"x\", \"y\"],\n",
" 'A':[\n",
" [2, 1],\n",
" [1, 2]\n",
" ],\n",
" 'SYMB':['<', '<'],\n",
" 'MINouMAX':'Max',\n",
" 'B':[11, 10],\n",
" 'C':[1, 1]\n",
"}\n",
"\n",
"PL2 = {\n",
" 'VAR':[\"x\", \"y\"],\n",
" 'A':[\n",
" [2, 1],\n",
" [-1, -2]\n",
" ],\n",
" 'SYMB':['<', '>'],\n",
" 'MINouMAX':'Min',\n",
" 'B':[11, -10],\n",
" 'C':[-1, -1]\n",
"}"
]
},
{
"cell_type": "markdown",
"id": "2ff1fb9d-c8d8-44c5-b26a-7ce3f7775c6a",
"metadata": {},
"source": [
"La fonction suivante affiche élégament un problème linéaire avec une précision de celle spécifié dans le second paramètre optionnelle. Si le problème est mal saisie alors la fonction renvoie la chaine vide. Vous pourrez la tester dans la case suivante.
"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "dbaebaf0-ae86-4582-b9fc-27210b1e564b",
"metadata": {},
"outputs": [],
"source": [
"def printPL(PL, precision=2) : \n",
" try :#test sur la structure informatique d'un problème linéaire\n",
" A=PL['A']\n",
" B=PL['B']\n",
" C=PL['C']\n",
" V=PL['VAR']\n",
" S=PL['SYMB']\n",
" MM=PL['MINouMAX']\n",
" nb_variable = len(V)\n",
" nb_contrainte=len(A)\n",
" for i in range(nb_contrainte) : \n",
" if(len(A[i])!=nb_variable) : return \"\"\n",
" if(len(S)!=nb_contrainte) : return \"\"\n",
" if(len(B)!=nb_contrainte) : return \"\"\n",
" if(len(C)!=nb_variable) : return \"\"\n",
" except : return \"\"\n",
"\n",
" tex=r\"\\left\\{\\begin{array}{*{\"+str(nb_variable)+\"}{cr}cl}\"\n",
" for i in range(nb_contrainte) :#la ligne i correspond à la contrainte i\n",
" premier_passage=False #Petite astuce pour ne pas afficher de '+' pour le premier terme (dans le cas où il est positif)\n",
" for j in range(nb_variable) : #la colone j correspond à la variable j\n",
" a=A[i][j] # on récupère le coefficient\n",
" if(a!=0) :\n",
" if(a>0 and premier_passage) : tex+='+' #On affiche le + (si ce n'est pas le premier terme de la ligne)\n",
" premier_passage=True\n",
" if(a<0) : tex+='-'\n",
" tex+=' & '\n",
" a=abs(a)#Le signe étant géré dans les lignes précédente, on prend la valeur absolue du coef\n",
" if(a!=1) : tex+=str(abs(round(a, precision))) #On affiche le coefficient avec un nombre de décimale spécifié en paramètre\n",
" tex+=V[j]\n",
" else : tex+=' & '\n",
" tex+=' & '\n",
" #Gestion du symbole\n",
" if(S[i]=='<') : tex+=r'\\leqslant'\n",
" elif(S[i]=='>') : tex+=r'\\geqslant'\n",
" else : tex+=S[i]\n",
" tex+=str(round(B[i], precision)) #Coefficient\n",
" tex+=r'\\\\' #saut de ligne\n",
" #affichage du min ou du max\n",
" tex+=r'\\hline '+MM+'('\n",
" premier_passage=False\n",
" for j in range(nb_variable) :\n",
" a=C[j]\n",
" if(a!=0) :\n",
" if(a>0 and premier_passage) : tex+='+'\n",
" premier_passage=True\n",
" if(a<0) : tex+='-'\n",
" tex+=' & '\n",
" a=abs(a)\n",
" if(a!=1) : tex+=str(abs(round(a, precision)))\n",
" tex+=V[j]\n",
" else : tex+=' & '\n",
" tex+=' & '\n",
" tex+=')'\n",
" tex+=r'\\end{array}\\right.'\n",
" \n",
" display(Math(tex))"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "dad3616a-d21b-4ae7-9bce-603879456619",
"metadata": {},
"outputs": [],
"source": [
"#Tests\n",
"\n",
"printPL(PL1)\n",
"printPL(PL2)"
]
},
{
"cell_type": "markdown",
"id": "4b04a604-5d2e-48b0-82b1-05882bbcb8b5",
"metadata": {},
"source": [
"On renvoie au cours, pour comprendre l'algorithme du simplexe permettant de résoude les problèmes linéaires. En particulier, nous représentons un problème linéaire mis sous forme standard dans un tableau.\n",
"
\n",
" Dans ce TP, un tableau sera une structure de donnée (un dictionnaire en python), avec les champs suivant : \n",
"
\n",
" 'VAR_E'
: est la liste des variables entrantes. C'est une liste de chaine de caractère contenant le nom des variables (de base et d'écarts, puis plus tard, artificielles). Ce sont ces variables qui apparaissent dans la première ligne du tableau de l'algorithme du simplexe \n",
" 'VAR_S'
: est la liste des variables sortantes. C'est une liste d'indices qui font référence au nom des variables dans la liste des variables entrantes. Ce sont ces variables qui apparaissent dans la première ligne du tableau de l'algorithme du simplexe \n",
" 'MAT'
: est la matrice du problème ; la dernière colonne contient les termes constants et la dernière ligne la fonction objectif. \n",
"
\n",
" Voici un exemple : \n",
""
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "9542fffb-03f4-4e68-b8f6-a25b2b414afa",
"metadata": {},
"outputs": [],
"source": [
"TAB1 = {\n",
" 'VAR_E':[\"x\", \"y\", \"e_{1}\", \"e_{2}\"],\n",
" 'VAR_S':[2, 3],\n",
" 'MAT':[\n",
" [2, 1, 1, 0, 11],\n",
" [1, 2, 0, 1, 10],\n",
" [1, 1, 0, 0, 0]\n",
" ]\n",
"}"
]
},
{
"cell_type": "markdown",
"id": "777d0799-3b4d-4277-b6af-e1a795d22df3",
"metadata": {},
"source": [
"La fonction suivante affiche le tableau du simplexe.
"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "ae4c30ec-243d-4c0e-a685-7de06c41887d",
"metadata": {},
"outputs": [],
"source": [
"def printTAB(TAB, precision=2) : \n",
" try :\n",
" var_e=TAB['VAR_E']\n",
" var_s=[var_e[i] for i in TAB['VAR_S']]\n",
" M=TAB['MAT']\n",
" nb_contrainte = len(var_s)\n",
" nb_variable = len(var_e)\n",
" for i in range(nb_contrainte+1) : \n",
" if(len(M[i])!=nb_variable+1) : return \"\"\n",
" except : return \"\"\n",
"\n",
" tex=r'\\begin{array}{c|*{'+str(nb_variable)+'}{c}|c}'\n",
" for j in range(nb_variable) : tex+=' & '+var_e[j]\n",
" tex+=r'\\\\\\hline '\n",
" for i in range(nb_contrainte) : \n",
" tex+=var_s[i]\n",
" for j in range(nb_variable+1) : tex+=' & '+str(round(M[i][j], precision))\n",
" tex+=r'\\\\'\n",
" tex+=r'\\hline '\n",
"\n",
" tex+='Obj'\n",
" for j in range(nb_variable+1) : tex+=' & '+str(round(M[nb_contrainte][j], precision))\n",
" tex+=r'\\end{array}'\n",
" display(Math(tex))"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "6043f8a2-ae48-4611-91b2-78b4fbb78a52",
"metadata": {},
"outputs": [],
"source": [
"#Test\n",
"\n",
"printTAB(TAB1)"
]
},
{
"cell_type": "markdown",
"id": "ca8e5f45-afaf-43c6-87b7-354d3abec81c",
"metadata": {},
"source": [
"Écrire la fonction init_simplexe(PL)
qui prend en a paramètre un problème linéaire et renvoie le tableau de simplexe initiale. En particulier on prendra garde aux critères qui font d'un problème, un problème sous forme standard.
\n",
"\n",
"\n",
" Aide Cliquez pour dérouler
\n",
" \n",
" - \n",
"
Les développements de la partie 1 : L'algorithme de Gauss
\n",
" \n",
" \n",
" printM(M, pecision=2) | \n",
" Cette procédure affiche, en $\\LaTeX$, la matrice passée en paramètre. En cas d'erreur dans la saisie, cette procédure renvoie la chaine de caractère \"\" . Le paramètre optionnelle precision permet d'indiquer combien de décimale nous souhaitons afficher au maximum. Par défaut, il vaut 2 | \n",
"
\n",
" \n",
" matriceAugmentee(M) | \n",
" Cette fonction renvoie la matrice augmentée de la matrice passée en paramètre. En cas de problème de dimension la fonction renvoie None . | \n",
"
\n",
" \n",
" operationGaussEchange(M, I, J) | \n",
" Cette fonction renvoie la matrice M où les lignes I et J ont été échangée. | \n",
"
\n",
" \n",
" operationGaussDilatation(M, I, coef) | \n",
" Cette fonction renvoie la matrice M où la ligne I est multipliée par un coefficient coef . | \n",
"
\n",
" \n",
" operationGaussCombinaison(M, I, J, coef) | \n",
" Cette fonction renvoie la matrice M où on a ajouté à la ligne I la ligne J multipliée par coef . | \n",
"
\n",
" \n",
" recupInv(MAugmentee) | \n",
" Cette fonction renvoie l'inverse de la matrice M à partir de la matrice augmenté passé en paramètre. La fonction renvoie None si ce n'est pas possible. | \n",
"
\n",
" \n",
" echelonnage(M, precision=2) | \n",
" Cette fonction renvoie la matrice passé en paramètre après échelonnage. La variable precision permet de rafiner sur les approximations numérique. | \n",
"
\n",
" \n",
" algoGauss(M, precision=2) | \n",
" Cette fonction renvoie la matrice augmentée de la matrice passée en paramètre et renvoie la matrice augmentée après des opérations sur les lignes et permettant de faire apparaitre la matrice identité à gauche. Si ce n'est pas possible la fonction renvoie None . | \n",
"
\n",
" \n",
" invMat(M, precision=2) | \n",
" Cette fonction renvoie l'inverse de la matrice passé en paramètre. Si ce n'est pas possible la fonction renvoie None . | \n",
"
\n",
"
\n",
" \n",
" \n",
" - \n",
"
Les développements de la partie 2 : L'algorithme du simplexe
\n",
" \n",
" \n",
" {\n",
" 'VAR':[\"x\", \"y\"],\n",
" 'A':[\n",
" [2, 1],\n",
" [1, 2]\n",
" ],\n",
" 'SYMB':['<', '<'],\n",
" 'MINouMAX':'Max',\n",
" 'B':[11, 10],\n",
" 'C':[1, 1]\n",
"} | \n",
" Structure d'un problème linéaire dans ce TP | \n",
"
\n",
" \n",
" printPL(PL, precision=2) | \n",
" Affiche un problème linéaire avec la precision spécifié. Si le problème est mal saisi, la fonction renvoie la chaine vide. | \n",
"
\n",
" \n",
" {\n",
" 'VAR_E':[\"x\", \"y\", \"e_{1}\", \"e_{2}\"],\n",
" 'VAR_S':[2, 3],\n",
" 'MAT':[\n",
" [2, 1, 1, 0, 11],\n",
" [1, 2, 0, 1, 10],\n",
" [1, 1, 0, 0, 0]\n",
" ]\n",
"} | \n",
" Structure d'un tableau de simplexe dans ce TP | \n",
"
\n",
" \n",
" printTAB(TAB, precision=2) | \n",
" Affiche un tableau de simplexe avec la precision spécifié. Si le problème est mal saisi, la fonction renvoie la chaine vide. | \n",
"
\n",
" \n",
" init_simplexe(PL) | \n",
" Cette fonction prend en a paramètre un problème linéaire et renvoie le tableau de simplexe initiale | \n",
"
\n",
" \n",
" cherchePivot(TAB) | \n",
" Cette fonction prend en a paramètre un tableau de simplexe et renvoie le tuple i, j correspondant à la ligne et la colonne du pivot. Si ce n'est pas possible alors la fonction renvoie -1, -1 . | \n",
"
\n",
" \n",
" unTour(TAB, I, J) | \n",
" Cette fonction renvoie le tableau de simplexe passé en paramètre après une itération autour du pivot en I , J . | \n",
"
\n",
" \n",
" algoSimplexe(TAB) | \n",
" Cette fonction renvoie le tableau de simplexe passé en paramètre après l'application de l'algorithme du simplexe. | \n",
"
\n",
" \n",
" lectureTABSimplexe(TAB, PL) | \n",
" Cette fonction prend en paramètre un tableau de simplexe et le problème initiale et renvoie le dictionnaire où les étiquettes sont les variables initiale du problème et les valeurs, les valeurs par lecture du tableau du simplexe. | \n",
"
\n",
"
\n",
" \n",
" \n",
" - \n",
"
Les développements de la partie 3 : L'algorithme des deux phases
\n",
" \n",
" \n",
" init_phase1(PL) | \n",
" Cette fonction renvoie l'initialisation de la première phase. | \n",
"
\n",
" \n",
" init_phase2(TAB, PL, precision=2) | \n",
" Cette fonction renvoie l'initialisation de la seconde phase à partir du problème initiale PL et du tableau TAB de la fin de la première phase. | \n",
"
\n",
" \n",
" algo2phase2(PL, precision=2) | \n",
" Cett procédure affiche la première phase et sa conclusion et la seconde phase et sa conclusion, si c'est possible. | \n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
" "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "25f08d4c-f7bf-4b3a-9ad6-58736f9cd702",
"metadata": {},
"outputs": [],
"source": [
"def init_simplexe(PL) : \n",
" TAB = {'VAR_E':[], 'VAR_S':[], 'MAT':[]}\n",
" return TAB"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "8aa2a816-b1c7-4d4f-b063-ff73d5f518ac",
"metadata": {},
"outputs": [],
"source": [
"#Test\n",
"\n",
"print(\"Premier problème linéaire\")\n",
"printPL(PL1)\n",
"printTAB(init_simplexe(PL1))\n",
"\"\"\"\n",
" x y e1 e2 \n",
"e1 2 1 1 0 11\n",
"e2 1 2 0 1 10\n",
"Obj 1 1 0 0 0\n",
"\"\"\";\n",
"\n",
"print(\"Second problème linéaire\")\n",
"printPL(PL2)\n",
"printTAB(init_simplexe(PL2))\n",
"\"\"\"\n",
" x y e1 e2 \n",
"e1 2 1 1 0 11\n",
"e2 1 2 0 1 10\n",
"Obj 1 1 0 0 0\n",
"\"\"\";"
]
},
{
"cell_type": "markdown",
"id": "c2c2f312-8779-45db-a8be-b97cf9a722e1",
"metadata": {},
"source": [
"En suivant l'algorithme du simplexe, écrire la fonction cherchePivot(TAB)
qui prend en paramètre un tableau de simplexe et renvoie le tuple i, j
correspondant à la ligne et la colonne du pivot. Si, en suivant l'algorithme du simplexe, il n'est pas possible de déterminer un pivot alors la fonction renvoie -1, -1
.
\n",
"\n",
"\n",
" Aide Cliquez pour dérouler
\n",
" \n",
" - \n",
"
Les développements de la partie 1 : L'algorithme de Gauss
\n",
" \n",
" \n",
" printM(M, pecision=2) | \n",
" Cette procédure affiche, en $\\LaTeX$, la matrice passée en paramètre. En cas d'erreur dans la saisie, cette procédure renvoie la chaine de caractère \"\" . Le paramètre optionnelle precision permet d'indiquer combien de décimale nous souhaitons afficher au maximum. Par défaut, il vaut 2 | \n",
"
\n",
" \n",
" matriceAugmentee(M) | \n",
" Cette fonction renvoie la matrice augmentée de la matrice passée en paramètre. En cas de problème de dimension la fonction renvoie None . | \n",
"
\n",
" \n",
" operationGaussEchange(M, I, J) | \n",
" Cette fonction renvoie la matrice M où les lignes I et J ont été échangée. | \n",
"
\n",
" \n",
" operationGaussDilatation(M, I, coef) | \n",
" Cette fonction renvoie la matrice M où la ligne I est multipliée par un coefficient coef . | \n",
"
\n",
" \n",
" operationGaussCombinaison(M, I, J, coef) | \n",
" Cette fonction renvoie la matrice M où on a ajouté à la ligne I la ligne J multipliée par coef . | \n",
"
\n",
" \n",
" recupInv(MAugmentee) | \n",
" Cette fonction renvoie l'inverse de la matrice M à partir de la matrice augmenté passé en paramètre. La fonction renvoie None si ce n'est pas possible. | \n",
"
\n",
" \n",
" echelonnage(M, precision=2) | \n",
" Cette fonction renvoie la matrice passé en paramètre après échelonnage. La variable precision permet de rafiner sur les approximations numérique. | \n",
"
\n",
" \n",
" algoGauss(M, precision=2) | \n",
" Cette fonction renvoie la matrice augmentée de la matrice passée en paramètre et renvoie la matrice augmentée après des opérations sur les lignes et permettant de faire apparaitre la matrice identité à gauche. Si ce n'est pas possible la fonction renvoie None . | \n",
"
\n",
" \n",
" invMat(M, precision=2) | \n",
" Cette fonction renvoie l'inverse de la matrice passé en paramètre. Si ce n'est pas possible la fonction renvoie None . | \n",
"
\n",
"
\n",
" \n",
" \n",
" - \n",
"
Les développements de la partie 2 : L'algorithme du simplexe
\n",
" \n",
" \n",
" {\n",
" 'VAR':[\"x\", \"y\"],\n",
" 'A':[\n",
" [2, 1],\n",
" [1, 2]\n",
" ],\n",
" 'SYMB':['<', '<'],\n",
" 'MINouMAX':'Max',\n",
" 'B':[11, 10],\n",
" 'C':[1, 1]\n",
"} | \n",
" Structure d'un problème linéaire dans ce TP | \n",
"
\n",
" \n",
" printPL(PL, precision=2) | \n",
" Affiche un problème linéaire avec la precision spécifié. Si le problème est mal saisi, la fonction renvoie la chaine vide. | \n",
"
\n",
" \n",
" {\n",
" 'VAR_E':[\"x\", \"y\", \"e_{1}\", \"e_{2}\"],\n",
" 'VAR_S':[2, 3],\n",
" 'MAT':[\n",
" [2, 1, 1, 0, 11],\n",
" [1, 2, 0, 1, 10],\n",
" [1, 1, 0, 0, 0]\n",
" ]\n",
"} | \n",
" Structure d'un tableau de simplexe dans ce TP | \n",
"
\n",
" \n",
" printTAB(TAB, precision=2) | \n",
" Affiche un tableau de simplexe avec la precision spécifié. Si le problème est mal saisi, la fonction renvoie la chaine vide. | \n",
"
\n",
" \n",
" init_simplexe(PL) | \n",
" Cette fonction prend en a paramètre un problème linéaire et renvoie le tableau de simplexe initiale | \n",
"
\n",
" \n",
" cherchePivot(TAB) | \n",
" Cette fonction prend en a paramètre un tableau de simplexe et renvoie le tuple i, j correspondant à la ligne et la colonne du pivot. Si ce n'est pas possible alors la fonction renvoie -1, -1 . | \n",
"
\n",
" \n",
" unTour(TAB, I, J) | \n",
" Cette fonction renvoie le tableau de simplexe passé en paramètre après une itération autour du pivot en I , J . | \n",
"
\n",
" \n",
" algoSimplexe(TAB) | \n",
" Cette fonction renvoie le tableau de simplexe passé en paramètre après l'application de l'algorithme du simplexe. | \n",
"
\n",
" \n",
" lectureTABSimplexe(TAB, PL) | \n",
" Cette fonction prend en paramètre un tableau de simplexe et le problème initiale et renvoie le dictionnaire où les étiquettes sont les variables initiale du problème et les valeurs, les valeurs par lecture du tableau du simplexe. | \n",
"
\n",
"
\n",
" \n",
" \n",
" - \n",
"
Les développements de la partie 3 : L'algorithme des deux phases
\n",
" \n",
" \n",
" init_phase1(PL) | \n",
" Cette fonction renvoie l'initialisation de la première phase. | \n",
"
\n",
" \n",
" init_phase2(TAB, PL, precision=2) | \n",
" Cette fonction renvoie l'initialisation de la seconde phase à partir du problème initiale PL et du tableau TAB de la fin de la première phase. | \n",
"
\n",
" \n",
" algo2phase2(PL, precision=2) | \n",
" Cett procédure affiche la première phase et sa conclusion et la seconde phase et sa conclusion, si c'est possible. | \n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
" "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "8d7d763c-32e6-4c38-a043-c1540e8a0751",
"metadata": {},
"outputs": [],
"source": [
"def cherchePivot(TAB) : \n",
" return -1, -1"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "feb9bec4-6d5d-4ad9-b1c0-da77b137192d",
"metadata": {},
"outputs": [],
"source": [
"#Test\n",
"\n",
"TAB2=init_simplexe(PL2)\n",
"printTAB(TAB2)\n",
"print(\"Pivot :\", cherchePivot(TAB2)) #(0, 0)"
]
},
{
"cell_type": "markdown",
"id": "1bd8a452-863e-4950-9ee7-8de870fea2c7",
"metadata": {},
"source": [
"En reprennant le principe de l'algorithme du simplexe, nous pouvons réaliser une itération qui est réalisé dans la case suivante et qui abouti sur le tableau\n",
"$$\\displaystyle \\begin{array}{c|*{4}{c}|c} & x & y & e_{1} & e_{2}\\\\\\hline e_{1} & 1.0 & 0.5 & 0.5 & 0.0 & 5.5\\\\e_{2} & 0.0 & 1.5 & -0.5 & 1.0 & 4.5\\\\\\hline Obj & 0.0 & 0.5 & -0.5 & 0.0 & -5.5\\end{array}.\r\n",
"$$ \n",
"
"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "71a88fd8-3974-4990-929d-30487f9dbfcc",
"metadata": {},
"outputs": [],
"source": [
"#Test\n",
"\n",
"TAB2_0 = init_simplexe(PL2)\n",
"M = TAB2_0['MAT']\n",
"i, j = cherchePivot(TAB2_0)\n",
"\n",
"printTAB(TAB2_0)\n",
"print(\"Pivot :\", cherchePivot(TAB2_0))\n",
"\n",
"M = operationGaussDilatation(M, i, 1/M[i][j])\n",
"TAB2_1={'VAR_E':TAB2_0['VAR_E'], 'VAR_S':TAB2_0['VAR_S'], 'MAT':M}\n",
"printTAB(TAB2_1)\n",
"\n",
"M = operationGaussCombinaison(M, 1, i, -M[1][j])\n",
"TAB2_2={'VAR_E':TAB2_0['VAR_E'], 'VAR_S':TAB2_0['VAR_S'], 'MAT':M}\n",
"printTAB(TAB2_2)\n",
"\n",
"M = operationGaussCombinaison(M, 2, i, -M[2][j])\n",
"TAB2_3={'VAR_E':TAB2_0['VAR_E'], 'VAR_S':TAB2_0['VAR_S'], 'MAT':M}\n",
"printTAB(TAB2_3)"
]
},
{
"cell_type": "markdown",
"id": "31f2ab41-df30-4710-aa08-266a2975356d",
"metadata": {},
"source": [
"En adaptant ce code mais aussi en prennant garde à mettre à jour les variable sortante écrivez la fonction unTour(TAB, I, J)
qui renvoie le tableau de simplexe passé en paramètre après une itération autour du pivot en I
, J
.
\n",
"\n",
"\n",
" Aide Cliquez pour dérouler
\n",
" \n",
" - \n",
"
Les développements de la partie 1 : L'algorithme de Gauss
\n",
" \n",
" \n",
" printM(M, pecision=2) | \n",
" Cette procédure affiche, en $\\LaTeX$, la matrice passée en paramètre. En cas d'erreur dans la saisie, cette procédure renvoie la chaine de caractère \"\" . Le paramètre optionnelle precision permet d'indiquer combien de décimale nous souhaitons afficher au maximum. Par défaut, il vaut 2 | \n",
"
\n",
" \n",
" matriceAugmentee(M) | \n",
" Cette fonction renvoie la matrice augmentée de la matrice passée en paramètre. En cas de problème de dimension la fonction renvoie None . | \n",
"
\n",
" \n",
" operationGaussEchange(M, I, J) | \n",
" Cette fonction renvoie la matrice M où les lignes I et J ont été échangée. | \n",
"
\n",
" \n",
" operationGaussDilatation(M, I, coef) | \n",
" Cette fonction renvoie la matrice M où la ligne I est multipliée par un coefficient coef . | \n",
"
\n",
" \n",
" operationGaussCombinaison(M, I, J, coef) | \n",
" Cette fonction renvoie la matrice M où on a ajouté à la ligne I la ligne J multipliée par coef . | \n",
"
\n",
" \n",
" recupInv(MAugmentee) | \n",
" Cette fonction renvoie l'inverse de la matrice M à partir de la matrice augmenté passé en paramètre. La fonction renvoie None si ce n'est pas possible. | \n",
"
\n",
" \n",
" echelonnage(M, precision=2) | \n",
" Cette fonction renvoie la matrice passé en paramètre après échelonnage. La variable precision permet de rafiner sur les approximations numérique. | \n",
"
\n",
" \n",
" algoGauss(M, precision=2) | \n",
" Cette fonction renvoie la matrice augmentée de la matrice passée en paramètre et renvoie la matrice augmentée après des opérations sur les lignes et permettant de faire apparaitre la matrice identité à gauche. Si ce n'est pas possible la fonction renvoie None . | \n",
"
\n",
" \n",
" invMat(M, precision=2) | \n",
" Cette fonction renvoie l'inverse de la matrice passé en paramètre. Si ce n'est pas possible la fonction renvoie None . | \n",
"
\n",
"
\n",
" \n",
" \n",
" - \n",
"
Les développements de la partie 2 : L'algorithme du simplexe
\n",
" \n",
" \n",
" {\n",
" 'VAR':[\"x\", \"y\"],\n",
" 'A':[\n",
" [2, 1],\n",
" [1, 2]\n",
" ],\n",
" 'SYMB':['<', '<'],\n",
" 'MINouMAX':'Max',\n",
" 'B':[11, 10],\n",
" 'C':[1, 1]\n",
"} | \n",
" Structure d'un problème linéaire dans ce TP | \n",
"
\n",
" \n",
" printPL(PL, precision=2) | \n",
" Affiche un problème linéaire avec la precision spécifié. Si le problème est mal saisi, la fonction renvoie la chaine vide. | \n",
"
\n",
" \n",
" {\n",
" 'VAR_E':[\"x\", \"y\", \"e_{1}\", \"e_{2}\"],\n",
" 'VAR_S':[2, 3],\n",
" 'MAT':[\n",
" [2, 1, 1, 0, 11],\n",
" [1, 2, 0, 1, 10],\n",
" [1, 1, 0, 0, 0]\n",
" ]\n",
"} | \n",
" Structure d'un tableau de simplexe dans ce TP | \n",
"
\n",
" \n",
" printTAB(TAB, precision=2) | \n",
" Affiche un tableau de simplexe avec la precision spécifié. Si le problème est mal saisi, la fonction renvoie la chaine vide. | \n",
"
\n",
" \n",
" init_simplexe(PL) | \n",
" Cette fonction prend en a paramètre un problème linéaire et renvoie le tableau de simplexe initiale | \n",
"
\n",
" \n",
" cherchePivot(TAB) | \n",
" Cette fonction prend en a paramètre un tableau de simplexe et renvoie le tuple i, j correspondant à la ligne et la colonne du pivot. Si ce n'est pas possible alors la fonction renvoie -1, -1 . | \n",
"
\n",
" \n",
" unTour(TAB, I, J) | \n",
" Cette fonction renvoie le tableau de simplexe passé en paramètre après une itération autour du pivot en I , J . | \n",
"
\n",
" \n",
" algoSimplexe(TAB) | \n",
" Cette fonction renvoie le tableau de simplexe passé en paramètre après l'application de l'algorithme du simplexe. | \n",
"
\n",
" \n",
" lectureTABSimplexe(TAB, PL) | \n",
" Cette fonction prend en paramètre un tableau de simplexe et le problème initiale et renvoie le dictionnaire où les étiquettes sont les variables initiale du problème et les valeurs, les valeurs par lecture du tableau du simplexe. | \n",
"
\n",
"
\n",
" \n",
" \n",
" - \n",
"
Les développements de la partie 3 : L'algorithme des deux phases
\n",
" \n",
" \n",
" init_phase1(PL) | \n",
" Cette fonction renvoie l'initialisation de la première phase. | \n",
"
\n",
" \n",
" init_phase2(TAB, PL, precision=2) | \n",
" Cette fonction renvoie l'initialisation de la seconde phase à partir du problème initiale PL et du tableau TAB de la fin de la première phase. | \n",
"
\n",
" \n",
" algo2phase2(PL, precision=2) | \n",
" Cett procédure affiche la première phase et sa conclusion et la seconde phase et sa conclusion, si c'est possible. | \n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
" "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "55d0dfc0-c674-4e5c-b9f1-3e541e6393de",
"metadata": {},
"outputs": [],
"source": [
"def unTour(TAB, I, J) : \n",
" return TAB"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "40faafec-5c82-47b9-a1ff-1980185a8b12",
"metadata": {},
"outputs": [],
"source": [
"#Test\n",
"\n",
"I, J = cherchePivot(TAB2)\n",
"TAB2_0 = unTour(TAB2, I, J)\n",
"\n",
"print(\"Initialisation du problème\")\n",
"printTAB(TAB2)\n",
"print(\"Après un tour de simplexe\")\n",
"printTAB(TAB2_0)\n",
"\"\"\"\n",
" x y e1 e2\n",
"x 1.0 0.5 0.5 0.0 11\n",
"y 0.0 1.5 -0.5 1.0 4.5\n",
"Obj 0.0 0.5 -0.5 0.0 -5.5\n",
"\"\"\""
]
},
{
"cell_type": "markdown",
"id": "a9666fc0-3fad-42ed-a5c6-298729c3f1a5",
"metadata": {},
"source": [
"En combinant les fonctions précédentes, écrire la fonction algoSimplexe(TAB)
qui applique l'algorithme du simplexe sur un tableau initial.
\n",
"\n",
"\n",
" Aide Cliquez pour dérouler
\n",
" \n",
" - \n",
"
Les développements de la partie 1 : L'algorithme de Gauss
\n",
" \n",
" \n",
" printM(M, pecision=2) | \n",
" Cette procédure affiche, en $\\LaTeX$, la matrice passée en paramètre. En cas d'erreur dans la saisie, cette procédure renvoie la chaine de caractère \"\" . Le paramètre optionnelle precision permet d'indiquer combien de décimale nous souhaitons afficher au maximum. Par défaut, il vaut 2 | \n",
"
\n",
" \n",
" matriceAugmentee(M) | \n",
" Cette fonction renvoie la matrice augmentée de la matrice passée en paramètre. En cas de problème de dimension la fonction renvoie None . | \n",
"
\n",
" \n",
" operationGaussEchange(M, I, J) | \n",
" Cette fonction renvoie la matrice M où les lignes I et J ont été échangée. | \n",
"
\n",
" \n",
" operationGaussDilatation(M, I, coef) | \n",
" Cette fonction renvoie la matrice M où la ligne I est multipliée par un coefficient coef . | \n",
"
\n",
" \n",
" operationGaussCombinaison(M, I, J, coef) | \n",
" Cette fonction renvoie la matrice M où on a ajouté à la ligne I la ligne J multipliée par coef . | \n",
"
\n",
" \n",
" recupInv(MAugmentee) | \n",
" Cette fonction renvoie l'inverse de la matrice M à partir de la matrice augmenté passé en paramètre. La fonction renvoie None si ce n'est pas possible. | \n",
"
\n",
" \n",
" echelonnage(M, precision=2) | \n",
" Cette fonction renvoie la matrice passé en paramètre après échelonnage. La variable precision permet de rafiner sur les approximations numérique. | \n",
"
\n",
" \n",
" algoGauss(M, precision=2) | \n",
" Cette fonction renvoie la matrice augmentée de la matrice passée en paramètre et renvoie la matrice augmentée après des opérations sur les lignes et permettant de faire apparaitre la matrice identité à gauche. Si ce n'est pas possible la fonction renvoie None . | \n",
"
\n",
" \n",
" invMat(M, precision=2) | \n",
" Cette fonction renvoie l'inverse de la matrice passé en paramètre. Si ce n'est pas possible la fonction renvoie None . | \n",
"
\n",
"
\n",
" \n",
" \n",
" - \n",
"
Les développements de la partie 2 : L'algorithme du simplexe
\n",
" \n",
" \n",
" {\n",
" 'VAR':[\"x\", \"y\"],\n",
" 'A':[\n",
" [2, 1],\n",
" [1, 2]\n",
" ],\n",
" 'SYMB':['<', '<'],\n",
" 'MINouMAX':'Max',\n",
" 'B':[11, 10],\n",
" 'C':[1, 1]\n",
"} | \n",
" Structure d'un problème linéaire dans ce TP | \n",
"
\n",
" \n",
" printPL(PL, precision=2) | \n",
" Affiche un problème linéaire avec la precision spécifié. Si le problème est mal saisi, la fonction renvoie la chaine vide. | \n",
"
\n",
" \n",
" {\n",
" 'VAR_E':[\"x\", \"y\", \"e_{1}\", \"e_{2}\"],\n",
" 'VAR_S':[2, 3],\n",
" 'MAT':[\n",
" [2, 1, 1, 0, 11],\n",
" [1, 2, 0, 1, 10],\n",
" [1, 1, 0, 0, 0]\n",
" ]\n",
"} | \n",
" Structure d'un tableau de simplexe dans ce TP | \n",
"
\n",
" \n",
" printTAB(TAB, precision=2) | \n",
" Affiche un tableau de simplexe avec la precision spécifié. Si le problème est mal saisi, la fonction renvoie la chaine vide. | \n",
"
\n",
" \n",
" init_simplexe(PL) | \n",
" Cette fonction prend en a paramètre un problème linéaire et renvoie le tableau de simplexe initiale | \n",
"
\n",
" \n",
" cherchePivot(TAB) | \n",
" Cette fonction prend en a paramètre un tableau de simplexe et renvoie le tuple i, j correspondant à la ligne et la colonne du pivot. Si ce n'est pas possible alors la fonction renvoie -1, -1 . | \n",
"
\n",
" \n",
" unTour(TAB, I, J) | \n",
" Cette fonction renvoie le tableau de simplexe passé en paramètre après une itération autour du pivot en I , J . | \n",
"
\n",
" \n",
" algoSimplexe(TAB) | \n",
" Cette fonction renvoie le tableau de simplexe passé en paramètre après l'application de l'algorithme du simplexe. | \n",
"
\n",
" \n",
" lectureTABSimplexe(TAB, PL) | \n",
" Cette fonction prend en paramètre un tableau de simplexe et le problème initiale et renvoie le dictionnaire où les étiquettes sont les variables initiale du problème et les valeurs, les valeurs par lecture du tableau du simplexe. | \n",
"
\n",
"
\n",
" \n",
" \n",
" - \n",
"
Les développements de la partie 3 : L'algorithme des deux phases
\n",
" \n",
" \n",
" init_phase1(PL) | \n",
" Cette fonction renvoie l'initialisation de la première phase. | \n",
"
\n",
" \n",
" init_phase2(TAB, PL, precision=2) | \n",
" Cette fonction renvoie l'initialisation de la seconde phase à partir du problème initiale PL et du tableau TAB de la fin de la première phase. | \n",
"
\n",
" \n",
" algo2phase2(PL, precision=2) | \n",
" Cett procédure affiche la première phase et sa conclusion et la seconde phase et sa conclusion, si c'est possible. | \n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
" "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a69f7a6f-ba00-4dcc-9a9b-ec77bb6f5a05",
"metadata": {},
"outputs": [],
"source": [
"def algoSimplexe(TAB) :\n",
" return TAB"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "7cf0f6ac-6e88-42d1-9806-d025e1c7a0d3",
"metadata": {},
"outputs": [],
"source": [
"#Test\n",
"\n",
"print(\"Problème linéaire\")\n",
"printPL(PL2)\n",
"\n",
"print(\"Initialisation\")\n",
"TAB2 = init_simplexe(PL2)\n",
"printTAB(TAB2)\n",
"\n",
"print(\"A la fin de l'algorithme du simplexe\")\n",
"TAB2_fin = algoSimplexe(TAB2)\n",
"printTAB(TAB2_fin)\n",
"\"\"\"\n",
" x y e1 e2\n",
"x 1.0 0.0 0.67 -0.33 4.0\n",
"y 0.0 1.0 -0.33 0.67 3.0\n",
"Obj 0.0 0.0 -0.33 -0.33 -7.0\n",
"\"\"\";"
]
},
{
"cell_type": "markdown",
"id": "717ec8f3-4dde-4509-96bf-6b56d85b5e58",
"metadata": {},
"source": [
"Écrire la fonction lectureTABSimplexe(TAB, PL)
qui prend en paramètre un tableau de simplexe et le problème initiale et renvoie le dictionnaire où les étiquettes sont les variables initiale du problème et les valeurs, les valeurs par lecture du tableau du simplexe.
\n",
"\n",
"\n",
"\n",
" Aide Cliquez pour dérouler
\n",
" \n",
" - \n",
"
Les développements de la partie 1 : L'algorithme de Gauss
\n",
" \n",
" \n",
" printM(M, pecision=2) | \n",
" Cette procédure affiche, en $\\LaTeX$, la matrice passée en paramètre. En cas d'erreur dans la saisie, cette procédure renvoie la chaine de caractère \"\" . Le paramètre optionnelle precision permet d'indiquer combien de décimale nous souhaitons afficher au maximum. Par défaut, il vaut 2 | \n",
"
\n",
" \n",
" matriceAugmentee(M) | \n",
" Cette fonction renvoie la matrice augmentée de la matrice passée en paramètre. En cas de problème de dimension la fonction renvoie None . | \n",
"
\n",
" \n",
" operationGaussEchange(M, I, J) | \n",
" Cette fonction renvoie la matrice M où les lignes I et J ont été échangée. | \n",
"
\n",
" \n",
" operationGaussDilatation(M, I, coef) | \n",
" Cette fonction renvoie la matrice M où la ligne I est multipliée par un coefficient coef . | \n",
"
\n",
" \n",
" operationGaussCombinaison(M, I, J, coef) | \n",
" Cette fonction renvoie la matrice M où on a ajouté à la ligne I la ligne J multipliée par coef . | \n",
"
\n",
" \n",
" recupInv(MAugmentee) | \n",
" Cette fonction renvoie l'inverse de la matrice M à partir de la matrice augmenté passé en paramètre. La fonction renvoie None si ce n'est pas possible. | \n",
"
\n",
" \n",
" echelonnage(M, precision=2) | \n",
" Cette fonction renvoie la matrice passé en paramètre après échelonnage. La variable precision permet de rafiner sur les approximations numérique. | \n",
"
\n",
" \n",
" algoGauss(M, precision=2) | \n",
" Cette fonction renvoie la matrice augmentée de la matrice passée en paramètre et renvoie la matrice augmentée après des opérations sur les lignes et permettant de faire apparaitre la matrice identité à gauche. Si ce n'est pas possible la fonction renvoie None . | \n",
"
\n",
" \n",
" invMat(M, precision=2) | \n",
" Cette fonction renvoie l'inverse de la matrice passé en paramètre. Si ce n'est pas possible la fonction renvoie None . | \n",
"
\n",
"
\n",
" \n",
" \n",
" - \n",
"
Les développements de la partie 2 : L'algorithme du simplexe
\n",
" \n",
" \n",
" {\n",
" 'VAR':[\"x\", \"y\"],\n",
" 'A':[\n",
" [2, 1],\n",
" [1, 2]\n",
" ],\n",
" 'SYMB':['<', '<'],\n",
" 'MINouMAX':'Max',\n",
" 'B':[11, 10],\n",
" 'C':[1, 1]\n",
"} | \n",
" Structure d'un problème linéaire dans ce TP | \n",
"
\n",
" \n",
" printPL(PL, precision=2) | \n",
" Affiche un problème linéaire avec la precision spécifié. Si le problème est mal saisi, la fonction renvoie la chaine vide. | \n",
"
\n",
" \n",
" {\n",
" 'VAR_E':[\"x\", \"y\", \"e_{1}\", \"e_{2}\"],\n",
" 'VAR_S':[2, 3],\n",
" 'MAT':[\n",
" [2, 1, 1, 0, 11],\n",
" [1, 2, 0, 1, 10],\n",
" [1, 1, 0, 0, 0]\n",
" ]\n",
"} | \n",
" Structure d'un tableau de simplexe dans ce TP | \n",
"
\n",
" \n",
" printTAB(TAB, precision=2) | \n",
" Affiche un tableau de simplexe avec la precision spécifié. Si le problème est mal saisi, la fonction renvoie la chaine vide. | \n",
"
\n",
" \n",
" init_simplexe(PL) | \n",
" Cette fonction prend en a paramètre un problème linéaire et renvoie le tableau de simplexe initiale | \n",
"
\n",
" \n",
" cherchePivot(TAB) | \n",
" Cette fonction prend en a paramètre un tableau de simplexe et renvoie le tuple i, j correspondant à la ligne et la colonne du pivot. Si ce n'est pas possible alors la fonction renvoie -1, -1 . | \n",
"
\n",
" \n",
" unTour(TAB, I, J) | \n",
" Cette fonction renvoie le tableau de simplexe passé en paramètre après une itération autour du pivot en I , J . | \n",
"
\n",
" \n",
" algoSimplexe(TAB) | \n",
" Cette fonction renvoie le tableau de simplexe passé en paramètre après l'application de l'algorithme du simplexe. | \n",
"
\n",
" \n",
" lectureTABSimplexe(TAB, PL) | \n",
" Cette fonction prend en paramètre un tableau de simplexe et le problème initiale et renvoie le dictionnaire où les étiquettes sont les variables initiale du problème et les valeurs, les valeurs par lecture du tableau du simplexe. | \n",
"
\n",
"
\n",
" \n",
" \n",
" - \n",
"
Les développements de la partie 3 : L'algorithme des deux phases
\n",
" \n",
" \n",
" init_phase1(PL) | \n",
" Cette fonction renvoie l'initialisation de la première phase. | \n",
"
\n",
" \n",
" init_phase2(TAB, PL, precision=2) | \n",
" Cette fonction renvoie l'initialisation de la seconde phase à partir du problème initiale PL et du tableau TAB de la fin de la première phase. | \n",
"
\n",
" \n",
" algo2phase2(PL, precision=2) | \n",
" Cett procédure affiche la première phase et sa conclusion et la seconde phase et sa conclusion, si c'est possible. | \n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
" "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "ae455cbc-9b71-47a4-9b1e-fae7bcb3fd8f",
"metadata": {},
"outputs": [],
"source": [
"def lectureTABSimplexe(TAB, PL) : \n",
" solution={}\n",
" return solution"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "1a93e1ac-1cae-4e6c-8a23-1d2e8967800e",
"metadata": {},
"outputs": [],
"source": [
"#Test \n",
"\n",
"print(\"Problème linéaire\")\n",
"printPL(PL2)\n",
"\n",
"print(\"Initialisation\")\n",
"printTAB(TAB2)\n",
"\n",
"print(\"A la fin de l'algorithme du simplexe\")\n",
"TAB2_fin = algoSimplexe(TAB2)\n",
"printTAB(TAB2_fin)\n",
"\n",
"print(\"Solution :\", lectureTABSimplexe(TAB2_fin, PL2))#{'x': 4.0, 'y': 3.0}"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "6f27aa7f-2e65-4b63-a112-eb7ab3594357",
"metadata": {},
"outputs": [],
"source": [
"#Test\n",
"\n",
"PL={\n",
" 'VAR':[\"x\", \"y\", \"z\"],\n",
" 'A':[\n",
" [0, 1, -1],\n",
" [1, -1, 1],\n",
" [-1, 0, 1],\n",
" [1, 0, 1]\n",
" ],\n",
" 'SYMB':['<', '<', '<', '<'],\n",
" 'MINouMAX':'Max',\n",
" 'B':[11, 10, 9, 8],\n",
" 'C':[1, 1, 1]\n",
"}\n",
"\n",
"printPL(PL)\n",
"print(\"Solution :\", lectureTABSimplexe(algoSimplexe(init_simplexe(PL)), PL))#{'x': 0, 'y': 19.0, 'z': 8.0}"
]
},
{
"cell_type": "markdown",
"id": "888c79bd-23ae-4e47-8962-6b1db11185ca",
"metadata": {},
"source": [
"\n",
" Partie 3 : L'algorithme des deux phases\n",
"
\n",
"\n",
"\n",
" \n",
" Menu de navigation (cliquez pour dérouler)
\n",
" \n",
" \n",
"
"
]
},
{
"cell_type": "markdown",
"id": "8eeb5260-2826-4050-98b9-106877a97a4a",
"metadata": {},
"source": [
"Nous reprennons exactement les même structures que précédement, sauf que la structure TAB
des tableaux de simplexe, a un champ supplémentaire : 'VAR_A'
qui est la liste des indices des variables artificielles.
\n",
"\n",
"Écrire la fonction init_phase1(PL)
qui renvoie le tableau d'initialisation de la première phase. On prendra en particulier bien garde à tous les éléments de l'initialisation à prendre en compte.
\n",
"\n",
"\n",
"\n",
" Aide Cliquez pour dérouler
\n",
" \n",
" - \n",
"
Les développements de la partie 1 : L'algorithme de Gauss
\n",
" \n",
" \n",
" printM(M, pecision=2) | \n",
" Cette procédure affiche, en $\\LaTeX$, la matrice passée en paramètre. En cas d'erreur dans la saisie, cette procédure renvoie la chaine de caractère \"\" . Le paramètre optionnelle precision permet d'indiquer combien de décimale nous souhaitons afficher au maximum. Par défaut, il vaut 2 | \n",
"
\n",
" \n",
" matriceAugmentee(M) | \n",
" Cette fonction renvoie la matrice augmentée de la matrice passée en paramètre. En cas de problème de dimension la fonction renvoie None . | \n",
"
\n",
" \n",
" operationGaussEchange(M, I, J) | \n",
" Cette fonction renvoie la matrice M où les lignes I et J ont été échangée. | \n",
"
\n",
" \n",
" operationGaussDilatation(M, I, coef) | \n",
" Cette fonction renvoie la matrice M où la ligne I est multipliée par un coefficient coef . | \n",
"
\n",
" \n",
" operationGaussCombinaison(M, I, J, coef) | \n",
" Cette fonction renvoie la matrice M où on a ajouté à la ligne I la ligne J multipliée par coef . | \n",
"
\n",
" \n",
" recupInv(MAugmentee) | \n",
" Cette fonction renvoie l'inverse de la matrice M à partir de la matrice augmenté passé en paramètre. La fonction renvoie None si ce n'est pas possible. | \n",
"
\n",
" \n",
" echelonnage(M, precision=2) | \n",
" Cette fonction renvoie la matrice passé en paramètre après échelonnage. La variable precision permet de rafiner sur les approximations numérique. | \n",
"
\n",
" \n",
" algoGauss(M, precision=2) | \n",
" Cette fonction renvoie la matrice augmentée de la matrice passée en paramètre et renvoie la matrice augmentée après des opérations sur les lignes et permettant de faire apparaitre la matrice identité à gauche. Si ce n'est pas possible la fonction renvoie None . | \n",
"
\n",
" \n",
" invMat(M, precision=2) | \n",
" Cette fonction renvoie l'inverse de la matrice passé en paramètre. Si ce n'est pas possible la fonction renvoie None . | \n",
"
\n",
"
\n",
" \n",
" \n",
" - \n",
"
Les développements de la partie 2 : L'algorithme du simplexe
\n",
" \n",
" \n",
" {\n",
" 'VAR':[\"x\", \"y\"],\n",
" 'A':[\n",
" [2, 1],\n",
" [1, 2]\n",
" ],\n",
" 'SYMB':['<', '<'],\n",
" 'MINouMAX':'Max',\n",
" 'B':[11, 10],\n",
" 'C':[1, 1]\n",
"} | \n",
" Structure d'un problème linéaire dans ce TP | \n",
"
\n",
" \n",
" printPL(PL, precision=2) | \n",
" Affiche un problème linéaire avec la precision spécifié. Si le problème est mal saisi, la fonction renvoie la chaine vide. | \n",
"
\n",
" \n",
" {\n",
" 'VAR_E':[\"x\", \"y\", \"e_{1}\", \"e_{2}\"],\n",
" 'VAR_S':[2, 3],\n",
" 'MAT':[\n",
" [2, 1, 1, 0, 11],\n",
" [1, 2, 0, 1, 10],\n",
" [1, 1, 0, 0, 0]\n",
" ]\n",
"} | \n",
" Structure d'un tableau de simplexe dans ce TP | \n",
"
\n",
" \n",
" printTAB(TAB, precision=2) | \n",
" Affiche un tableau de simplexe avec la precision spécifié. Si le problème est mal saisi, la fonction renvoie la chaine vide. | \n",
"
\n",
" \n",
" init_simplexe(PL) | \n",
" Cette fonction prend en a paramètre un problème linéaire et renvoie le tableau de simplexe initiale | \n",
"
\n",
" \n",
" cherchePivot(TAB) | \n",
" Cette fonction prend en a paramètre un tableau de simplexe et renvoie le tuple i, j correspondant à la ligne et la colonne du pivot. Si ce n'est pas possible alors la fonction renvoie -1, -1 . | \n",
"
\n",
" \n",
" unTour(TAB, I, J) | \n",
" Cette fonction renvoie le tableau de simplexe passé en paramètre après une itération autour du pivot en I , J . | \n",
"
\n",
" \n",
" algoSimplexe(TAB) | \n",
" Cette fonction renvoie le tableau de simplexe passé en paramètre après l'application de l'algorithme du simplexe. | \n",
"
\n",
" \n",
" lectureTABSimplexe(TAB, PL) | \n",
" Cette fonction prend en paramètre un tableau de simplexe et le problème initiale et renvoie le dictionnaire où les étiquettes sont les variables initiale du problème et les valeurs, les valeurs par lecture du tableau du simplexe. | \n",
"
\n",
"
\n",
" \n",
" \n",
" - \n",
"
Les développements de la partie 3 : L'algorithme des deux phases
\n",
" \n",
" \n",
" init_phase1(PL) | \n",
" Cette fonction renvoie l'initialisation de la première phase. | \n",
"
\n",
" \n",
" init_phase2(TAB, PL, precision=2) | \n",
" Cette fonction renvoie l'initialisation de la seconde phase à partir du problème initiale PL et du tableau TAB de la fin de la première phase. | \n",
"
\n",
" \n",
" algo2phase2(PL, precision=2) | \n",
" Cett procédure affiche la première phase et sa conclusion et la seconde phase et sa conclusion, si c'est possible. | \n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
" "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "846aa9ed-0a6f-4f36-a806-f870bf655df2",
"metadata": {},
"outputs": [],
"source": [
"def init_phase1(PL) : \n",
" TAB = {'VAR_E':[], 'VAR_S':[], 'VAR_A':[], 'MAT':[]}\n",
" return TAB"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "d76862c5-8ac2-4506-9ef5-4485e263c426",
"metadata": {},
"outputs": [],
"source": [
"#Test\n",
"\n",
"PL3 = {\n",
" 'VAR':[\"x\", \"y\"],\n",
" 'A':[\n",
" [1, 2],\n",
" [-1, -1],\n",
" [3, 1]\n",
" ],\n",
" 'SYMB':['<', '<', '='],\n",
" 'MINouMAX':'Max',\n",
" 'B':[4, -1, 6],\n",
" 'C':[2, 1]\n",
"}\n",
"\n",
"TAB3_init1 = init_phase1(PL3)\n",
"TAB3_fin1 = algoSimplexe(TAB3_init1)\n",
"TAB3_fin1['VAR_A'] = TAB3_init1['VAR_A']\n",
"\n",
"print(\"Problème initiale\")\n",
"printPL(PL3)\n",
"\n",
"print(\"Initialisation de la phase 1\")\n",
"printTAB(TAB3_init1)\n",
"\n",
"print(\"Fin de la phase 1\")\n",
"printTAB(TAB3_fin1)\n",
"\n",
"\"\"\"\n",
" x y e1 e2 a1 a2\n",
"e1 0.0 1.67 1.0 0.0 0.0 -0.33 2.0\n",
"x 1.0 0.33 0.0 0.0 0.0 0.33 2.0\n",
"e2 0.0 -0.67 0.0 1.0 -1.0 0.33 1.0\n",
"Obj 0.0 0.0 0.0 0.0 -1.0 -1.0 0.0\n",
"\"\"\";"
]
},
{
"cell_type": "markdown",
"id": "d4197835-4821-407d-b6b0-f3902e17a9d8",
"metadata": {},
"source": [
"Écrire la fonction init_phase2(TAB, PL, precision=2)
qui renvoie le tableau d'initialisation de la seconde phase. La variable TAB
correspond au tableau du simplexe à la fin de la première phase, la variable PL
correspond au problème initiale quand à la variable precision
elle correspond à la précision des valeurs souhaitée
\n",
"\n",
"\n",
" Aide Cliquez pour dérouler
\n",
" \n",
" - \n",
"
Les développements de la partie 1 : L'algorithme de Gauss
\n",
" \n",
" \n",
" printM(M, pecision=2) | \n",
" Cette procédure affiche, en $\\LaTeX$, la matrice passée en paramètre. En cas d'erreur dans la saisie, cette procédure renvoie la chaine de caractère \"\" . Le paramètre optionnelle precision permet d'indiquer combien de décimale nous souhaitons afficher au maximum. Par défaut, il vaut 2 | \n",
"
\n",
" \n",
" matriceAugmentee(M) | \n",
" Cette fonction renvoie la matrice augmentée de la matrice passée en paramètre. En cas de problème de dimension la fonction renvoie None . | \n",
"
\n",
" \n",
" operationGaussEchange(M, I, J) | \n",
" Cette fonction renvoie la matrice M où les lignes I et J ont été échangée. | \n",
"
\n",
" \n",
" operationGaussDilatation(M, I, coef) | \n",
" Cette fonction renvoie la matrice M où la ligne I est multipliée par un coefficient coef . | \n",
"
\n",
" \n",
" operationGaussCombinaison(M, I, J, coef) | \n",
" Cette fonction renvoie la matrice M où on a ajouté à la ligne I la ligne J multipliée par coef . | \n",
"
\n",
" \n",
" recupInv(MAugmentee) | \n",
" Cette fonction renvoie l'inverse de la matrice M à partir de la matrice augmenté passé en paramètre. La fonction renvoie None si ce n'est pas possible. | \n",
"
\n",
" \n",
" echelonnage(M, precision=2) | \n",
" Cette fonction renvoie la matrice passé en paramètre après échelonnage. La variable precision permet de rafiner sur les approximations numérique. | \n",
"
\n",
" \n",
" algoGauss(M, precision=2) | \n",
" Cette fonction renvoie la matrice augmentée de la matrice passée en paramètre et renvoie la matrice augmentée après des opérations sur les lignes et permettant de faire apparaitre la matrice identité à gauche. Si ce n'est pas possible la fonction renvoie None . | \n",
"
\n",
" \n",
" invMat(M, precision=2) | \n",
" Cette fonction renvoie l'inverse de la matrice passé en paramètre. Si ce n'est pas possible la fonction renvoie None . | \n",
"
\n",
"
\n",
" \n",
" \n",
" - \n",
"
Les développements de la partie 2 : L'algorithme du simplexe
\n",
" \n",
" \n",
" {\n",
" 'VAR':[\"x\", \"y\"],\n",
" 'A':[\n",
" [2, 1],\n",
" [1, 2]\n",
" ],\n",
" 'SYMB':['<', '<'],\n",
" 'MINouMAX':'Max',\n",
" 'B':[11, 10],\n",
" 'C':[1, 1]\n",
"} | \n",
" Structure d'un problème linéaire dans ce TP | \n",
"
\n",
" \n",
" printPL(PL, precision=2) | \n",
" Affiche un problème linéaire avec la precision spécifié. Si le problème est mal saisi, la fonction renvoie la chaine vide. | \n",
"
\n",
" \n",
" {\n",
" 'VAR_E':[\"x\", \"y\", \"e_{1}\", \"e_{2}\"],\n",
" 'VAR_S':[2, 3],\n",
" 'MAT':[\n",
" [2, 1, 1, 0, 11],\n",
" [1, 2, 0, 1, 10],\n",
" [1, 1, 0, 0, 0]\n",
" ]\n",
"} | \n",
" Structure d'un tableau de simplexe dans ce TP | \n",
"
\n",
" \n",
" printTAB(TAB, precision=2) | \n",
" Affiche un tableau de simplexe avec la precision spécifié. Si le problème est mal saisi, la fonction renvoie la chaine vide. | \n",
"
\n",
" \n",
" init_simplexe(PL) | \n",
" Cette fonction prend en a paramètre un problème linéaire et renvoie le tableau de simplexe initiale | \n",
"
\n",
" \n",
" cherchePivot(TAB) | \n",
" Cette fonction prend en a paramètre un tableau de simplexe et renvoie le tuple i, j correspondant à la ligne et la colonne du pivot. Si ce n'est pas possible alors la fonction renvoie -1, -1 . | \n",
"
\n",
" \n",
" unTour(TAB, I, J) | \n",
" Cette fonction renvoie le tableau de simplexe passé en paramètre après une itération autour du pivot en I , J . | \n",
"
\n",
" \n",
" algoSimplexe(TAB) | \n",
" Cette fonction renvoie le tableau de simplexe passé en paramètre après l'application de l'algorithme du simplexe. | \n",
"
\n",
" \n",
" lectureTABSimplexe(TAB, PL) | \n",
" Cette fonction prend en paramètre un tableau de simplexe et le problème initiale et renvoie le dictionnaire où les étiquettes sont les variables initiale du problème et les valeurs, les valeurs par lecture du tableau du simplexe. | \n",
"
\n",
"
\n",
" \n",
" \n",
" - \n",
"
Les développements de la partie 3 : L'algorithme des deux phases
\n",
" \n",
" \n",
" init_phase1(PL) | \n",
" Cette fonction renvoie l'initialisation de la première phase. | \n",
"
\n",
" \n",
" init_phase2(TAB, PL, precision=2) | \n",
" Cette fonction renvoie l'initialisation de la seconde phase à partir du problème initiale PL et du tableau TAB de la fin de la première phase. | \n",
"
\n",
" \n",
" algo2phase2(PL, precision=2) | \n",
" Cett procédure affiche la première phase et sa conclusion et la seconde phase et sa conclusion, si c'est possible. | \n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
" "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "3526a7f0-7664-46de-aba2-6d0f2913651d",
"metadata": {},
"outputs": [],
"source": [
"def init_phase2(TAB, PL, precision=2) :\n",
" newTAB={'VAR_E':[], 'VAR_S':[], 'MAT':[]}\n",
" return newTAB"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "5f438566-c7b2-4a3e-85cb-fef5d732e516",
"metadata": {},
"outputs": [],
"source": [
"#Test\n",
"\n",
"TAB3_init2=init_phase2(TAB3_fin1, PL3)\n",
"TAB3_fin2=algoSimplexe(TAB3_init2)\n",
"\n",
"print(\"Problème initiale\")\n",
"printPL(PL3)\n",
"\n",
"print(\"Initialisation de la phase 1\")\n",
"printTAB(TAB3_init1)\n",
"\n",
"print(\"Fin de la phase 1\")\n",
"printTAB(TAB3_fin1)\n",
"\n",
"print(\"initialisation de la phase 2\")\n",
"printTAB(TAB3_init2)\n",
"\n",
"print(\"Fin de la phase 2\")\n",
"printTAB(TAB3_fin2)\n",
"\n",
"print(\"Solution :\", lectureTABSimplexe(TAB3_fin2, PL3))#{'x': 1.5999999999999999, 'y': 1.2000000000000002}"
]
},
{
"cell_type": "markdown",
"id": "0894d471-cb88-4b45-820a-aa1babe36566",
"metadata": {},
"source": [
"Écrire la procédure algo2phases(PL, precision=2)
qui affiche la première phase et sa conclusion et la seconde phase et sa conclusion, si c'est possible.
\n",
"\n",
"\n",
"\n",
" Aide Cliquez pour dérouler
\n",
" \n",
" - \n",
"
Les développements de la partie 1 : L'algorithme de Gauss
\n",
" \n",
" \n",
" printM(M, pecision=2) | \n",
" Cette procédure affiche, en $\\LaTeX$, la matrice passée en paramètre. En cas d'erreur dans la saisie, cette procédure renvoie la chaine de caractère \"\" . Le paramètre optionnelle precision permet d'indiquer combien de décimale nous souhaitons afficher au maximum. Par défaut, il vaut 2 | \n",
"
\n",
" \n",
" matriceAugmentee(M) | \n",
" Cette fonction renvoie la matrice augmentée de la matrice passée en paramètre. En cas de problème de dimension la fonction renvoie None . | \n",
"
\n",
" \n",
" operationGaussEchange(M, I, J) | \n",
" Cette fonction renvoie la matrice M où les lignes I et J ont été échangée. | \n",
"
\n",
" \n",
" operationGaussDilatation(M, I, coef) | \n",
" Cette fonction renvoie la matrice M où la ligne I est multipliée par un coefficient coef . | \n",
"
\n",
" \n",
" operationGaussCombinaison(M, I, J, coef) | \n",
" Cette fonction renvoie la matrice M où on a ajouté à la ligne I la ligne J multipliée par coef . | \n",
"
\n",
" \n",
" recupInv(MAugmentee) | \n",
" Cette fonction renvoie l'inverse de la matrice M à partir de la matrice augmenté passé en paramètre. La fonction renvoie None si ce n'est pas possible. | \n",
"
\n",
" \n",
" echelonnage(M, precision=2) | \n",
" Cette fonction renvoie la matrice passé en paramètre après échelonnage. La variable precision permet de rafiner sur les approximations numérique. | \n",
"
\n",
" \n",
" algoGauss(M, precision=2) | \n",
" Cette fonction renvoie la matrice augmentée de la matrice passée en paramètre et renvoie la matrice augmentée après des opérations sur les lignes et permettant de faire apparaitre la matrice identité à gauche. Si ce n'est pas possible la fonction renvoie None . | \n",
"
\n",
" \n",
" invMat(M, precision=2) | \n",
" Cette fonction renvoie l'inverse de la matrice passé en paramètre. Si ce n'est pas possible la fonction renvoie None . | \n",
"
\n",
"
\n",
" \n",
" \n",
" - \n",
"
Les développements de la partie 2 : L'algorithme du simplexe
\n",
" \n",
" \n",
" {\n",
" 'VAR':[\"x\", \"y\"],\n",
" 'A':[\n",
" [2, 1],\n",
" [1, 2]\n",
" ],\n",
" 'SYMB':['<', '<'],\n",
" 'MINouMAX':'Max',\n",
" 'B':[11, 10],\n",
" 'C':[1, 1]\n",
"} | \n",
" Structure d'un problème linéaire dans ce TP | \n",
"
\n",
" \n",
" printPL(PL, precision=2) | \n",
" Affiche un problème linéaire avec la precision spécifié. Si le problème est mal saisi, la fonction renvoie la chaine vide. | \n",
"
\n",
" \n",
" {\n",
" 'VAR_E':[\"x\", \"y\", \"e_{1}\", \"e_{2}\"],\n",
" 'VAR_S':[2, 3],\n",
" 'MAT':[\n",
" [2, 1, 1, 0, 11],\n",
" [1, 2, 0, 1, 10],\n",
" [1, 1, 0, 0, 0]\n",
" ]\n",
"} | \n",
" Structure d'un tableau de simplexe dans ce TP | \n",
"
\n",
" \n",
" printTAB(TAB, precision=2) | \n",
" Affiche un tableau de simplexe avec la precision spécifié. Si le problème est mal saisi, la fonction renvoie la chaine vide. | \n",
"
\n",
" \n",
" init_simplexe(PL) | \n",
" Cette fonction prend en a paramètre un problème linéaire et renvoie le tableau de simplexe initiale | \n",
"
\n",
" \n",
" cherchePivot(TAB) | \n",
" Cette fonction prend en a paramètre un tableau de simplexe et renvoie le tuple i, j correspondant à la ligne et la colonne du pivot. Si ce n'est pas possible alors la fonction renvoie -1, -1 . | \n",
"
\n",
" \n",
" unTour(TAB, I, J) | \n",
" Cette fonction renvoie le tableau de simplexe passé en paramètre après une itération autour du pivot en I , J . | \n",
"
\n",
" \n",
" algoSimplexe(TAB) | \n",
" Cette fonction renvoie le tableau de simplexe passé en paramètre après l'application de l'algorithme du simplexe. | \n",
"
\n",
" \n",
" lectureTABSimplexe(TAB, PL) | \n",
" Cette fonction prend en paramètre un tableau de simplexe et le problème initiale et renvoie le dictionnaire où les étiquettes sont les variables initiale du problème et les valeurs, les valeurs par lecture du tableau du simplexe. | \n",
"
\n",
"
\n",
" \n",
" \n",
" - \n",
"
Les développements de la partie 3 : L'algorithme des deux phases
\n",
" \n",
" \n",
" init_phase1(PL) | \n",
" Cette fonction renvoie l'initialisation de la première phase. | \n",
"
\n",
" \n",
" init_phase1(TAB, PL, precision=2) | \n",
" Cette fonction renvoie l'initialisation de la seconde phase à partir du problème initiale PL et du tableau TAB de la fin de la première phase. | \n",
"
\n",
" \n",
" algo2phase2(PL, precision=2) | \n",
" Cett procédure affiche la première phase et sa conclusion et la seconde phase et sa conclusion, si c'est possible. | \n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
" "
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "912cee41-fc22-441e-b278-cc30ceeb25cb",
"metadata": {},
"outputs": [],
"source": [
"def algo2phases(PL, precision=2) : \n",
" return"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "c08ad5a0-b78e-4c24-8599-13e037f8010e",
"metadata": {},
"outputs": [],
"source": [
"#Test\n",
"\n",
"PL3 = {\n",
" 'VAR':[\"x\", \"y\"],\n",
" 'A':[\n",
" [1, 2],\n",
" [-1, -1],\n",
" [3, 1]\n",
" ],\n",
" 'SYMB':['<', '<', '='],\n",
" 'MINouMAX':'Max',\n",
" 'B':[4, -1, 6],\n",
" 'C':[2, 1]\n",
"}\n",
"\n",
"algo2phases(PL3)#{'x': 1.5999999999999999, 'y': 1.2000000000000002}"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "c3c04eec-5387-4d88-b8a6-e8ef00c84789",
"metadata": {},
"outputs": [],
"source": [
"#Test\n",
"\n",
"PL4 = {\n",
" 'VAR':[\"x\", \"y\", \"z\"],\n",
" 'A':[\n",
" [1, 1, 0],\n",
" [-1, 0, -1],\n",
" [0, 1, 1]\n",
" ],\n",
" 'SYMB':['>', '<', '='],\n",
" 'MINouMAX':'Max',\n",
" 'B':[4, -1, 6],\n",
" 'C':[1, 1, 1]\n",
"}\n",
"\n",
"algo2phases(PL4)#{'x': 1.0, 'y': 6.0, 'z': 0}"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "23662eaf-1f97-4db7-99ca-4d8ce0120374",
"metadata": {},
"outputs": [],
"source": [
"#Test\n",
"\n",
"PL5 = {\n",
" 'VAR':[\"x\", \"y\"],\n",
" 'A':[\n",
" [9, 7],\n",
" [8, 4],\n",
" [1, 9]\n",
" ],\n",
" 'SYMB':['<', '>', '='],\n",
" 'MINouMAX':'Max',\n",
" 'B':[9, 7, 2],\n",
" 'C':[5, 2]\n",
"}\n",
"\n",
"algo2phases(PL5)#{'x': 0.9054054054054055, 'y': 0.12162162162162159}"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "b7917f5e-12a0-4780-ae43-985f0050e34b",
"metadata": {},
"outputs": [],
"source": [
"#Test\n",
"PL6 = {\n",
" 'VAR':[\"x_1\", \"x_2\", \"x_3\", \"x_4\", \"x_5\"],\n",
" 'A':[\n",
" [1, 1, 9, 6, 9],\n",
" [0, 7, 8, 5, 5],\n",
" [3, 3, 8, 3, 5]\n",
" ],\n",
" 'SYMB':['<', '=', '>'],\n",
" 'MINouMAX':'Min',\n",
" 'B':[6, 9, 2],\n",
" 'C':[8, 3, 3, 3, 9]\n",
"}\n",
"\n",
"algo2phases(PL6)#{'x_1': 0, 'x_2': 0.6, 'x_3': 0.6, 'x_4': 0, 'x_5': 0}"
]
}
],
"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.12.1"
}
},
"nbformat": 4,
"nbformat_minor": 5
}