Niouzes.org  

Précédent   Niouzes.org > Forum > Newsgroup fr.comp.* Forum > Newsgroup fr.comp.algorithmes
S'inscrire FAQ Membres Calendrier Recherche Messages du jour Marquer les forums comme lus



Réponse

 

LinkBack Outils de la discussion Modes d'affichage
  #1 (permalink)  
Vieux 07/07/2008, 17h06
David Berthemet
 
Messages: n/a
Par défaut Solution équation avec plusieurs inconnues

Bonjour,


Soit l'équation suivante :

32a + 24b + 16c + 12d + 8e + 4f = X

avec a + b + c + d + e + f <= Y
et a, b, c, d, e et f qui sont des entiers >= 0

Je cherche un algorithme me permettant de trouver toutes les solutions de ce
système sachant que je connais X et Y.

Exemple : pour X = 156 et Y = 6
Je trouve 3 solutions : a = 4 ; b = 1 ; f = 1 ou a = 4 ; c = 1 ; d = 1 ou a
= 3 ; b = 2 ; d = 1

Actuellement, j'utilise une procédure très longue qui pour toutes les
valeurs possible de a teste les valeurs possibles de b, c, d ,e ,f et ainsi
de suite.
Après quelques tests, il apparaît évident que ma procédure n'est pas bonne
car je ne trouve qu'une partie des cas possibles (sur un exemple simple,
j'ai trouvé des solutions à la main que j'ai zappé avec ma procédure)

Quelqu'un a-t-il une idée à me proposer, car le moins que l'on puisse dire,
c'est que je ne suis pas très doué en algorithmes.

Merci d'avance pour tout début de solution, ou une solution complète si le
coeur vous en dit :-)

Cordialement,

David Berthemet


Réponse avec citation
Alt Today
Advertising
Google Adsense
 
This advertising will not be shown
in this way to registered members.
Register your free account today
and become a member on
Niouzes.org
Standard Sponsored Links

  #2 (permalink)  
Vieux 08/07/2008, 11h08
David Berthemet
 
Messages: n/a
Par défaut Re: Solution équation avec plusieurs inconnues

Bonjour,

Merci de vous être penché sur mon problème.
Je vais donc essayer de chercher des infos sur la programmation linéaire en
nombre entier.

Cordialement,

David Berthemet

"gerard sookahet" <gersoo***_NON-SPAM_online.fr> a écrit dans le message de
news: 48726269$0$839$ba4acef3***news.orange.fr...
> David Berthemet wrote:
>> Bonjour,
>>
>>
>> Soit l'équation suivante :
>>
>> 32a + 24b + 16c + 12d + 8e + 4f = X
>>
>> avec a + b + c + d + e + f <= Y
>> et a, b, c, d, e et f qui sont des entiers >= 0
>>
>> Je cherche un algorithme me permettant de trouver toutes les solutions de
>> ce système sachant que je connais X et Y.
>>
>> Exemple : pour X = 156 et Y = 6
>> Je trouve 3 solutions : a = 4 ; b = 1 ; f = 1 ou a = 4 ; c = 1 ; d = 1 ou
>> a = 3 ; b = 2 ; d = 1
>>
>> Actuellement, j'utilise une procédure très longue qui pour toutes les
>> valeurs possible de a teste les valeurs possibles de b, c, d ,e ,f et
>> ainsi de suite.
>> Après quelques tests, il apparaît évident que ma procédure n'est pas
>> bonne car je ne trouve qu'une partie des cas possibles (sur un exemple
>> simple, j'ai trouvé des solutions à la main que j'ai zappé avec ma
>> procédure)
>>
>> Quelqu'un a-t-il une idée à me proposer, car le moins que l'on puisse
>> dire, c'est que je ne suis pas très doué en algorithmes.
>>
>> Merci d'avance pour tout début de solution, ou une solution complète si
>> le coeur vous en dit :-)
>>
>> Cordialement,
>>
>> David Berthemet

>
> Bonsoir,
>
> Il faudrait faire une recherche du côté de la Programmation Linéaire
> en Nombre Entier (PLNE).
>
>
> GS
>



Réponse avec citation
  #3 (permalink)  
Vieux 08/07/2008, 11h14
David Berthemet
 
Messages: n/a
Par défaut Re: Solution équation avec plusieurs inconnues

Bonjour,

Merci de vous être penché sur mon problème.
Je réalise effectivement la simplification par 4 et je borne les différentes
variables en fonction de Y (mais X et Y peuvent-être très grand).
La simplification de l'équation ne donne pas 8a+3b+4c+3d+2e+f=X/4 mais 8a+
6b +4c+3d+2e+f=X/4 et je ne comprends pas comment la simplifier encore.

Je vais donc tester ces différentes pistes.

Cordialement,

David Berthemet

"Michel Olagnon" <molagnon***ifremer-a-oter.fr> a écrit dans le message de
news: 487319D1.5010007***ifremer-a-oter.fr...
> David Berthemet wrote:
>> Bonjour,
>>
>>
>> Soit l'équation suivante :
>>
>> 32a + 24b + 16c + 12d + 8e + 4f = X
>>
>> avec a + b + c + d + e + f <= Y
>> et a, b, c, d, e et f qui sont des entiers >= 0
>>
>> Je cherche un algorithme me permettant de trouver toutes les solutions de
>> ce système sachant que je connais X et Y.
>>
>> Exemple : pour X = 156 et Y = 6
>> Je trouve 3 solutions : a = 4 ; b = 1 ; f = 1 ou a = 4 ; c = 1 ; d = 1 ou
>> a = 3 ; b = 2 ; d = 1
>>
>> Actuellement, j'utilise une procédure très longue qui pour toutes les
>> valeurs possible de a teste les valeurs possibles de b, c, d ,e ,f et
>> ainsi de suite.

>
> Si c'est fait correctement, ca ne me parait pas tres long.
> On a 0<=a<=min (Y,X/32), 0<=b<=min(Y-a,(X-32a)/24), etc.
>
> Dans le cas precis, on peut aussi simplifier la premiere
> equation en 8a+3b+4c+3d+2e+f=X/4 et remarquer que l'on peut
> reduire le nombre de variables d'une en prenant g = b+d.
>
>



Réponse avec citation
  #4 (permalink)  
Vieux 08/07/2008, 18h35
David Berthemet
 
Messages: n/a
Par défaut Re: Solution équation avec plusieurs inconnues

Bonjour,

et merci de vous être penché sur mon problème.

Actuellement, je fais effectivement des boucles de ce type, et après
vérification de mon code, j'ai trouvé l'erreur de ma procédure qui zappait
certaines solutions.
Par contre je ne n'utilise pas les mêmes bornes que vous mais une borne du
type Max(PartieEntière(X/32), Y) si PartieEntière(X/32)> Y sinon je prends
PartieEntière(X/32)
Ma procédure semble donc maintenant bonne.
Dans votre exemple, les bornes que vous utilisez ne me conviennes pas car
elles induisent que a>b>c>d>e>f ce qui n'est pas vrai pour toutes les
valeurs de Y pouvant survenir (est notamment si Y n'est pas borné ou est
très grand, ce qui peut arriver ou si X est petit - Exemple avec X = 32 et Y
=6)
Par contre, j'aimerais savoir si il est possible de savoir d'avance le
nombre de solutions correctes que l'on doit trouver (3 dans mon exemple
original sachant qu'il y a 796 possibilités de trouver 156 avec cette
équation mais en ayant des Y dépassant 6) afin de pouvoir vérifier si mes
résultats sont bons et éventuellement, si il y a une technique permettant de
ne pas calculer des cas dont on pourrait être certains qu'il ne seront pas
bons car si on ne donne pas du tout de limite à Y, il y a 3 920 000 calculs
à réaliser, ce qui fait pas mal compte tenu du fait qu'il n'y a que 2 379
calculs permettant de totaliser 156.

Cordialement,

