Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1304 connectés 

  FORUM HardWare.fr
  Programmation
  Algo

  A votre avis ...

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

A votre avis ...

n°961256
Chronoklaz​m
Posté le 24-01-2005 à 21:15:10  profilanswer
 

Voila j'ai fait un ptit algo pour trouver le noyau d'un ensemble, je m'explique :
 
On a par exemple un ensemble S={3,12,7) et un K=13 alors le sous-ensemble S'={3,7}
est un noyau car 13=2*3+1*7, par contre si K=11 il n'y a pas de noyau.
On veut simplement savoir si un ensemble a un noyau, pas le trouver.   ;)  
 
On souhaite un algo qui exploite les graphes.
 
J'ai fait un algo en utilisant Kruskal (j'ai mes sommets qui sont les 8,7,3,4 et mes arretes sont ponderes par la somme des deux sommets de larrete, donc je part avec un graphe connexe a donf) voici l'exemple:
 
K=19 et S={8,7,3,4}
 
On tri les arretes par ordre croissant et on part d'un des deux sommets de la plus petite arete ponderé ... on commence donc avec 3 (on test si K%3=0, si oui on sort de l'algo sinon on continu) on test si la ponderation suivante est inferieure à K si oui on continu (on emprunte l'arc de plus petite ponderation pour avancer) ..... on s'arrete avant que ca face un cycle.
 
Ainsi l'existence d'un ensemble non-vide a la sortie nous garantie que il y a un noyau.
 
(complexité en O(|E|log|V|))
 
Vous en pensez quoi ?
 
 
 


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
mood
Publicité
Posté le 24-01-2005 à 21:15:10  profilanswer
 

n°961269
Taz
bisounours-codeur
Posté le 24-01-2005 à 21:18:48  profilanswer
 

si ça fonctionne et que les performances te satisfont, ça me va.

n°961274
Chronoklaz​m
Posté le 24-01-2005 à 21:21:58  profilanswer
 

Le probleme c'est que si le graphe est connexe "à donf" j'ai le |E| = qqchose*|V| et qui croit expo ... pas super ca.


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
n°961291
Taz
bisounours-codeur
Posté le 24-01-2005 à 21:30:14  profilanswer
 

ça veut dire que la complexité dans le pire des cas est O(n log(n)) ... on a vu pire

n°961318
Chronoklaz​m
Posté le 24-01-2005 à 21:45:57  profilanswer
 

non ca veux dire que la complexité est expo.
 
EDIT: |E| c'est l'ensemble des arretes du graphe


Message édité par Chronoklazm le 24-01-2005 à 22:20:18

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
n°961363
pains-aux-​raisins
Fatal error
Posté le 24-01-2005 à 22:25:27  profilanswer
 

vi, à mon avis il doit exister un algo meilleur.
juste quelque remarque à froid :
- si ton algo sort un ensemble vide, comment démontres-tu qu'il n'y a pas de noyau ?
- avec du pseudo-code ca serait plus précis ;)
edit : un algo meilleur, exploitant les graphes [:aloy]


Message édité par pains-aux-raisins le 24-01-2005 à 22:45:41
n°962294
Chronoklaz​m
Posté le 25-01-2005 à 20:02:28  profilanswer
 

