import numpy as np
from scipy.optimize import linprog
# Matrice A
A = np.array ( [
[ 5 , 5 , 2 , 2 , 4 , 2 , 3 , 4 , 2 , 2 , 1 ] ,
[ 1 , 1 , 3 , 1 , 5 , 1 , 1 , 3 , 3 , 1 , 1 ] ,
[ 5 , 5 , 4 , 1 , 5 , 1 , 4 , 2 , 3 , 1 , 5 ] ,
[ 2 , 2 , 5 , 3 , 2 , 3 , 1 , 3 , 5 , 3 , 3 ] ,
[ 3 , 3 , 3 , 5 , 2 , 4 , 1 , 1 , 3 , 4 , 3 ] ,
[ 3 , 4 , 5 , 4 , 3 , 4 , 5 , 4 , 4 , 3 , 3 ] ,
[ 5 , 1 , 3 , 1 , 5 , 1 , 5 , 2 , 5 , 2 , 5 ] ,
[ 5 , 1 , 3 , 2 , 1 , 5 , 1 , 1 , 5 , 2 , 3 ] ,
[ 4 , 5 , 5 , 3 , 3 , 3 , 5 , 3 , 3 , 3 , 3 ] ,
[ 4 , 2 , 3 , 1 , 2 , 3 , 4 , 4 , 4 , 1 , 3 ] ,
[ 4 , 3 , 3 , 5 , 4 , 1 , 4 , 2 , 5 , 5 , 3 ] ,
[ 3 , 5 , 1 , 5 , 3 , 5 , 5 , 1 , 4 , 4 , 3 ] ,
[ 5 , 5 , 3 , 3 , 1 , 3 , 3 , 1 , 5 , 2 , 3 ] ,
[ 1 , 2 , 3 , 4 , 1 , 5 , 5 , 1 , 2 , 5 , 3 ] ,
[ 1 , 1 , 3 , 2 , 3 , 4 , 2 , 1 , 5 , 1 , 3 ] ,
[ 5 , 4 , 3 , 5 , 2 , 3 , 4 , 3 , 4 , 5 , 3 ] ,
[ 1 , 1 , 2 , 2 , 3 , 2 , 4 , 5 , 2 , 3 , 1 ] ,
[ 2 , 2 , 1 , 3 , 5 , 2 , 2 , 5 , 4 , 3 , 3 ] ,
[ 4 , 4 , 4 , 3 , 4 , 2 , 2 , 5 , 1 , 3 , 4 ] ,
[ 2 , 2 , 1 , 4 , 4 , 1 , 3 , 2 , 3 , 4 , 2 ] ,
[ 2 , 3 , 5 , 4 , 2 , 4 , 3 , 4 , 1 , 4 , 2 ] ,
[ 4 , 5 , 1 , 5 , 4 , 3 , 1 , 2 , 1 , 5 , 3 ] ,
[ 2 , 4 , 2 , 1 , 1 , 5 , 2 , 5 , 2 , 4 , 3 ] ,
[ 3 , 3 , 4 , 1 , 3 , 2 , 1 , 4 , 1 , 2 , 4 ] ,
[ 1 , 1 , 3 , 3 , 5 , 4 , 3 , 3 , 2 , 1 , 3 ] ,
[ 1 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 1 , 3 , 3 ] ,
[ 3 , 4 , 3 , 4 , 1 , 5 , 2 , 5 , 1 , 5 , 3 ]
] )
# Vecteur B
B = np.array ( [ 2 , 4 , 4 , 2 , 3 , 4 , 5 , 3 , 3 , 2 , 4 , 4 , 1 , 5 , 3 , 3 , 2 , 3 , 3 , 3 , 4 , 4 , 2 , 3 , 5 , 3 , 2 ] )
# Vecteur C (coefficients de minimisation, non utilisé)
C = np.zeros ( A.shape [ 1 ] )
# Bornes inférieures et supérieures pour les variables de décision
bounds = [ ( 0 , None ) ] * A.shape [ 1 ]
# Contraintes d'égalité pour la somme des variables de décision
constraints_eq = { 'type' : 'eq' , 'fun' : lambda x: np.dot ( A, x) - B}
# Résolution du problème
res = linprog( C, A_eq= A, b_eq= B, bounds= bounds)
# Affichage des résultats
print ( "Solution optimale (variables de décision) :\n " , res.x )
print ( "Valeur optimale de la fonction objectif :\n " , res.fun )
aW1wb3J0IG51bXB5IGFzIG5wCmZyb20gc2NpcHkub3B0aW1pemUgaW1wb3J0IGxpbnByb2cKCiMgTWF0cmljZSBBCkEgPSBucC5hcnJheShbCiAgICBbNSwgNSwgMiwgMiwgNCwgMiwgMywgNCwgMiwgMiwgMV0sCiAgICBbMSwgMSwgMywgMSwgNSwgMSwgMSwgMywgMywgMSwgMV0sCiAgICBbNSwgNSwgNCwgMSwgNSwgMSwgNCwgMiwgMywgMSwgNV0sCiAgICBbMiwgMiwgNSwgMywgMiwgMywgMSwgMywgNSwgMywgM10sCiAgICBbMywgMywgMywgNSwgMiwgNCwgMSwgMSwgMywgNCwgM10sCiAgICBbMywgNCwgNSwgNCwgMywgNCwgNSwgNCwgNCwgMywgM10sCiAgICBbNSwgMSwgMywgMSwgNSwgMSwgNSwgMiwgNSwgMiwgNV0sCiAgICBbNSwgMSwgMywgMiwgMSwgNSwgMSwgMSwgNSwgMiwgM10sCiAgICBbNCwgNSwgNSwgMywgMywgMywgNSwgMywgMywgMywgM10sCiAgICBbNCwgMiwgMywgMSwgMiwgMywgNCwgNCwgNCwgMSwgM10sCiAgICBbNCwgMywgMywgNSwgNCwgMSwgNCwgMiwgNSwgNSwgM10sCiAgICBbMywgNSwgMSwgNSwgMywgNSwgNSwgMSwgNCwgNCwgM10sCiAgICBbNSwgNSwgMywgMywgMSwgMywgMywgMSwgNSwgMiwgM10sCiAgICBbMSwgMiwgMywgNCwgMSwgNSwgNSwgMSwgMiwgNSwgM10sCiAgICBbMSwgMSwgMywgMiwgMywgNCwgMiwgMSwgNSwgMSwgM10sCiAgICBbNSwgNCwgMywgNSwgMiwgMywgNCwgMywgNCwgNSwgM10sCiAgICBbMSwgMSwgMiwgMiwgMywgMiwgNCwgNSwgMiwgMywgMV0sCiAgICBbMiwgMiwgMSwgMywgNSwgMiwgMiwgNSwgNCwgMywgM10sCiAgICBbNCwgNCwgNCwgMywgNCwgMiwgMiwgNSwgMSwgMywgNF0sCiAgICBbMiwgMiwgMSwgNCwgNCwgMSwgMywgMiwgMywgNCwgMl0sCiAgICBbMiwgMywgNSwgNCwgMiwgNCwgMywgNCwgMSwgNCwgMl0sCiAgICBbNCwgNSwgMSwgNSwgNCwgMywgMSwgMiwgMSwgNSwgM10sCiAgICBbMiwgNCwgMiwgMSwgMSwgNSwgMiwgNSwgMiwgNCwgM10sCiAgICBbMywgMywgNCwgMSwgMywgMiwgMSwgNCwgMSwgMiwgNF0sCiAgICBbMSwgMSwgMywgMywgNSwgNCwgMywgMywgMiwgMSwgM10sCiAgICBbMSwgMywgMywgMywgMywgMywgMywgMywgMSwgMywgM10sCiAgICBbMywgNCwgMywgNCwgMSwgNSwgMiwgNSwgMSwgNSwgM10KXSkKCiMgVmVjdGV1ciBCCkIgPSBucC5hcnJheShbMiwgNCwgNCwgMiwgMywgNCwgNSwgMywgMywgMiwgNCwgNCwgMSwgNSwgMywgMywgMiwgMywgMywgMywgNCwgNCwgMiwgMywgNSwgMywgMl0pCgojIFZlY3RldXIgQyAoY29lZmZpY2llbnRzIGRlIG1pbmltaXNhdGlvbiwgbm9uIHV0aWxpc8OpKQpDID0gbnAuemVyb3MoQS5zaGFwZVsxXSkKCiMgQm9ybmVzIGluZsOpcmlldXJlcyBldCBzdXDDqXJpZXVyZXMgcG91ciBsZXMgdmFyaWFibGVzIGRlIGTDqWNpc2lvbgpib3VuZHMgPSBbKDAsIE5vbmUpXSAqIEEuc2hhcGVbMV0KCiMgQ29udHJhaW50ZXMgZCfDqWdhbGl0w6kgcG91ciBsYSBzb21tZSBkZXMgdmFyaWFibGVzIGRlIGTDqWNpc2lvbgpjb25zdHJhaW50c19lcSA9IHsndHlwZSc6ICdlcScsICdmdW4nOiBsYW1iZGEgeDogbnAuZG90KEEsIHgpIC0gQn0KCiMgUsOpc29sdXRpb24gZHUgcHJvYmzDqG1lCnJlcyA9IGxpbnByb2coQywgQV9lcT1BLCBiX2VxPUIsIGJvdW5kcz1ib3VuZHMpCgojIEFmZmljaGFnZSBkZXMgcsOpc3VsdGF0cwpwcmludCgiU29sdXRpb24gb3B0aW1hbGUgKHZhcmlhYmxlcyBkZSBkw6ljaXNpb24pIDpcbiIsIHJlcy54KQpwcmludCgiVmFsZXVyIG9wdGltYWxlIGRlIGxhIGZvbmN0aW9uIG9iamVjdGlmIDpcbiIsIHJlcy5mdW4pCg==