David Berthemet
"Pascal J. Bourguignon" <pjb***informatimago.com> a écrit dans le message de
news: 7ciqvgehph.fsf***pbourguignon.anevia.com...
> "David Berthemet" <berthemet.david***neuf.fr> writes:
>> Soit l'équation suivante :
>>
>> 32a + 24b + 16c + 12d + 8e + 4f = X
>>
>> avec a + b + c + d + e + f <= Y
>> et a, b, c, d, e et f qui sont des entiers >= 0
>>
>> Je cherche un algorithme me permettant de trouver toutes les solutions de
>> ce
>> système sachant que je connais X et Y.
>>
>> Exemple : pour X = 156 et Y = 6
>> Je trouve 3 solutions : a = 4 ; b = 1 ; f = 1 ou a = 4 ; c = 1 ; d = 1 ou
>> a
>> = 3 ; b = 2 ; d = 1
>>
>> Actuellement, j'utilise une procédure très longue qui pour toutes les
>> valeurs possible de a teste les valeurs possibles de b, c, d ,e ,f et
>> ainsi
>> de suite.
>> Après quelques tests, il apparaît évident que ma procédure n'est pas
>> bonne
>> car je ne trouve qu'une partie des cas possibles (sur un exemple simple,
>> j'ai trouvé des solutions à la main que j'ai zappé avec ma procédure)
>>
>> Quelqu'un a-t-il une idée à me proposer, car le moins que l'on puisse
>> dire,
>> c'est que je ne suis pas très doué en algorithmes.
>>
>> Merci d'avance pour tout début de solution, ou une solution complète si
>> le
>> coeur vous en dit :-)

>
> Mis à part les algorithmes sophistiqués que tu pourras trouver par
> ailleur avec les conseils avisés des autres, il n'y a pas de raison de
> manquer des solutions:
>
> pour a de 0 à Y
> pour b de 0 à Y-a
> pour c de 0 à Y-a-b
> pour d de 0 à Y-a-b-c
> pour e de 0 à Y-a-b-c-d
> pour f de 0 à Y-a-b-c-d
> si 32a + 24b + 16c + 12d + 8e + 4f = X alors
> afficher (a,b,c,d,e,f) est solution.
> fin si
> fin pour
> fin pour
> fin pour
> fin pour
> fin pour
> fin pour
>
>
> Si c'est pour des cas simples comme l'exemple, ce n'est pas trés long,
> pour Y=6 il n'y a que 924 cas à tester:
>
>
> C/USER[49]> (time
> (let ((x 156) (y 6) (counter 0))
> (loop for a from 0 to y do
> (loop for b from 0 to (- y a) do
> (loop for c from 0 to (- y a b) do
> (loop for d from 0 to (- y a b c) do
> (loop for e from 0 to (- y a b c d) do
> (loop for f from 0 to (- y a b c d e) do
> (incf counter)
> (when (= (+ (* 32 a) (* 24 b) (* 16 c) (* 12 d) (* 8 e)
> (* 4 f)) x)
> (print (list a b c d e f)))))))))
> (print counter)))
>
> (3 2 0 1 0 0)
> (4 0 1 1 0 0)
> (4 1 0 0 0 1)
> 924
> Real time: 0.222618 sec.
> Run time: 0.219987 sec.
> Space: 7316336 Bytes
> GC: 2, GC time: 0.046665 sec.
> 924
>
> --
> __Pascal Bourguignon__



Réponse avec citation
  #5 (permalink)  
Vieux 08/07/2008, 22h50
David Berthemet
 
Messages: n/a
Par défaut Re: Solution équation avec plusieurs inconnues

Bonjour,

Et merci de vous pencher sur mon problème.

Ne connaissant pas le langage employé dans votre réponse (je reste limité à
VBA et à Windev), j'ai quelques difficultés à le comprendre. Néanmoins,
comme il parait très concis, il m'apparait fort intéressant de l'étudier et
je vais donc essayer de le décrypter.

Cordialement,

David Berthemet

"Antoine Polatouche" <antoine***galacsys.com> a écrit dans le message de news:
g50dl5$2qnp$1***cabale.usenet-fr.net...
> David Berthemet a écrit :
>>>> Soit l'équation suivante :
>>>>
>>>> 32a + 24b + 16c + 12d + 8e + 4f = X
>>>>
>>>> avec a + b + c + d + e + f <= Y
>>>> et a, b, c, d, e et f qui sont des entiers >= 0
>>>>
>>>> Je cherche un algorithme me permettant de trouver toutes les solutions
>>>> de ce
>>>> système sachant que je connais X et Y.