C'est un peu tot pour le pseudo-code...
En fait, mon algo ne sort jamais un ensemble vide, il sort soit faux soit un ensemble non-vide (dans ce cas la c'est equivalent a vrai, pourquoi je sais pas, je le sens). Mais de toute maniere ca marche pas pour K=7 et S={2,4}, ptet c'est pas bon Kruskal ici.
Le probleme c'est de savoir que sont les arretes.  (si elles sont pas ponderés, ca reduit le champs des algos des graphes applicables dessus)


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
n°962471
matafan
Posté le 26-01-2005 à 06:48:22  profilanswer
 

13 = -26*3 + 13*7
Comment ça ? Positifs ? Fallait le dire :P

n°962594
Chronoklaz​m
Posté le 26-01-2005 à 11:47:06  profilanswer
 

Comme on veux, de toute facon on ne veux ni le sous-ensemble noyau (ici si K=13 et S={3, 7, 48, 129, 311} alors le sous-ens noyau sera {3, 7}) ni les facteurs possibles ... on veux juste savoir si il y a un noyau ou pas (dans le cas contraire ca rejoint le subset-sum et là c'est cho la merde car c'est du NPC)


Message édité par Chronoklazm le 26-01-2005 à 11:48:46

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
n°962827
matafan
Posté le 26-01-2005 à 15:14:44  profilanswer
 

Ben non justement, ça change tout. Si tu accèptes les coeficients négatifs, alors le théorème de Bezout a pour conséquence que si deux des éléments de ton ensemble sont premiers entre eux, il y a un "noyau" (ces deux éléments) quel que soit K.
 
Bon je me suis un peu planté dans mon post précédent. Je voulais en fait donner un exemple avec K=11 (11 = -22*3 + 11*7).


Message édité par matafan le 26-01-2005 à 15:16:07
mood
Publicité
Posté le 26-01-2005 à 15:14:44  profilanswer
 

n°962845
Chronoklaz​m
Posté le 26-01-2005 à 15:35:22  profilanswer
 

Bein moi aussi je me suis un peu planté, les Ki sont des entiers naturels :( Dommage j'avais pas penser a Bezout.
 
EDIT: Ca aurais pu le faire  :sweat:


Message édité par Chronoklazm le 26-01-2005 à 15:36:15

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
n°962905
pains-aux-​raisins
Fatal error
Posté le 26-01-2005 à 16:40:22  profilanswer
 

petite forme chronoklazm... moi qui pensait que tu avais en tête l'équation diophantienne linéaire.
bah, ca arrive [:spamafote]

n°963049
Chronoklaz​m
Posté le 26-01-2005 à 19:46:52  profilanswer
 

Non les equations diophantienne ... je sais pas, elles ont un "bound ratio" qui ne me satisfait point :D
 
Sinon, j'ai peut etre trouvé un truc la ...
 
On nous donne au depart un S={X1, ... , Xn} d'entiers naturels positifs et un entier naturel K.
 
En entrée on a un graphe G=(V,E) ou :
   - L'ensemble V represente les sommets du graphe qui sont donc les Xi.
   - L'ensemble E tel que pour tout couple de sommets (x,y) € il y a une arrete si leurs somme est inferieure ou egale a K.
 
En sortie on veux :
   - V' un sous-ensemble de V tel que Pour tout Xi € S', somme(Xi*Ki)= K
 
Et donc supposont que l'on veux V' le plus petit possible.
 
Voila ca c'est pour la formalisation.
 
En gros l'algo se resume a un parcours de graphe à la Kruskal (on part d'un sommet quelquonque pourvu qu'il soit pas "à part" ). Sachant que à chaque pas on fait le teste suivant :
 

Code :
  1. [x,y : les deux sommets relié par une arrete et la ponderation de l'arrete (somme des deux sommets) sera W.]
  2. SI K mod x == 0 => VRAI (on a trouvé un multiple de K)
  3. SI K mod W == 0 => VRAI (on peut decomposer K en somme de x et y, les Ki seront egal à 1)
  4. SINON
  5.   SI [((K mod W) mod x) == 0)
  6.      OU
  7.      ((K mod W) mod y) == 0)] => VRAI (on peut decomposer K
  8. avec x et y)
  9.   SINON on continu le parcours selon Kruskal
  10. SI on a tout parcouru ALORS FAUX


 
Mais bon je sais pas là ca marche pour K=15 et S={13,7,14,4,2} et j'ai peur de tester pour d'autres valeurs :)
 
EDIT : Au fait c'est du Greedy ca ou pas ?


Message édité par Chronoklazm le 26-01-2005 à 19:57:26

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
n°963091
pains-aux-​raisins
Fatal error
Posté le 26-01-2005 à 20:46:55  profilanswer
 

kruskal est greedy donc j'aurai tendance à dire que ton algo est également, greedy

n°963105
Chronoklaz​m
Posté le 26-01-2005 à 20:58:07  profilanswer
 

Honte à moi :D


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
n°963119
pains-aux-​raisins
Fatal error
Posté le 26-01-2005 à 21:08:35  profilanswer
 

K = 23
S = {5, 7, 10, 11}
=> Selon ton algo, le graphe est complet.
on a les aretes suivantes :
5+7=12
5+10=15
5+11=16
7+10=17
7+11=18
10+11=21
 
Voici ce que donne ton algo sur cet exemple :
 
5+7=12:
23 mod 5 = 3 != 0
23 mod 12 = 11 != 0
11 mod 5 = 1 != 0
11 mod 7 = 4 != 0
 
5+10=15:
23 mod 5 = 3 != 0
23 mod 15 = 8 != 0
8 mod 5 = 3 != 0
8 < 10
 
5+11=16:
23 mod 5 = 3 != 0
23 mod 16 = 7 != 0
7 mod 5 = 2 != 0
7 < 11
 
