Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Trouver la meilleure répartition (A la recherche de l'algorithme) [ Archives / Maths & Algorithmes ] (AlexN)

vendredi 24 mars 2006 à 10:29:28 | Trouver la meilleure répartition (A la recherche de l'algorithme)

AlexN

Bonjour, V’la le problème : j’ai un ensemble de paires du genre (catégorie1, 3 objets), (catégorie 2, 6 objets), (catégorie 3, 18 objets),… (catégorie n, m objets). N n’est pas connu d’avance, pas plus que le nombre M d’objets que contient chaque catégorie. Je cherche un algorithme qui me permettrait de calculer la répartition de ces paires en deux sous ensembles le plus « équilibré ». C’est-à-dire donnant des sommes de poids (nombre d’objets) de chaque sous ensemble dont le rapport est le plus proche de 1. Par exemple : Cat1, 2 Cat2 3 Cat3, 5 Cat4 1 Pourrait me donner comme solution (Cat1, Cat2) et (Cat3, Cat4) parce que 2+3 / 5 +1 est proche de 1 ou encore (Cat1, Cat2, Cat4) et (Cat3) parce que 2+3+1 / 5 est proche de 1 mais pas (Cat1, Cat2, Cat3) et (Cat4) parce que (2+3+5) / 1 est moins proche de 1 que les autres solutions Mais à quoi ça sert ? Ayant extrait des données par catégorie d’une base de données, je souhaiterais les présenter sur deux colonnes, classées par catégorie mais également avec une présentation correcte, c’est-à-dire sur deux colonnes « équilibrées » PS : Je ne suis pas une tête en mathématique, alors si vous avez une solution ayez pitié de me la présenter dans un langage pas trop complexe. Ou alors dites-moi direct « Oublies si t’as pas bac +15 et deux ou trois thèses en préparation». Merci pour votre aide.

vendredi 24 mars 2006 à 11:26:47 | Re : Trouver la meilleure répartition (A la recherche de l'algorithme)

scaryman

Salut
Il ne faut pas etre particulierement fort en math (bien que l'algorithmique ce n'est pas grand chose d'autre) pour faire de la prog.
Je n'ai pas vraiment de réponse à ton problème mais un début de piste, c'est d'additionner tous les objets ensemble et de diviser ce nombre par le nombre de catégories. Ensuite, tant que tu ne dépasses pas ce nombre (ou alors de peu), tu pourrais ajouter les catégories dans la 1ère colonne.
Ensuite, tu mettrais ce qui reste dans la 2e colonne.

Je sais bien que ce n'est pas (du tout) optimal mais ce n'est qu'un début de piste.

Voila
A++

vendredi 24 mars 2006 à 11:44:21 | Re : Trouver la meilleure répartition (A la recherche de l'algorithme)

AlexN

Salut tu le dis bien toi même : "bien que l'algorithmique ce n'est pas grand chose d'autre" La solution que tu me proposes est celle que j'utilise pour l'instant. Mais si la catégorie qui est à la frontière des deux colonnes contient beaucoup d'objets, les colonnes deviennent completement désequilibrées. Cette méthode présuppose que lorsque je "coupe en deux", la catégorie frontière est "gentille" et contient un nombre d'objets appropriés pour faire une bonne répartition. Malheureusement c'est loin d'être toujours le cas. Merci tout de même.

vendredi 24 mars 2006 à 11:57:30 | Re : Trouver la meilleure répartition (A la recherche de l'algorithme)

valckar

Il faut trier ta list en ordre inverse de taille.

vendredi 24 mars 2006 à 12:04:43 | Re : Trouver la meilleure répartition (A la recherche de l'algorithme)

AlexN

Bonjour Valckar Ok je trie la liste que j'ai donné en exemple en ordre inverse de taille : (Cat 3, 5), (Cat2, 3) (Cat1, 2) (Cat4, 1) Et après ? Qu'est-ce que je fais ?

vendredi 24 mars 2006 à 12:06:33 | Re : Trouver la meilleure répartition (A la recherche de l'algorithme)

valckar

Je n'ais pas testé mais le code devrait ressembler à ça :

public List<Map<Object, List<Object>>> reparti(Map<Object, List<Object>> map)
    {
        SortedSet<Entry<Object, List<Object>>> sortedSet = new TreeSet<Entry<Object, List<Object>>>(new Comparator<Entry<Object, List<Object>>>()
        {

            public int compare(Entry<Object, List<Object>> o1, Entry<Object, List<Object>> o2)
            {
                return o2.getValue().size() - o1.getValue().size();
            }
        });
        sortedSet.addAll(map.entrySet());
        List<Map<Object, List<Object>>> result = new ArrayList<Map<Object, List<Object>>>(2);
        result.add(new HashMap<Object, List<Object>>());
        result.add(new HashMap<Object, List<Object>>());
        List<Integer> valueList = new ArrayList<Integer>(2);
        valueList.add(0);
        valueList.add(0);
        int index = 0;
        for (Entry<Object, List<Object>> entry : sortedSet)
        {
            index = valueList.get(0) <= valueList.get(1) ? 0 : 1;
            result.get(index).put(entry.getKey(), entry.getValue());
            valueList.set(index, valueList.get(index) + 1);
        }
        return result;
    }



vendredi 24 mars 2006 à 12:24:59 | Re : Trouver la meilleure répartition (A la recherche de l'algorithme)

valckar

Si tu veus tester :

Map<Object, List<Object>> uple = new HashMap<Object, List<Object>>();
        Random r = new Random();
        for (int i = 0; i < 100; i++)
        {
            int taille = r.nextInt(10);
            List<Object> list = new ArrayList<Object>(taille);
            for (int n = 0; n < taille; n++)
            {
                list.add(n);
            }
            uple.put("c"+i, new ArrayList<Object>(list));
        }
        List<Map<Object, List<Object>>> list = new retpartition().reparti(uple);
        int result = 0;
        for (List l : list.get(0).values())
        {
            result += l.size();
        }
        System.out.println("list 1" + result);
        result = 0;
        for (List l : list.get(1).values())
        {
            result += l.size();
        }
        System.out.println("list 2" + result);


vendredi 24 mars 2006 à 13:42:20 | Re : Trouver la meilleure répartition (A la recherche de l'algorithme)

AlexN

Valckar ou quelqu'un ayant compris sa solution : Je ne connais pas très bien java. J'ai posté ici parce qu'il n'existe pas de catégorie "recherche d'algorithme". Pourrais-tu me traduire ta solution sans "langage dependance". Si (expression) alors (instruction)... Merci Sinon tant pis.

vendredi 24 mars 2006 à 13:43:11 | Re : Trouver la meilleure répartition (A la recherche de l'algorithme)

valckar

Une petite erreur
a la place de
                        valueList.set(index, valueList.get(index) + entry.getValue().1);
il faut lire
                        valueList.set(index, valueList.get(index) + entry.getValue().size());

et a la place de
                        return o2.getValue().size() - o1.getValue().size();
il faut lire
                        int result = o2.getValue().size() - o1.getValue().size();
                        if(result==0)result = 1;
                        return result;



vendredi 24 mars 2006 à 13:48:20 | Re : Trouver la meilleure répartition (A la recherche de l'algorithme)

AlexN

PS : je trouvais que dans le LISP y'avait trop de parenthèses. Je vais finir par penser que dans le java y'a trop de < et de >


1 2

Cette discussion est classé dans : catégorie, objets, proche, cat1, cat2


Répondre à ce message

Sujets en rapport avec ce message

Questions sur objets [ par Aldee ] Salut, Je voudrais faire une application java où certains de mes objets sont connus de tous. Y-a-t'il un moyen de les faire connaitre par tous les Objet Choice et évébement [ par Volfield ] J'utilise des objets choice pour le choix de mes dates (j/m/a).Pour récupérer les événements je texte si l'événement est egale à 2002 par exemple, le tableau d'objet en parametre de fonction [ par Juls ] Bonjour J'essaie depuis quelques jours d'instancier des objets avec un tableau d'objet du type : Vehicule voiture[] = new Vehicule[10] //permettant gestion dynamique des instances [ par Frouf85 ] Je souhaite faire une applet et je veux créer dynamiquement des objets dans celle ci.par ex:for (int i=0;iJTable table = new JTable();}mais le problèm [debutante][java3d] un objet dans un objet [ par ametisse ] Salut, je suis débutante en java3d et j'aurais besoin de savoir comment on fait pour mettre des objets dans d'autres objets.En fait, je souhaite creer Récupération du type d'objets stockés [ par jtmarin ] Bonjour, j'ai une question bête:J'ai un certain nombre d'ojets stockés disons dans une HashMap par exemple. Je voudrais récupérer seulement les objets Transformer une applet en objet ? [ par MasterGreg ] Bonjour, Parmi les exemples ditribués avec Java3D, il y a une applet qui permet de visualiser les objets au format obj. Cette applet ouvre l'objet, l' PB de constructeur [ par BadwaCBonPourToi ] je voulais savoir lequel de ces deux constructeur il fallai que je prenne, et si je pouvais recontrer des problemes en particulier avec le premier : p Changement des propriétés d'objets créer dynamiquement [ par zeperqman ] Bonjour tout le monde,J'aimerais savoir si l'un ou l'une d'entre vous, connaitrait un moyen pour créer un objet créer dynamiquement de la manière suiv Copie d'objets par VALEUR [ par Ghyzi ] Bonjour,je sais que les copies d'objets en Java se font par référence.Cependant, je voudrais faire une copie par valeur d'un vecteur.J'ai jeté un oeil


Nos sponsors

Sondage...

CalendriCode

Janvier 2009
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,281 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.