Mon optimisation linéaire python est elle valable en maths ?

Réponses à toutes vos questions après le Bac (Fac, Prépa, etc.)
nicolas10000
Messages: 1
Enregistré le: 21 Jan 2021, 18:44

Mon optimisation linéaire python est elle valable en maths ?

par nicolas10000 » 21 Jan 2021, 18:49

Image

J'ai besoin de construire un objet.

L'objet est un mélange de 3 éléments.

Je dois minimiser le poids de l'objet, mais le garder résistant .


Les éléments sont notés comme à l'école, sur 20 , pour déterminer si ils sont plus ou moins lourds ou résistants.

Du style , ben, l'acier il est lourd alors je lui mets 18/20 dans la catégorie poids, mais le plastique il est léger alors il a 3/20 en catégorie poids ( La note la plus haute ne signifie pas que c'est mieux dans ce cas, mais que c'est plus lourd ).

Par contre, la céramique est assez résistante, du coup elle a 10/20 dans la catégorie résistance, mais l'acier , lui, est plus resistant , alors il a 16/20 .

Alors en fait je veux pas travailler en pourcentages mais bel et bien en notes sur 20 comme à l'école .

Demande : La résistance minimale requise de l'objet final est la note suivante: 10/20.
Et le poids, vous vous en doutez, c'est le programme avec la librairie PYTHON PULP qui minimise le poids grâce au simplexe.

Donc, en théorie, l'alliage des 3 éléments doit obtenir une note minimale moyenne de plus de 10/20 en résistance, tout en minimisant le poids ...vous me suivez ?.

Voici les caractéristiques des éléments disponibles pour construire mon objet :



...........................................poids..........resistance
acier: ............................18/20..........16/20
plastique: .....................3/20...........6/20
céramique: ...................12/20........10/20


C'est le programme Linéaire Python Pulp que j'ai construit, qu'en pensez-vous, s'il vous plaît?

Code: Tout sélectionner
    import pulp
   
    # Je veux minimiser le poids
    prob = LpProblem ("Minimize", LpMinimize)

    # Liste des ingrédients et caractéristiques
    produits = ["acier", "plastique", "céramique"]
    resistance = {"acier": 18, "plastique": 3, "céramique": 12}
    poids = {"acier": 16, "plastique": 6, "céramique": 20}
   
    # Construire les varables de décision
    x = LpVariable.dicts ("produits", x, 0)
   
    # Fonction objectif : minimiser le poids
    prob + = lpSum ([poids [i] * x [i] for i in produits]), "MinimizerPoids"
   
    # Contrainte : la resistance totale de l'objet final doit être supérieure à 10/20 en notation
    prob + = lpSum ([(resistance[i] * x [i]) / 20 pour i in produits])> = 10, "resistance"
   
    # Contrainte de note Max  (vu dans la plupart des problèmes de mélange ...)
    prob + = lpSum ([1 * x [f] pour f in produits]) == 20, "noteMax"
   
   
    prob.solve ()
   
    for v in prob.variables ():
        print (v.name, "=", v.varValue)
   
    print ("Note", valeur (objectif prob. / 20))



** C'est le résultat que j'obtiens, est-ce correct mathématiquement parlant, s'il vous plaît? En gros, il dit que je devrais utiliser de l'acier 9,3 / 20 et du plastique 10,6 / 20 pour obtenir l'objet le plus léger possible mais toujours robuste ... Est-ce vrai?

Code: Tout sélectionner
    Statut: Optimal
    produits__ceramic = 0,0
    produits__acier = 9.3333333
    produits__plastique = 10,666667
   Objectif 10.66666674


Ce que je ne comprends pas, c'est que la contrainte devrait être une moyenne, comme celle-ci, mais cela ne fonctionne pas:
Code: Tout sélectionner
       prob + = (lpSum ([(resistance [i] * x [i]) pour i in produits]) / 3)> = 10, "resistance"


Ou alors cherche page d'une personne pouvant m'aider $



Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

Re: Mon optimisation linéaire python est elle valable en mat

par fatal_error » 24 Jan 2021, 21:26

je sais pas pour ton code mais il me semble que (acier, plastique)=(0.4,0.6) (ou sur 20, 8 /20,12/20) donne un poids moyen de 9/20 (ce qui est mieux que 10.67..) et une resistance moyenne de (tout juste...) 10/20

On peut travailler avec les ratios plutot que les notes sur 20

independamment du langage on peut noter:
x = [a,b,c] avec a la quantité de acier, b de plastique, c céramique
sous contrainte: a + b + c = 1, a>=0, b>=0, c>=0

la contrainte sur resistance est:

(a*16 + b*6 + 10*c)/3 > 10

et on veut minimiser

f(a,b,c) = a*18 + b*3 + c*12

code octave (voir gplk)
Code: Tout sélectionner
c = [18, 3, 12]';
A = [ 1, 1, 1;
     16, 6, 10;
];
b = [1, 10]';
lb = [0, 0, 0]';
ub = [1, 1, 1]';
ctype = "SL";
vartype = "CCC";
s = 1;

param.msglev = 1;
param.itlim = 100;

[xmin, fmin, status, extra] = ...
   glpk (c, A, b, lb, ub, ctype, vartype, s, param)

printf("acier %f/20\n", xmin(1) * 20)
printf("plastique %f/20\n", xmin(2) * 20)
printf("céramique %f/20\n", xmin(3) * 20)
la vie est une fête :)

 

Retourner vers ✯✎ Supérieur

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 25 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite