/// <summary> /// 从一条原油中判断或条件集合是否可用 /// </summary> /// <param name="OrSimQueList"></param> /// <param name="oilInfoID"></param> /// <returns></returns> private static TempSimliarityEntity getDataFromOrSimilarSearchList(IList <OilSimilarSearchEntity> OrSimQueList, int oilInfoID) { TempSimliarityEntity tempsimliarEntity = new TempSimliarityEntity(); //key = SUM , value = sumWeight double gMatch = 0; //返回结果 double gWeight = 0; //权重 #region "输入条件处理" if (OrSimQueList == null) { return(tempsimliarEntity); } if (OrSimQueList.Count <= 0) { return(tempsimliarEntity); } if (OrSimQueList[0].LeftParenthesis != "(")//队列的头部不为左括号 { return(tempsimliarEntity); } if (OrSimQueList[OrSimQueList.Count - 1].RightParenthesis != ")")//队列的尾部为右括号 { return(tempsimliarEntity); } #endregion #region "Or条件判断" foreach (var simItem in OrSimQueList)//循环每一个Or条件 { double tempMatch = 0, tempWeight = 0; string strCalData = getCalValueFromOilDataSearch(simItem, oilInfoID); if (strCalData == string.Empty || strCalData == null || strCalData == "非数字") { tempsimliarEntity.Match = double.NaN; tempsimliarEntity.Weight = gWeight; continue; } float tempfValue = 0; if (!float.TryParse(strCalData, out tempfValue)) { tempsimliarEntity.Match = double.NaN; tempsimliarEntity.Weight = gWeight; continue; } float fValue = simItem.Fvalue; float weight = simItem.Weight; float Diff = simItem.Diff; if (Diff > 0) { tempMatch = BaseFunction.FunToolSimilarity(tempfValue, fValue, weight, Diff);// weight * ((double)(1 - Math.Pow((Math.Abs(tempfValue - fValue) / Diff), 1 / 3))); //得到的运算符左边的相似度值 tempWeight = weight; if (tempMatch > gMatch) { gMatch = tempMatch; gWeight = tempWeight; } } else { if (1 > gMatch) { gMatch = 1; gWeight = weight; } } } #endregion tempsimliarEntity.Match = gMatch; tempsimliarEntity.Weight = gWeight; return(tempsimliarEntity); }
/// <summary> /// 相似查找,返回对应的原油ID /// </summary> /// <param name="oilProperty">相似查找条件的实体集合OilSimilarSearchEntityList</param> /// <returns></returns> public IDictionary <string, double> GetOilSimInfoCrudeIndex(IList <OilSimilarSearchEntity> similarSearchEntityList) { IDictionary <string, double> crudeIndexSimDic = new Dictionary <string, double>(); #region "输入条件判断" IList <string> resultCrudeIndexList = new List <string>(); //存放满足条件的原油编号 if (similarSearchEntityList == null) //查找条件为空 { return(crudeIndexSimDic); } if (similarSearchEntityList.Count == 0)//查找条件为空 { return(crudeIndexSimDic); } #endregion #region "初始化判断条件" string sqlWhere = "select distinct(oilInfoID) from OilDataSearch"; OilDataSearchAccess oilDataSearchAccess = new OilDataSearchAccess(); List <int> oilDataSearchOilInfoIDList = oilDataSearchAccess.getId(sqlWhere); //获取OilDataSearch表中的所有oilInfoID foreach (int oilInfoBID in oilDataSearchOilInfoIDList) //从C库中查找到的原油编号 { OilInfoBEntity bEntity = OilBll.GetOilBByID(oilInfoBID); List <TempSimliarityEntity> tempList = new List <TempSimliarityEntity>(); if (bEntity != null) { tempSimliarDic[bEntity.crudeIndex] = tempList; } } #endregion #region "范围查找中And和or两种类型的判断的归类-----以及Or逻辑的计算" IList <OilSimilarSearchEntity> searchAnd = new List <OilSimilarSearchEntity>(); //范围查找用(and条件) IList <OilSimilarSearchEntity> searchOr = new List <OilSimilarSearchEntity>(); //范围查找用(or条件) foreach (OilSimilarSearchEntity currentOilSimilarSearchEntity in similarSearchEntityList) { if (currentOilSimilarSearchEntity.IsAnd && currentOilSimilarSearchEntity.RightParenthesis.Trim() == "")//如果该条件是And,添加到searchAnd中去 { searchAnd.Add(currentOilSimilarSearchEntity); continue; } else if (!currentOilSimilarSearchEntity.IsAnd && currentOilSimilarSearchEntity.LeftParenthesis.Trim() == "(" && currentOilSimilarSearchEntity.RightParenthesis.Trim() == "")//如果该条件是Or,但不是最后一个Or,则添加到searchOr中去,暂时不进行计算 { searchOr.Add(currentOilSimilarSearchEntity); continue; } else if (!currentOilSimilarSearchEntity.IsAnd && currentOilSimilarSearchEntity.LeftParenthesis.Trim() == "" && currentOilSimilarSearchEntity.RightParenthesis.Trim() == "")//如果该条件是Or,但不是最后一个Or,则添加到searchOr中去,暂时不进行计算 { searchOr.Add(currentOilSimilarSearchEntity); continue; } else if (currentOilSimilarSearchEntity.RightParenthesis.Trim() == ")")////如果该条件是Or,且是括号中的最后一个Or,则添加到searchOr中去,并进行或的计算 { #region "Or的计算" searchOr.Add(currentOilSimilarSearchEntity); foreach (int ID in oilDataSearchOilInfoIDList)//根据ID循环每一条原油 { OilInfoBEntity infoB = OilBll.GetOilBByID(ID); if (!tempSimliarDic.Keys.Contains(infoB.crudeIndex)) { continue; } if (searchOr.Count <= 0) { continue; } TempSimliarityEntity tempsimliarEntity = getDataFromOrSimilarSearchList(searchOr, ID); if (tempSimliarDic.Keys.Contains(infoB.crudeIndex)) { tempSimliarDic[infoB.crudeIndex].Add(tempsimliarEntity); } } searchOr.Clear();//该Or括号计算完后,情况OrList,用于后面的Or括号计算 continue; #endregion } } #endregion #region "处理And条件或计算的结果和And条件取交集" foreach (int oilInfoID in oilDataSearchOilInfoIDList)//根据ID循环每一条原油 { OilInfoBEntity infoB = OilBll.GetOilBByID(oilInfoID); if (!tempSimliarDic.Keys.Contains(infoB.crudeIndex)) { continue; } if (searchAnd.Count <= 0) { continue; } TempSimliarityEntity tempsimliarEntity = getDataFromAndSimilarSearchList(searchAnd, oilInfoID); if (tempSimliarDic.Keys.Contains(infoB.crudeIndex)) { tempSimliarDic[infoB.crudeIndex].Add(tempsimliarEntity); } } #endregion foreach (string key in tempSimliarDic.Keys) { double sum = 0, sumWeight = 0; foreach (TempSimliarityEntity tempsimliarEntity in tempSimliarDic[key]) { if (tempsimliarEntity.Match == 0 || tempsimliarEntity.Match.Equals(double.NaN)) { sum = double.NaN; sumWeight = tempsimliarEntity.Weight; } else { sum += tempsimliarEntity.Match; sumWeight += tempsimliarEntity.Weight; } } if (sumWeight != 0 && !sum.Equals(double.NaN)) { crudeIndexSimDic.Add(key, sum / sumWeight); } } return(crudeIndexSimDic); }
/// <summary> ///从一条原油中获取相似度 /// </summary> /// <param name="AndOilSimilarSearchList"></param> /// <param name="oilInfoID"></param> /// <returns></returns> private static TempSimliarityEntity getDataFromAndSimilarSearchList(IList <OilSimilarSearchEntity> AndOilSimilarSearchList, int oilInfoID) { TempSimliarityEntity tempsimliarEntity = new TempSimliarityEntity(); //key = SUM , value = sumWeight double gSumMatch = 0; //返回结果 double gSumWeight = 0; //权重加和 #region "输入条件处理" if (AndOilSimilarSearchList == null) { return(tempsimliarEntity); } if (AndOilSimilarSearchList.Count <= 0) { return(tempsimliarEntity); } foreach (OilSimilarSearchEntity currrentOilSimilarSearchEntity in AndOilSimilarSearchList)//循环每一个物性 { if (!currrentOilSimilarSearchEntity.IsAnd) { return(tempsimliarEntity); } } #endregion #region "And条件判断" foreach (OilSimilarSearchEntity currrentOilSimilarSearchEntity in AndOilSimilarSearchList)//循环每一个物性 { string strCalData = getCalValueFromOilDataSearch(currrentOilSimilarSearchEntity, oilInfoID); if (strCalData == string.Empty || strCalData == null || strCalData == "非数字") { tempsimliarEntity.Match = double.NaN; tempsimliarEntity.Weight = gSumWeight; return(tempsimliarEntity); } float tempfValue = 0; if (!float.TryParse(strCalData, out tempfValue)) { tempsimliarEntity.Match = double.NaN; tempsimliarEntity.Weight = gSumWeight; return(tempsimliarEntity); } float fValue = currrentOilSimilarSearchEntity.Fvalue; float weight = currrentOilSimilarSearchEntity.Weight; float Diff = currrentOilSimilarSearchEntity.Diff; if (Diff > 0) { gSumMatch += BaseFunction.FunToolSimilarity(tempfValue, fValue, weight, Diff);//得到的运算符左边的相似度值 gSumWeight += weight; } else { gSumWeight += weight; gSumMatch += weight; } } #endregion tempsimliarEntity.Match = gSumMatch; tempsimliarEntity.Weight = gSumWeight; return(tempsimliarEntity); }