>
> Pas testé:
>
> void LaFonction( in X, int Y)
> {
> int Z = X/4;
> if(4*Z==X)
> for( int a=0; 8a <= Z && a <= Y; a++ )
> for(int b=0; 6b <= Z-8a && b <= Y; b++ )
> for(int c=0; 4c <= Z-8a-6b && c <= Y; c++)
> for(int d=0; 3d <= Z-8a-6b-4c && d <= Y; d++)
> for(int e=0; 2e <= Z-8a-6b-4c-3d && e <= Y; e++){
> int f = Z-8a-6b-4c-3d-2e;
> if(f >= 0 && f <=Y) AfficheLaSolution(a,b,c,d,e,f);
> }
> }
>



Réponse avec citation
  #6 (permalink)  
Vieux 08/07/2008, 22h50
David Berthemet
 
Messages: n/a
Par défaut Re: Solution équation avec plusieurs inconnues

Bonjour,

Et merci de vous pencher sur mon problème.

Ne connaissant pas le langage employé dans votre réponse (je reste limité à
VBA et à Windev), j'ai quelques difficultés à le comprendre. Néanmoins,
comme il parait très concis, il m'apparait fort intéressant de l'étudier et
je vais donc essayer de le décrypter.

Cordialement,

David Berthemet

"Antoine Polatouche" <antoine***galacsys.com> a écrit dans le message de news:
g50dl5$2qnp$1***cabale.usenet-fr.net...
> David Berthemet a écrit :
>>>> Soit l'équation suivante :
>>>>
>>>> 32a + 24b + 16c + 12d + 8e + 4f = X
>>>>
>>>> avec a + b + c + d + e + f <= Y
>>>> et a, b, c, d, e et f qui sont des entiers >= 0
>>>>
>>>> Je cherche un algorithme me permettant de trouver toutes les solutions
>>>> de ce
>>>> système sachant que je connais X et Y.

>
> Pas testé:
>
> void LaFonction( in X, int Y)
> {
> int Z = X/4;
> if(4*Z==X)
> for( int a=0; 8a <= Z && a <= Y; a++ )
> for(int b=0; 6b <= Z-8a && b <= Y; b++ )
> for(int c=0; 4c <= Z-8a-6b && c <= Y; c++)
> for(int d=0; 3d <= Z-8a-6b-4c && d <= Y; d++)
> for(int e=0; 2e <= Z-8a-6b-4c-3d && e <= Y; e++){
> int f = Z-8a-6b-4c-3d-2e;
> if(f >= 0 && f <=Y) AfficheLaSolution(a,b,c,d,e,f);
> }
> }
>



Réponse avec citation
  #7 (permalink)  
Vieux 09/07/2008, 16h38
David Berthemet
 
Messages: n/a
Par défaut Re: Solution équation avec plusieurs inconnues

Merci pour ce complément d'info. Je vais ainsi pouvoir analyser votre code.

Cordialement,

David Berthemet

"Antoine Polatouche" <antoine***galacsys.com> a écrit dans le message de news:
g51b35$v17$1***cabale.usenet-fr.net...
> David Berthemet a écrit :
>> Bonjour,
>>
>> Et merci de vous pencher sur mon problème.
>>
>> Ne connaissant pas le langage employé dans votre réponse (je reste limité
>> à VBA et à Windev), j'ai quelques difficultés à le comprendre. Néanmoins,
>> comme il parait très concis, il m'apparait fort intéressant de l'étudier
>> et je vais donc essayer de le décrypter.

>
> C'est du C.
> for( int a=0; 8a <= Z && a <= Y; a++ )
> veut dire
> a=0 en début de boucle
> boucler tant que 8a <= Z et a <= Y (&& est AND en basic je crois)
> en incrémentant a en fin de boucle (a++)
>
>



Réponse avec citation
  #8 (permalink)  
Vieux 09/07/2008, 16h46
David Berthemet
 
Messages: n/a
Par défaut Re: Solution équation avec plusieurs inconnues

"Pascal Bourguignon" pjb***informatimago.com à écrit :

