Hello everyone,
I am currently learning how to use Python to solve linear programming problems.
I wrote an algorithm to calculate the quantities produced Qij of a production of glasses and the level of the Sij stock with i models and j weeks. The aim being to minimize the total cost of production and storage while meeting customer demand (in the Demande_table.csv file) and respecting initial, final stock constraints as well as the work capacities of machines, labor staff and maximum storage (in the Donnees_prod_table.csv files).
I managed to operate the algorithm only by removing the constraint which allows the consistency of stocks between the weeks. The result is therefore not concluded. I don't understand why this constraint makes my problem "Undifined" :
I am currently learning how to use Python to solve linear programming problems.
I wrote an algorithm to calculate the quantities produced Qij of a production of glasses and the level of the Sij stock with i models and j weeks. The aim being to minimize the total cost of production and storage while meeting customer demand (in the Demande_table.csv file) and respecting initial, final stock constraints as well as the work capacities of machines, labor staff and maximum storage (in the Donnees_prod_table.csv files).
I managed to operate the algorithm only by removing the constraint which allows the consistency of stocks between the weeks. The result is therefore not concluded. I don't understand why this constraint makes my problem "Undifined" :
for i in range(1, n+1): for j in range(1, m+1): pb+= S[(i, j)] == S[(i, j-1)] + Q[(i, j)] - Demande_table.iloc[(i-1,j-1)]The entire code :
import numpy as np import pandas as pd import xlsxwriter import pulp import time # Enregistrer l'heure de début start_time = time.time() pb = pulp.LpProblem("Production_de_verres", pulp.LpMinimize) n = 6 # Nombre de modèles de verre m = 12 # Nombre de périodes # lecture des données du problème Demande_table = pd.read_csv('Demande_table.csv', index_col=['Modèle'], sep=';') Donnees_prod_table = pd.read_csv('Donnees_prod_table.csv', index_col=['Modèle'], sep=';') # Arrondir les variables à une seule décimale def float_1d(value): return round(value, 1) # Création des variables Qij : quantité de lots du verre i à produire en période j Q = pulp.LpVariable.dicts("Q", [(i,j) for i in range(1,n+1) for j in range(1,m+1)], lowBound=0, cat='Float') # Création des variables Sij : Niveau du stock du verre i en fin de période j S = pulp.LpVariable.dicts("S", [(i,j) for i in range(1,n+1) for j in range(0,m+1)], lowBound=0, cat='Float') # Définition des paramètres du problème CAT = 390 # Capacité de travail maximal des hommes par semaine CAM = 850 # Capacité maximale de travail des machines par semaine CAZ = 1000 # Capacité maximale de stockage C = Donnees_prod_table['Ci'].tolist() # Coûts de production du modèle i Cs = Donnees_prod_table['Csi'].tolist() # Coûts de stockage du modèle i SI = Donnees_prod_table['SI'].tolist() # Stock initial du modèle i SF = Donnees_prod_table['SF'].tolist() # Stock final du modèle i Tut = Donnees_prod_table['Tut'].tolist() # Temps unitaire de travail pour un lot du modèle i Tum = Donnees_prod_table['Tum'].tolist() # Temps unitaire d'utilisation des machines pour un lot du modèle i Tzs = Donnees_prod_table['Tzs'].tolist() # Taille unitaire dans le stockage pour un lot du modèle i # Définir la fonction objectif Obj = pulp.lpSum(C[i-1] * Q[(i,j)] + Cs[i-1] * S[(i,j)] for i in range(1,n+1) for j in range(1,m+1)) pb += Obj # Ajout des contraintes au modèle for i in range(1, n+1): pb += S[(i, 0)] == SI[i-1] pb += S[(i, m)] >= SF[i-1] pb += pulp.lpSum(Tut[i-1] * Q[(i,j)] for i in range(1, n+1) for j in range(1, m+1)) <= CAT pb += pulp.lpSum(Tum[i-1] * Q[(i,j)] for i in range(1, n+1) for j in range(1, m+1)) <= CAM pb += pulp.lpSum(Tzs[i-1] * S[(i,j)] for i in range(1, n+1) for j in range(1, m+1)) <= CAZ #for i in range(1, n+1): #for j in range(1, m+1): #pb+= S[(i, j)] == S[(i, j-1)] + Q[(i, j)] - Demande_table.iloc[(i-1,j-1)] # Résolution du problème pb.solve() # Affichage des résultats print("Statut : ", pulp.LpStatus[pb.status]) print("Coût total = ", pulp.value(pb.objective), "€") print ("\n") print("Quantité produite du modèle i en période j :") print("\n") Q_values = np.array([[Q[(i,j)].varValue for j in range(1, m+1)] for i in range(1, n+1)]) Q_df = pd.DataFrame(Q_values, index=[f'Modèle {i}' for i in range(1, n+1)], columns=[f'Période {j}' for j in range(1, m+1)]) print(Q_df) print("\n\n") print("Niveau de stock du modèle i en période en fin j :") print("\n") S_values = np.array([[S[(i,j)].varValue for j in range(m+1)] for i in range(1, n+1)]) S_df = pd.DataFrame(S_values, index=[f'Modèle {i}' for i in range(1, n+1)], columns=[f'Période {j}' for j in range(m+1)]) print(S_df) # Création d'un fichier Excel avec les résultats du problème writer = pd.ExcelWriter('Résultats_ExoProdVerres.xlsx', engine='xlsxwriter') Q_df.to_excel(writer, sheet_name='Qij') S_df.to_excel(writer, sheet_name='Sij') writer.save() # Enregistrer l'heure de fin et calculer le temps écoulé end_time = time.time() elapsed_time = end_time - start_time print ("\n\n") print("Temps écoulé:", elapsed_time, "secondes")The result :
Statut : Optimal Coût total = 1350.0 € Quantité produite du modèle i en période j : Période 1 Période 2 Période 3 Période 4 Période 5 Période 6 \ Modèle 1 0.0 0.0 0.0 0.0 0.0 0.0 Modèle 2 0.0 0.0 0.0 0.0 0.0 0.0 Modèle 3 0.0 0.0 0.0 0.0 0.0 0.0 Modèle 4 0.0 0.0 0.0 0.0 0.0 0.0 Modèle 5 0.0 0.0 0.0 0.0 0.0 0.0 Modèle 6 0.0 0.0 0.0 0.0 0.0 0.0 Période 7 Période 8 Période 9 Période 10 Période 11 Période 12 Modèle 1 0.0 0.0 0.0 0.0 0.0 0.0 Modèle 2 0.0 0.0 0.0 0.0 0.0 0.0 Modèle 3 0.0 0.0 0.0 0.0 0.0 0.0 Modèle 4 0.0 0.0 0.0 0.0 0.0 0.0 Modèle 5 0.0 0.0 0.0 0.0 0.0 0.0 Modèle 6 0.0 0.0 0.0 0.0 0.0 0.0 Niveau de stock du modèle i en période en fin j : Période 0 Période 1 Période 2 Période 3 Période 4 Période 5 \ Modèle 1 50.0 0.0 0.0 0.0 0.0 0.0 Modèle 2 20.0 0.0 0.0 0.0 0.0 0.0 Modèle 3 0.0 0.0 0.0 0.0 0.0 0.0 Modèle 4 15.0 0.0 0.0 0.0 0.0 0.0 Modèle 5 0.0 0.0 0.0 0.0 0.0 0.0 Modèle 6 10.0 0.0 0.0 0.0 0.0 0.0 Période 6 Période 7 Période 8 Période 9 Période 10 Période 11 \ Modèle 1 0.0 0.0 0.0 0.0 0.0 0.0 Modèle 2 0.0 0.0 0.0 0.0 0.0 0.0 Modèle 3 0.0 0.0 0.0 0.0 0.0 0.0 Modèle 4 0.0 0.0 0.0 0.0 0.0 0.0 Modèle 5 0.0 0.0 0.0 0.0 0.0 0.0 Modèle 6 0.0 0.0 0.0 0.0 0.0 0.0 Période 12 Modèle 1 10.0 Modèle 2 10.0 Modèle 3 10.0 Modèle 4 10.0 Modèle 5 10.0 Modèle 6 10.0 Temps écoulé: 0.13071727752685547 secondesMy "Donnees_prod_table.csv" file :
Modèle;Ci;Csi;SI;SF;Tut;Tum;Tzs V1;100;25;50;10;3;2;4 V2;80;28;20;10;3;1;5 V3;110;25;0;10;3;4;5 V4;90;27;15;10;2;8;6 V5;200;10;0;10;4;11;4 V6;140;20;10;10;4;9;9My "Demande_table_table.csv" file :
Modèle;Période 1;Période 2;Période 3;Période 4;Période 5;Période 6;Période 7;Période 8;Période 9;Période 10;Période 11;Période 12 V1;20;22;18;35;17;19;23;20;29;30;28;32 V2;17;19;23;20;11;10;12;34;21;23;30;12 V3;18;35;17;10;9;21;23;15;10;0;13;17 V4;31;45;24;38;41;20;19;37;28;7;15;10 V5;23;20;23;15;10;22;18;30;28;7;15;10 V6;22;18;20;19;18;35;0;28;12;30;21;23The theorical answer should be 185899.3€.
Attached Files

