/// <summary> /// 从一条原油中判断或条件集合是否可用 /// </summary> /// <param name="OrOilSimilarSearchList"></param> /// <param name="oilInfoID"></param> /// <returns></returns> private static TempsimliarEntity getDataFromOrSimilarSearchList(IList <OilSimilarSearchEntity> OrOilSimilarSearchList, int oilInfoID) { TempsimliarEntity tempsimliarEntity = new TempsimliarEntity(); //key = SUM , value = sumWeight double SUM = 0; //返回结果 double sumWeight = 0; //权重加和 #region "输入条件处理" if (OrOilSimilarSearchList == null) { return(tempsimliarEntity); } if (OrOilSimilarSearchList.Count <= 0) { return(tempsimliarEntity); } if (OrOilSimilarSearchList[0].LeftParenthesis != "(")//队列的头部不为左括号 { return(tempsimliarEntity); } if (OrOilSimilarSearchList[OrOilSimilarSearchList.Count - 1].RightParenthesis != ")")//队列的尾部为右括号 { return(tempsimliarEntity); } #endregion #region "Or条件判断" double temp = 0, tempWeight = 0; foreach (OilSimilarSearchEntity currentOilSimilarSearchEntity in OrOilSimilarSearchList)//循环每一个Or条件 { string strCalData = getCalValueFromOilDataSearch(currentOilSimilarSearchEntity, oilInfoID); if (strCalData == string.Empty || strCalData == null || strCalData == "非数字") { tempsimliarEntity.Match = double.NaN; tempsimliarEntity.Weight = sumWeight; return(tempsimliarEntity); } float tempfValue = 0; if (!float.TryParse(strCalData, out tempfValue)) { tempsimliarEntity.Match = double.NaN; tempsimliarEntity.Weight = sumWeight; return(tempsimliarEntity); } float fValue = currentOilSimilarSearchEntity.Fvalue; float weight = currentOilSimilarSearchEntity.Weight; float Diff = currentOilSimilarSearchEntity.Diff; if (Diff > 0) { //temp = weight * ((double)(1 - Math.Pow(((tempfValue - fValue) / Diff), 2))); //得到的运算符左边的相似度值 //temp = weight * (1 - Math.Abs((tempfValue - fValue) / Diff)); //得到的运算符左边的相似度值 //temp = weight * (1 - Math.Sqrt(Math.Abs((tempfValue - fValue) / Diff))); //得到的运算符左边的相似度值 temp = weight * ((double)(1 - Math.Pow(((tempfValue - fValue) / Diff), (double)1.0 / 3))); //得到的运算符左边的相似度值 tempWeight = weight; if (temp > SUM) { SUM = temp; sumWeight = tempWeight; } } else { if (1 > SUM) { SUM = 1; sumWeight = weight; } } } #endregion tempsimliarEntity.Match = SUM; tempsimliarEntity.Weight = sumWeight; 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 <TempsimliarEntity> tempList = new List <TempsimliarEntity>(); if (bEntity != null) { tempSimliarDic[bEntity.crudeIndex] = tempList; } } #endregion #region "范围查找中And和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; } TempsimliarEntity 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; } TempsimliarEntity 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 (TempsimliarEntity 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 TempsimliarEntity getDataFromAndSimilarSearchList(IList <OilSimilarSearchEntity> AndOilSimilarSearchList, int oilInfoID) { TempsimliarEntity tempsimliarEntity = new TempsimliarEntity(); //key = SUM , value = sumWeight double SUM = 0; //返回结果 double sumWeight = 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 = sumWeight; return(tempsimliarEntity); } float tempfValue = 0; if (!float.TryParse(strCalData, out tempfValue)) { tempsimliarEntity.Match = double.NaN; tempsimliarEntity.Weight = sumWeight; return(tempsimliarEntity); } float fValue = currrentOilSimilarSearchEntity.Fvalue; float weight = currrentOilSimilarSearchEntity.Weight; float Diff = currrentOilSimilarSearchEntity.Diff; if (Diff > 0) { //SUM += weight * ((double)(1 - Math.Pow(((tempfValue - fValue) / Diff), 2)));//得到的运算符左边的相似度值 //SUM += weight * (1 - Math.Abs((tempfValue - fValue) / Diff)); //得到的运算符左边的相似度值 //SUM += weight * (1 - Math.Sqrt(Math.Abs((tempfValue - fValue) / Diff))); //得到的运算符左边的相似度值 //SUM += weight * (1 - Math.Sqrt(Math.Sqrt(Math.Abs((tempfValue - fValue) / Diff)))); //得到的运算符左边的相似度值 SUM += weight * (1 - Math.Pow(Math.Abs((tempfValue - fValue) / Diff), (double)1.0 / 3)); //得到的运算符左边的相似度值 sumWeight += weight; } else { sumWeight += weight; SUM += weight; } } #endregion tempsimliarEntity.Match = SUM; tempsimliarEntity.Weight = sumWeight; return(tempsimliarEntity); }