> Les bornes de boucle n'impliquent aucun ordre entre les variables de
> boucle, intrinsèquement. Tout dépend de la valeur de Y.
>
> Considérons juste les deux premières boucles:
>
>
> pour a de 0 à Y
> pour b de 0 à Y-a
>
> Quand a=0, b va de 0 à Y et donc b>=a
> Quand a=1, b va de 0 à Y-1 et donc d'abort b<a, puis b=a, puis b>a.
> ...
> Quand a=3<Y, b va de 0 à Y-3 et donc, si Y>a+3, parfois a<b et parfois
> a>b.
> ...
>
> Pour en être sur, il suffit de générer tous les tuples:
>

........

> Ce que les bornes encodent, c'est la condition a+b+c+d+e+f<=Y
>


Merci pour ces précisions qui me permettent de mieux comprendre les
possibilités de résolutions de mon problème.

Cordialement,

David Berthemet



Réponse avec citation
  #9 (permalink)  
Vieux 09/07/2008, 19h02
Noé Falzon
 
Messages: n/a
Par défaut Re: Solution équation avec plusieurs inconnues

David Berthemet a écrit :
> Soit l'équation suivante :
>
> 32a + 24b + 16c + 12d + 8e + 4f = X
>
> avec a + b + c + d + e + f <= Y
> et a, b, c, d, e et f qui sont des entiers >= 0
>
> Je cherche un algorithme me permettant de trouver toutes les solutions de ce
> système sachant que je connais X et Y.


Bonjour,

