Tirage aléatoire avec conditions

soUndercover - Modifié par soUndercover le 5/08/2014 à 19:44
 soUndercover - 5 août 2014 à 22:21
Bonjour,
_
Pour faire simple, j'ai des objets de type MaClasse et ayant pour attributs un nom, un type, un moyen de communication, un moyen de réception, un nombre de crédit.
_
Voici un exemple en ligne de ce que ça donne
nom1 type1 moyen_c1 moyen_r3 2
nom1 type2 moyen_c2 moyen_r1 4
nom1 type2 moyen_c3 moyen_r1 3
nom1 type2 moyen_c4 moyen_r4 6
nom1 type3 moyen_c3 moyen_r4 3
nom1 type3 moyen_c4 moyen_r2 1
nom1 type4 moyen_c2 moyen_r6 1
nom2 type1 moyen_c2 moyen_r2 1
nom2 type1 moyen_c6 moyen_r4 2
nom2 type2 moyen_c4 moyen_r3 8
_
Je voudrais faire un programme qui, pour chaque nom, me donne une liste d'objets de type MaClasse en respectant les contraintes :
- La somme des crédits doit être = à 10 (où le plus proche de 10)
- les objets doivent être le plus différents possibles pour un même nom (différents type, moyen_c, moyen_r, nombre de crédits)
_
par exemple pour nom1 on pourrait prendre :
nom1 type2 moyen_c2 moyen_r1 4
nom1 type2 moyen_c3 moyen_r4 6
_
mais comme ils ont le même type :
nom1 type1 moyen_c1 moyen_r3 2
nom1 type2 moyen_c4 moyen_r4 6
nom1 type3 moyen_c3 moyen_r1 3
nom1 type4 moyen_c2 moyen_r6 1
est mieux car les champs sont tous différents, y compris le nombre de crédit.
_
Voyez vous comment pourrais-je m'y prendre ?
J'ai pensé à faire une hashMap<String,hashMap<String,hashMap<String,hashMap<String,hashMap<String,ArrayList<MaClasse>>>>>>() ou les clés sont nom,type,moyen_c,moyen_r,montant_credit,liste des cas, mais c'est lourd, et au final je vois pas comment m'en sortir...
_
Merci d'avance,

1 réponse

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 127
Modifié par KX le 5/08/2014 à 20:33
Bonjour,

J'ai pensé à faire une hashMap<String,hashMap<String,hashMap<String,hashMap<String,hashMap<String,ArrayList<MaClasse>>>>>>()

Dans la plupart des cas une structure imbriquée comme celle-ci peut se remplacer plus simplement comme cela :

Map<Key, List<MaClasse>> map;

class Key
{
    String nom;
    String type;
    String moyen_c;
    String moyen_r;
}

Ensuite ton problème est loin d'être simple, plus tu vas augmenter le nombre d'objets MaClasse que tu vas donner en entrée, plus le nombre de calculs nécessaire sera grand.

Il va également falloir vraiment poser les règles du résultat, quand tu dis "= à 10 (où le plus proche de 10)" c'est trop imprécis. Sur quel critère considères-tu que c'est "proche de 10" ?
Dans la mesure où tu as des groupes qui vont faire exactement 10, pourquoi accepter des groupes différent de 10 ? À partir de quand la deuxième règle "les objets doivent être le plus différents possibles" devient elle plus importante que la première règle ?

Par exemple : est-ce que l'on impose d'avoir =10 quand on a plusieurs noms communs, mais que l'on autorise d'avoir =9 quand on a deux noms différents, voire =8 si tous les noms sont différents ?

Il y a une notion de "fitness" en intelligence artificielle. Cela consiste à évaluer une solution (lui donner un score) pour comparer deux solutions, la meilleure ayant un score extrémal.

Dans ton cas on pourrait par exemple considérer : D le nombre de noms différents et E l'écart à 10 de la somme. La fitness F étant la somme et devant être minimale.

Avec tes deux exemples :

nom1 type2 moyen_c2 moyen_r1 4
nom1 type2 moyen_c3 moyen_r4 6
? D=1, E=0, F=1

