/// <summary> /// compute the similarity of case base's cases and problem case /// /// </summary> /// <param name="cases"></param> /// <param name="problem"></param> /// <returns></returns> public ArrayList ComputeSimilarity(ArrayList cases, Case problem) { if (_env == null) { throw new ContextException("environment variable is not set"); } ICBRContext ctx = CBRContextManager.GetCBRContext(_env); if (ctx == null) { throw new ContextException("not set context"); } ISimilarity sim = (ISimilarity)ctx.GetSimilarity(); if (sim == null) { throw new ContextException("similarity method is not set"); } ArrayList stats = new ArrayList(); double similarityThrehold = ctx.GetSimilarityThrehold(); for (int i = 0; i < cases.Count; i++) { Case solution = (Case)cases[i]; double similarity = sim.Compare(problem, solution); //continue if the similarity by comparing is lower than the //similarity threhold in context setting if (similarity < similarityThrehold) { continue; } IStat s = StatFactory.newInstance(); s.SetCBRCase(solution); s.SetCaseSimilarity(similarity); //bi-sort similarity if (stats.Count <= 0) { stats.Add(s); continue; } SortSimilarity(stats, s); } return(stats); }
/// <summary> /// test data: /// case structure: /// feature name feature type weight key /// speed double 0.5 false /// temperature double 0.3 false /// quality double 0.2 false /// result double 0 true /// case 1 data: /// speed 2.0 /// temperature 3.0 /// quality 1 /// result 1 /// case 2 data: /// speed 3.0 /// temperature 4.0 /// quality 2 /// result 2 /// expected result value is 1 / (1 + Math.Sqrt(0.38)* 1 /// /// </summary> [Test] public void testCompare() { double diff = sim.Compare(c1, c2); Assert.AreEqual(1 / (1 + Math.Sqrt(0.38) * 1), diff); }