si vous cherchez seulement la solution (et pas la manière d'y arriver),
sachez que le langage Prolog est parfaitement adapté Ã*** ce genre de
problèmes. Pour exemple, voici comment on ferait :

equation([A,B,C,D,E,F]) :-
fd_domain([A,B,C,D,E,F], 0, 6),
A + B + C + D + E + F #=< 6,
32 * A + 24 * B + 16 * C + 12 * D + 8 * E + 4 * F #= 156,
fd_labeling([A,B,C,D,E,F]).


Et le bidule ressort :

| ?- equation(L).

L = [3,2,0,1,0,0] ? a

L = [4,0,1,1,0,0]

L = [4,1,0,0,0,1]

yes


Le langage (et son interpréteur, bien sûr) permettent des choses bien
plus complexes que ça, toujours dans l'optique de définir des
contraintes logiques, et laisser faire la machine.

Je ne sais pas si vous avez besoin de cet algorithme pour l'intégrer Ã***
votre logiciel, ou simplement parce que vous vouliez calculer des
solutions, mais dans le second cas, je ne peux que vous conseiller de
jeter un oeil Ã*** Prolog. C'est un langage prévu pour des non
programmeurs, et est assez déconcertant quand on a l'habitude de la
programmation séquentielle, mais sa puissance est grisante.
Il résout des problèmes combinatoires monstrueux en un clin d'oeil.

S'il vous faut coder l'algorithme vous même, c'est un peu plus compliqué...

La solution évidente consiste Ã*** tester tous les n-uplets de nombres
jusqu'Ã*** trouver une solution. Si vous ne définissez pas de bornes, ça
peut être très long (une petite éternité, quoi...)

Même avec des bornes (ici elles sont faciles Ã*** trouver), ça fait quand
même beaucoup : R^N, où N est le nombre de variables, et R l'étendue de
recherche.

Si je me rappelle bien, prolog fait quelque chose de similaire, mais en
réduisant d'abord les intervalles pour chaque variable autant que
possible, simplement Ã*** partir des expressions données. D'ailleurs, quand
on ne lui demande pas d'énumérer avec « labeling », c'est ce qu'il donne :

| ?- equation(L).

L = [_#3(0..4),_#25(0..6),_#47(0..6),_#69(0..6),_#91(0. .6),_#113(0..6)]

yes


Après, il teste tous les cas, mais de manière un peu intelligente, c'est
Ã*** dire qu'il construit un arbre des tests, créant une branche fille Ã***
chaque fois qu'il fixe une variable, et explore toutes les possibilités
au fur et Ã*** mesure.
Quand un choix n'a donné aucune solution, il remonte dans l'arbre et
emprunte une autre branche (change la valeur d'une variable).

Fait simplement comme ça, cela revient Ã*** tester toutes les possibilités.
Les optimisations font que ça va plus vite : si on peut prédire qu'un
choix sera mauvais, on peut supprimer toute une branche sans la visiter.
Par exemple, si A est fixé Ã*** 6, la première condition ne sera remplie
que si tout le reste est nul.
De plus, dans les cas où on cherche une seule solution (et pas toutes),
il est possible de choisir quelle branche explorer d'abord, si elle
semble (selon des critères précis) prometteuse, etc.

Quoi qu'il en soit, c'est un problème qui est assez complexe Ã***
programmer soi-même, et je suppose que la meilleure solution est de tout
tester bêtement, si la combinatoire le permet.

Quelques liens :

http://fr.wikipedia.org/wiki/Prolog
http://fr.wikipedia.org/wiki/Séparation_et_évaluation
http://en.wikipedia.org/wiki/Constra...ic_programming

Bon courage en tout cas, si vous vous lancez dans la solution compliquée

Noé
Réponse avec citation
  #10 (permalink)  
Vieux 10/07/2008, 17h50
David Berthemet
 
Messages: n/a
Par défaut Re: Solution équation avec plusieurs inconnues

"Noé Falzon" a écrit :
> si vous cherchez seulement la solution (et pas la manière d'y arriver),
> sachez que le langage Prolog est parfaitement adapté à ce genre de
> problèmes. Pour exemple, voici comment on ferait :
>


Bonjour,

Je vous remercie pour cette piste qui me semble fort prometteuse.
Pour l'instant j'ai réussi à modifier mon code original qui était bogué (car
j'avais bêtement oublié de passer dans une boucle) pour trouver l'ensemble
des solutions possibles. Cela peut s'avérer long en fonction des contraintes
mais tout semble bien fonctionner et je peux donc maintenant continuer mon
programme (je dois maintenant chercher toutes les permutations avec
répétitions pour toutes les solutions trouvées puis leur attribuer une
valeur spécifique en fonction de nouvelles contraintes. J'ai peur que les
temps de calculs explosent, mais cette discussion m'a amenée à mieux
réfléchir sur ce type de problème et j'espère donc que tout va bien se
passer !)

J'essaierais donc d'optimiser cette procédure grâce aux informations glanées
dans ce fil de discussion lorsque l'ensemble du programme sera fonctionnel
et que j'aurais une vision globale du problème.

Merci encore d'avoir pris le temps de vous pencher sur mon problème.

Cordialement,

David Berthemet


Réponse avec citation
 
Réponse
Tags: , , ,



Outils de la discussion
Modes d'affichage

Règles de messages
Vous pouvez ouvrir de nouvelles discussions : nonoui
Vous pouvez envoyer des réponses : nonoui
Vous pouvez insérer des pièces jointes : nonoui
Vous pouvez modifier vos messages : nonoui

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are oui
Pingbacks are oui
Refbacks are oui


Discussions similaires

Discussion Auteur Forum Réponses Dernier message
Solution équation avec plusieurs inconnues David Berthemet Newsgroup fr.sci.maths 4 09/07/2008 17h30
Solution équation avec plusieurs inconnues David Berthemet Newsgroup fr.comp.algorithmes 0 07/07/2008 18h15
Re: Résolution d'équation de type x*exp(x)=a Loupiac Newsgroup fr.sci.maths 1 18/04/2008 10h42
plusieurs sites web sur un seul serveur avec plusieurs certificats Dark Newsgroup microsoft.public.fr.iis 3 09/08/2007 10h37
Mappoint en adéquation avec mon projet ? romain Newsgroup microsoft.public.fr.mappoint 2 08/11/2005 14h16


Fuseau horaire GMT. Il est actuellement 12h53.

Italiano - German - English - Español


Édité par : vBulletin® version 3.6.8
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO 3.1.0 © 2007, Crawlability, Inc. Tous droits réservés.
Version française #13 par l'association vBulletin francophone


Politique - Droit - Philosophie - Football - Medicine - Française - Bricolage - Photo - Mac Os X - Divers - Physique - Jardinage
Mecanique - Moto - Photographie - Rail - Route - Aviation - Cinema - Linux - Psychanalyse - Finance - Enigmes - Rugby
Environnement - Histoire - Programmes TV - Education - Travail - Voyages - Windows - Immobilier - Cuisine
Windows XP - Excel - Word - Outlook - Access - Internet Explorer - Office - Vista

Page generated in 0,47113 seconds with 11 queries