nom1 type1 moyen_c1 moyen_r3 2
nom1 type2 moyen_c4 moyen_r4 6
nom1 type3 moyen_c3 moyen_r1 3
nom1 type4 moyen_c2 moyen_r6 1
? D=0, E=0, F=0

Le deuxième est meilleur, il fait partie d'un ensemble de solutions "parfaites" car de fitness nulle.

Avec deux autres exemples :

nom1 type1 moyen_c1 moyen_r1 5
nom2 type1 moyen_c2 moyen_r2 5
? D=1, E=0, F=1

nom1 type1 moyen_c1 moyen_r1 5
nom2 type2 moyen_c2 moyen_r2 4
? D=0, E=1, F=1

Lequel est meilleur que l'autre ? Avec ma fonction F=D+E ces deux solutions sont de même valeur, mais si je prends F=2D+E ou F=D+2E, l'une devient meilleur que l'autre...

Il y a beaucoup de détails qui rentrent en compte dans ce genre de problèmes, et il faut être vraiment précis, en particulier dans le choix de la fitness.
L'algorithme devra de toute façon être réfléchi sur papier avant de coder quoi que ce soit, sinon tu vas faire tourner ton ordi pendant des heures à bidouiller des programmes inefficaces qui ne feront même pas ce que tu veux...

Remarque importante : à quel moment intervient le "tirage aléatoire" que tu as mis dans le titre ?
La confiance n'exclut pas le contrôle
0
Tout d'abord merci de votre réponse rapide et bien détaillée !

Je pense que j'ai oublié de préciser, qu'une fois qu'un cas est tiré dans un "paquet" où on a 10 crédits, il est mis dans une autre table, et ne peut plus être pris en compte.
A chaque lancement du programme, on récupère un paquet d'objets MaClasse de 10 crédits (donc = 10 crédits) pour chaque nom, et ces objets sont utilisés et donc n'"existe" plus pour le programme. Au bout d'un moment, il ne restera plus assez de crédit pour faire des paquets de 10, c'est pourquoi j'ai dit "ou proche de 10, c'était plus dans le sens "dans la mesure du possible". En résumé, ça doit toujours être égale à 10, sauf quand on n'a plus rien pour compléter.

Je connaissais absolument pas la notion de Fitness, et je vous remercie de vos détails dessus, je trouve ça vraiment intéressant pour évaluer les résultats ! Et je pense qu'il est judicieux dans l'appliquer pour compter le nombre de différences, et prendre les cas qui en ont le plus.

Quand vous avez donné vos deux autres exemples, vous avez pris des noms différents, je tiens juste à préciser que les cas doivent être différents pour chaque nom, on peut donc avoir :
nom1 type1 moyen_c1 moyen_r1 5
nom2 type1 moyen_c1 moyen_r1 5

sans souci. Après je ne sais pas si vous avez pris ces cas là juste pour me montrer le fonctionnement, et dans ce cas, je n'ai rien dit.

Je précise que j'ai déjà réfléchi toute l'après midi sur papier pour trouver un moyen d'organiser cela.

Je reviens sur le système de Key comme objet pour éviter les hashmap de hashmap , et en faisant comme cela, j'ai du mal à voir comment gérer la suite : Si par exemple, je prends : nom1 type1 moyen_c1 moyen_r1 5
je vais ensuite chercher dans ma map ceux qui ne sont pas de type1, ceux qui n'ont pas le moyen_c1 et moyen_r1. Alors qu'avec la solution HashMap<String,HashMap<String ... etc je pouvais ne pas prendre les cas ou type1, moyen_c1 etc.

Pour le tirage aléatoire, c'est parce que
1) Je ne savais pas quel titre mettre
2) c'est un tirage aléatoire dans le sens ou je prends des objets aléatoirement : on ne prend qu'un paquet d'objets à l'exécution du programme pour chaque nom et le total des crédits de ces objets doit faire 10 et ces objets doivent être le plus différents entre eux possible.

En tout cas merci beaucoup.
0
Rejoignez-nous