Délégation de services domotique

Fermé
mariya2016 Messages postés 30 Date d'inscription dimanche 13 mars 2016 Statut Membre Dernière intervention 19 mai 2016 - 3 avril 2016 à 22:11
mariya2016 Messages postés 30 Date d'inscription dimanche 13 mars 2016 Statut Membre Dernière intervention 19 mai 2016 - 4 mai 2016 à 01:20
Bonjour,
j'ai une application à faire qui concerne la délégation de services domotique.
j'ai une fonction qui calcule la similarité entre deux équipement( dans notre cas), elle est comme suit:


Where:
- X and Y are two profiles belonging to P;
- a is the set of common characteristics of X and Y;
- b is the set of characteristics existing in X and not existing in Y;
- c is the set of characteristics existing in Y and not existing in X;
- ASim is the atomic similarity between each characteristic of X and Y. ASim is defined as follows:
ASim: R+ x R+- [0,1]:
ASim(Xi,Yi)= 1 if (Xi=Yi)
0 if ((Xi different from Yi) and (type=qualitative)
Min(Xi,Yi)/Max(Xi,Yi) if ((Xi different from Yi) and (type=quantitive)

....
SVP est ce que quelqu'un peut me dire comment je peux programmer cette fonction en java, et comment je peux récupérer a ,b et c.
Merci

3 réponses

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
3 avril 2016 à 22:29
Bonjour,

Le plus dur là dedans ce n'est pas trop le calcul en soit (c'est juste une moyenne pondérée), mais plutôt comment tu vas attribuer des valeurs derrière chacun des paramètres a, b, c... qui sont plus durs à déterminer.

Remarque : que représente la pondération w ?
0
mariya2016 Messages postés 30 Date d'inscription dimanche 13 mars 2016 Statut Membre Dernière intervention 19 mai 2016
3 avril 2016 à 22:38
W c'est le poid , Wi c'est le poid de chaque caractéristique d'un équipement(la somme de ces poids = 1)
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
Modifié par KX le 4/04/2016 à 18:47
De manière purement algorithmique tu peux faire comme ceci :

private static double sum(int n, Function<Integer, Double> x) {
    double s = 0;
    for (int i = 1; i <= n; i++)
        s += x.apply(i);
    return s;
}

public static <X, Y> double qSim(int a, int b, int c, Function<Integer, Double> w, Function<Integer, X> x, Function<Integer, Y> y) {
    double p = a * sum(a + b + c, i -> w.apply(i) * aSim(x.apply(i), y.apply(i)));
    double q = a * sum(a, i -> w.apply(i)) + b * sum(b, i -> w.apply(a + i)) + c * sum(c, i -> w.apply(a + b + i));
    return p / q;
}

public static <X, Y> double aSim(X x, Y y) {
    return 0; // TODO
}

Le plus dur maintenant c'est de mettre en équations w, x et y...
La confiance n'exclut pas le contrôle
0
mariya2016 Messages postés 30 Date d'inscription dimanche 13 mars 2016 Statut Membre Dernière intervention 19 mai 2016
4 avril 2016 à 20:08
Bonjour,
merci pour votre réponse, ça reste toujours ambiguë je ne vois pas encore la solution et comment récupérer a et b....etc
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
5 avril 2016 à 22:08
Je ne connais pas ta formule donc je ne sais pas à quoi elle sert exactement, mais je dirais que le but c'est de chercher a,b,c tels que Qsim est maximal ?

Dans ce cas tu peux y aller en force brute :

int aMax = 1, bMax = 1, cMax = 1;
double simMax = Double.NEGATIVE_INFINITY;
for (int a = 1; a <= n - 2; a++)
for (int b = 1; b <= n - a -1; b++)
for (int c = 1; a <= n - a - b; c++) {
    double sim = qSim(a, b, c, w, x, y);
    if (sim > simMax) {
        simMax = sim;
        aMax = a;
        bMax = b;
        cMax = c;
    }
}
System.out.println("a="+aMax+", b="+bMax+", c="+cMax+" -> qSim="+simMax);
0
mariya2016 Messages postés 30 Date d'inscription dimanche 13 mars 2016 Statut Membre Dernière intervention 19 mai 2016
4 mai 2016 à 01:18
Bonsoir à tous, j'ai pas encore trouvé une solution à ce problème.
J'ai essayé un petit code pour trouvé a,b et c mais ça ne marche pas, les nombres ne s'incrémentent pas, je pense que le problème est dans la boucle (je veux dire dans "result.next()").
j'ai pas su régler le problème :( , est ce que quelqu'un pourras m'aider svp!
voici mon code:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;


public class similair {

	static int a=0;
	static int b=0;
	static int c=0;
	public static void main(String[] args) {
	
	
		try{
			Class.forName("oracle.jdbc.driver.OracleDriver");
			Connection con=DriverManager.getConnection("jdbc:oracle:thin:system/orcl1@localhost:1521:XE","admin","admin");
			Statement st=con.createStatement();
			
			String sqlT1="select * from  EQUIPEMENTTEMPERATURE  where NOMEQUIPEMENT='chauf' ";
			String sqlT2="select * from  EQUIPEMENTTEMPERATURE  where NOMEQUIPEMENT='climG' ";
		
			ResultSet rsT1=st.executeQuery(sqlT1);
			ResultSet rsT2=st.executeQuery(sqlT2); 
ResultSetMetaData rsmd = rsT1.getMetaData();
	        int columnsNumber = rsmd.getColumnCount(); 
	        ResultSetMetaData rsmd2 = rsT2.getMetaData();
	        int columnsNumber2 = rsmd2.getColumnCount(); 
	        while (rsT1.next()&& rsT2.next()) {

	         for(int i = 0 ; i <= columnsNumber && i <= columnsNumber2; i++){	
	        	 int j=i+3; 
		if((rsT1.getString(j)!="/") &(rsT2.getString(j) !="/"))
a++;
  else if((rsT1.getString(j)=="/")& (rsT2.getString(j) !="/"))
			
			b++;
		
		        else if ((rsT1.getString(j)!="/") & (rsT2.getString(j) =="/"))
			    c++;
		
	
		
	          }
	          
	          
		}

		
		
		System.out.println(a +" "+ b +" "+c);
		
		
		con.close();
		
		}
		
		
		catch(Exception e)
				{
				e.printStackTrace();
				}
	}
}

et voici ma table 'equipementtemperature':


donc dans exemple(en comparant 'chauf' et 'climG') le résultat finale doit être:
a=4 (le nombre de caractéristiques en commun_on ne compte pas le nom de l'equipement,marque,piece,etat_);
b=3 (le nombre de caractéristiques que 'climG' a et 'chauf' n'a pas _ le slash / veut dire la caractéristique est abente_);
c=0 (le nombre de caractéristiques que 'chauf' a et 'climG' n'a pas).
Merci pour votre aide.
0
mariya2016 Messages postés 30 Date d'inscription dimanche 13 mars 2016 Statut Membre Dernière intervention 19 mai 2016
4 mai 2016 à 01:20
j'ai oublié de citer que ça m'affiche 0 0 0 (comme valeurs de a,b et c )
0