Condition "ou" dans une contrainte du solveur

Bonjour
comment puis je, grâce au solveur, reproduire les variables de la colonne C2 à C7 dans la colonne D2 à D7, avec la contrainte : D2 = B2 « ou » D2 = 0.00 et D3 = B3 « ou » D3 = 0.00…ainsi de suite jusqu’au D7 = B7 « ou » D7 = 0.00. Sachant que la condition « ou » n’est pas disponible sur une contrainte. la photo ci-dessous résume ce cas :


Merci par avance

Bonjour,

Est ce que tu as essayé d’initialiser les valeurs des cellules D2:D7 à 0 au préalable ?
Dans la mise en donnée du solveur si tu garde coché « Rendre les variables sans contrainte non négatives », je crois que tu ne peux pas avoir de valeurs négatives dans les variables.

Pour ce qui est d’une condition ou d’une autre, le solveur va « faire le meilleur choix », à toi d’imposer de nouvelles contraintes qui vont te diriger vers une représentation plus fine de ton problème.

Je ne connais pas de possibilité pour répondre mot pour mot à ta question, mais récemment, j’ai utilisé le visual basic pour appeler directement le solveur dans du code. Il y a peut être moyen d’avoir quelque chose mais je n’en suis pas sure.
Mais au final ce qui est sure c’est que Excel ne fera pas le choix pour toi, il faut soit lui demander de faire un choix de paramètre, soit de faire la liste de tous les choix possible et les résoudre un par un, soit ruser en rajoutant des contraintes, ou en rajoutant dans la fonction à minimiser un second membre.

Cdlt
Franck

Bonjour
Merci beaucoup pour ta réponse.

  • j’ai effectivement essayé d’initialiser les valeurs des cellules D2:D7 à 0 au préalable mais ça ne règle pas le pb car la contrainte que je veux mettre en place et que chaque cellule devra avoir comme valeur soit : 0 ou soit la valeur des cellules B* ( B2 pour D2 …)
  • « Rendre les variables sans contrainte non négatives » est coché car justement je ne veux pas que les variables soient négatives .
  • j’ai déjà tenté d’appeler directement le solveur dans du code visual basic, mais ajouter une condition « ou » dans la contrainte ça ne passe pas
  • les valeurs exposées dans l’exemple c’est pour simplifier, mais réellement je n’ai pas 7 lignes j’en ai une vingtaine

En tous cas merci pour tes éclaircissements, mais il faut que je creuse mes méninges davantage ou peut être un sauveur …

J’ai fait un essai dernièrement, où j’estimais 12 paramètres à la fois par le solveur GRG, pour du calcul scientifique. La précision voulu est telle que il faut réestimer les paramètres plusieurs fois pour chercher plus de qualité.
C’est possible en faisant une boucle dans le VB for
i = 1 to 4
==>
Solveur (parametre)
next i
Ce qui me permet de dire que dans un premier temps, il est possible de coder en dur tout tes cas dans une subroutine VB. et de coller les résultats dans des cellules différentes.
Dans un second temps, d’identifier en amont avec cette subroutine la taille de ton problème, et d’automatiser petit à petit l’appelle du solveur. par des boucles, des critères.
exemple :
calcul du nombre de cas à résoudre :
Lmax_value = 1
Do
Lmax_value = Lmax_value + 1
Loop Until Cells(Lmax_value, 2) = «  » <= la colonne B, voir si tu commences à B2, il faudra rajouter (Loop Until Cells(Lmax_value+debut, 2) avec debut le numero de ta premiere ligne).

Tu détermines ainsi le nombre de cas à résoudre.
Ensuite tu sais que tu as deux possibilités pour chaque cas.
ETC.

Cdlt
Franck

Et que dans le premier cas, tu ne fais pas appelle au paramètre et qu’il reste égale à zéro.
Est ce que tu as déjà réussis à utiliser une condition dans l’utilisation deu solveur (je suis preneur de ta réponse).
Exemple :
For I = 1 To 1
SolverOk SetCell:="$J$14", MaxMinVal:=0, ValueOf:=0, ByChange:="$I$12", Engine:=1, EngineDesc:=« GRG Nonlinear «  » »
SolverSolve userfinish:=True
Next I
Mais, « $J$14 » renvoi à un paramètre variable relatif à la boucle i

Remarque : pour supprimer les fenêtres pop up de Excel, tu peux écrire dans le code :
Application.DisplayAlerts = False 'interdire l’affichage des popup
boucle
solveur
fin de boucle
Application.DisplayAlerts = True 'affichage des popup

Re bonjour
Merci pour ta réactivité, je vais suivre cette piste et mouliner tous ça pour voir ce que ça donne.
Cordialement

Ok, pourras tu me tenir informé ?
Cdlt
Franck

Ok, certainement.
Cordialement

Bonjour
Malheureusement cette piste n’est pas fructueuse, car mon besoin n’est pas de trouver un min ou max mais plutôt une valeur bien précise, j’ai eu un résultat un peu proche du besoin ( mais reste une seule valeur qui sort du lot marquée en jaune, qui dit mieux :sweat_smile:) ci-dessous l’illustration :

Bonjour AAB,

Je pense que je vais avoir des difficultés à t’aider.

Mais, utiliser le solveur pour minimiser l’écart des moindres carrés entre une mesure et un modèle selon un paramètre revient à estimer ce paramètre ou bien ce groupe de paramètres.

Dans ton cas, la mesure est 753.86, le modèle est initialisé à une valeur dépendant du paramètre et on doit trouver le paramètre permettant au modèle de donner 753.86 ou bien de s’en rapprocher.
On fait donc la somme des écarts des moindres carrés entre le modèle et la mesure pour estimer le meilleur compromis que peut donner le paramètre.

En tout cas ton approche de rajouter des jeux de paramètres au fil des itérations dans le solveur est intéressante.

Tu peux mettre la ligne Application.displaysalerts = false avant la boucle K.

Est ce que tu peux m’expliquer le sens de la ligne solveradd cellref:= … & K, c’est une initialisation ?

Cdlt

Franck

Bonjour
Cette ligne : « solveradd cellref:= … & K » c’est pour ajouter les contraintes automatiquement sans avoir à reproduire chaque contrainte dans une ligne, « k » : étant le nombre de lignes définies au départ ( surtout quand on l’en a une vingtaine ) mais ceci suppose que toutes les contraintes ont la même condition: « Relation:=1 » ce qui est vrais de mon cas.
Cordialement

Bon en tout cas les échanges était très intéressant, j’ai appris de nouvelles choses sur les contraintes.
Franck

A chaque fois que tu as relancé le programme il te donne 58.06 en cellule D18 ?
Car cela n’a pas vraiment de logique vu les itération précédentes non ?

Bonjour
Oui tout à fait, c’est toujours le même scénario qui est proposé, (même s’il y en a d’autres : le scénario de la colonne « C » ) en fait j’ai l’impression qu’avec ce mode « simplex LF » le solveur reprend toutes les valeurs de la colonne « B » et une fois il dépasse la valeur objectif à définir, il génère tout bêtement le reliquat ( càd 753.86 - 695.8 = 58.06 )
Cordialement