On a l'arbre couvrant minimal avec Kruskal donc l'algo nous retourne FAUX.
 
Cependant, on a bien 5 + 7 + 11 = 23
:/
 
Bien essayer Chronoklazm !
Courage :)

n°963123
Chronoklaz​m
Posté le 26-01-2005 à 21:12:09  profilanswer
 

Joli tracage :)
En fait j'ai l'impression qu'il me faut juste une liste temporaire avec des candidats eventuels.  
 
.....LOADING......


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
n°963128
pains-aux-​raisins
Fatal error
Posté le 26-01-2005 à 21:15:44  profilanswer
 

Je pense surtout que ton algo détecte l'existence de noyaux à 1 ou 2 éléments. Au delà, il y a un problème...
;)

n°963129
Chronoklaz​m
Posté le 26-01-2005 à 21:16:29  profilanswer
 

Zé zure !


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
n°963136
pains-aux-​raisins
Fatal error
Posté le 26-01-2005 à 21:29:03  profilanswer
 

d'après bezout,
a1.X1 + a2.X2 + ... + an.Xn = K    [1]
admet une solution dans Z si pgcd(a1, a2, ..., an) divise K.
 
Je vois mal comment un algo détecteur de noyau pourrait passer outre cette notion de PGCD.

n°963142
pains-aux-​raisins
Fatal error
Posté le 26-01-2005 à 21:37:46  profilanswer
 

... ou en faisant des modulo à la Euclide :D

n°963146
Chronoklaz​m
Posté le 26-01-2005 à 21:42:04  profilanswer
 

Moi c'est le Z qui me derange, si on avait droit au Ai negatifs, ce serai vite reglé, en trouvant le premier couple d'entiers premiers entre eux (sachant qu'avec la somme ces deux entiers on a n'importe quel nombre).


Message édité par Chronoklazm le 26-01-2005 à 21:42:49

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
n°963202
Chronoklaz​m
Posté le 26-01-2005 à 22:31:18  profilanswer
 

Bon moi je propose :
 

Code :
  1. [x,y : les deux sommets relié par une arrete et la ponderation de l'arrete (somme des deux sommets) sera W.
  2. L liste de sommets parcourus]
  3. // On part du sommet qui a la plus petite valeur \\
  4. SI K mod x == 0 => VRAI (on a trouvé un multiple de K)
  5. SI K mod W == 0 => VRAI (on peut decomposer K en somme de x et y, les Ki seront egal à 1)
  6.    SINON 
  7.       SI [((K mod W) mod x) == 0)
  8.          OU
  9.          ((K mod W) mod y) == 0)
  10.          OU
  11.          (DELTA(L,0,L) == VRAI)] => VRAI ; il faudrait pouvoir retester avec une autre arete dispo ici si delta renvoi faux
  12.       SINON on continu le parcours selon Kruskal (un peu different cette fois ci; on met d'abord le sommet x dans L, puis on avance selon l'arete de plus grande ponderation, et non plus selon la plus petite comme c'est par defaut)
  13.    
  14. SI on a tout parcouru ALORS FAUX
  15. ------------------------------------------------------------
  16. Voici la fonction DELTA(L1,som_temp,L2) (2 fois L pour imiter une temporisation de cette liste)
  17. SI L1==VIDE => DELTA(VIDE,som,L2) = Appartient(som, L2) ; qui renvoi vrai si som est present dans L, sinon FAUX
  18. SI L1!=VIDE => DELTA(c.L1,som,L2) = DELTA(L1 , (K mod c)+som , L2) ; Plus clairement on avance dans L1 et som=+(K mod first_de_L1)
  19. ------------------------------------------------------------


 
Ca marche pour K = 23 et S = {5, 7, 10, 11}
 
.....SEARCHING FOR ERRORS.....
 
EDIT : Non en fait ca marche pas  :cry:


Message édité par Chronoklazm le 26-01-2005 à 23:12:42

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Algo

  A votre avis ...

 

Sujets relatifs
[urgent] votre avis ma bdd va faire la gueule ?Votre avis sur java
besoin de votre avis sur un insert dans une boucleVotre avis sur la façon de faire: passage de variable
[avis] conseil et avis: site sur le développement de jeux[URGENT] besoin d'avis de developpeurs :)
[Avis] Mon 1er site XHTML / CSS[Avis] Coder en C sous OS X , pas de probleme ?
Un ch'tit avis?[Votre Avis] - Selection d'un theme -> Catégorie -> Sous-catégorie
Plus de sujets relatifs à : A votre avis ...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR