Tools.cs 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. using Microsoft.SolverFoundation.Services;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Text.RegularExpressions;
  7. using System.Threading.Tasks;
  8. using System.Xml;
  9. namespace OTSExtremum.Business
  10. {
  11. public class Tools
  12. {
  13. /// <summary>
  14. /// 判断字符串是否是int/double
  15. /// </summary>
  16. public static bool IsIntOrDouble(string strNumber)
  17. {
  18. Regex objNotNumberPattern = new Regex("[^0-9.-]");
  19. Regex objTwoDotPattern = new Regex("[0-9]*[.][0-9]*[.][0-9]*");
  20. Regex objTwoMinusPattern = new Regex("[0-9]*[-][0-9]*[-][0-9]*");
  21. const string strValidRealPattern = "^([-]|[.]|[-.]|[0-9])[0-9]*[.]*[0-9]+$";
  22. const string strValidIntegerPattern = "^([-]|[0-9])[0-9]*$";
  23. Regex objNumberPattern = new Regex("(" + strValidRealPattern + ")|(" + strValidIntegerPattern + ")");
  24. return !objNotNumberPattern.IsMatch(strNumber) &&
  25. !objTwoDotPattern.IsMatch(strNumber) &&
  26. !objTwoMinusPattern.IsMatch(strNumber) &&
  27. objNumberPattern.IsMatch(strNumber);
  28. }
  29. /// <summary>
  30. /// 数据离群分析,排除外围数据。返回值:1最大值越界;2最小值越界;0正常范围
  31. /// </summary>
  32. public static int Grubbls(double[] arrData)
  33. {
  34. //格布拉斯(Grubbls)检验法的临界值--k值
  35. double[] grubbls = {
  36. 0,0,1.156,1.492,1.749,1.944,2.097,2.221,2.323,2.410,2.485,2.550,
  37. 2.607,2.650,2.705,2.747,2.785,2.821,2.854,2.884,2.912,2.939,2.963,2.987,
  38. 3.009,3.029,3.049,3.085,3.103,3.119,3.135,3.150,3.164,3.178,3.178,3.191,
  39. 3.204,3.216,3.228,3.240,3.251,3.261,3.271,3.282,3.292,3.302,3.310,3.319,
  40. 3.329,3.336,3.345,3.353,3.361,3.368,3.376,3.383,3.391,3.397,3.405,3.411,
  41. 3.418,3.424,3.430,3.437,3.442,3.449,3.454,3.46,3.466,3.471
  42. };
  43. double xAvg = Mean(arrData);
  44. int arrNum = arrData.Length;
  45. double sdev = StDev(arrData);
  46. double max = arrData.Max();
  47. double min= arrData.Min();
  48. double Tmax = (max - xAvg) / sdev;
  49. double Tmin= (xAvg - min) / sdev;
  50. double T = grubbls[arrData.Count() - 1];
  51. if (Tmax > T)
  52. {
  53. return 1;
  54. }
  55. else if (Tmin > T)
  56. {
  57. return 2;
  58. }
  59. else
  60. {
  61. return 0;
  62. }
  63. }
  64. //计算标准偏差
  65. public static double StDev(double[] arrData)
  66. {
  67. double xAvg = Mean(arrData);
  68. double sSum = 0;
  69. double tmpStDev = 0;
  70. int arrNum = arrData.Length;
  71. for (int j = 0; j < arrNum; j++)
  72. {
  73. sSum += ((arrData[j] - xAvg) * (arrData[j] - xAvg));
  74. }
  75. tmpStDev = Convert.ToSingle(Math.Sqrt((sSum / (arrNum - 1))).ToString());
  76. return tmpStDev;
  77. }
  78. //平均值
  79. public static double Mean(double[] arrData)
  80. {
  81. double xSum = 0;
  82. double xAvg = 0;
  83. int arrNum = arrData.Length;
  84. for (int i = 0; i < arrNum; i++)
  85. {
  86. xSum += arrData[i];
  87. }
  88. xAvg = xSum / arrNum;
  89. return xAvg;
  90. }
  91. //δmom
  92. public static double Delta(double[] arrData)
  93. {
  94. double sdev = StDev(arrData);
  95. double xAvg=sdev*Math.Sqrt(6) / 3.1416;//δ
  96. return xAvg;
  97. }
  98. //λmom
  99. public static double Lambda(double[] arrData)
  100. {
  101. double delta = Delta(arrData);
  102. double mean = Mean(arrData);
  103. double xAvg = mean - 0.5772 * delta;
  104. return xAvg;
  105. }
  106. /// <summary>
  107. /// 规划求值
  108. /// </summary>
  109. /// <param name="gg">传入原始数据</param>
  110. /// <returns>double[δ,λ,max]</returns>
  111. public static double[] OPTMax(double[] gg)
  112. {
  113. SolverContext context = SolverContext.GetContext();
  114. //创建模型
  115. Model model = context.CreateModel();
  116. //优化决策因子,变量为实数,Domain.Integer|Domain.IntegerNonnegative为整数优化
  117. Decision x = new Decision(Domain.Real, "x");
  118. Decision y = new Decision(Domain.Real, "y");
  119. //添加
  120. model.AddDecisions(x, y);
  121. //优化
  122. Solution solution = context.Solve();
  123. Goal gmax = model.AddGoal("zmax", GoalKind.Maximize, GetFun(gg,x, y));
  124. //优化
  125. solution = context.Solve();
  126. double[] ret = new double[] { x.ToDouble(), y.ToDouble(), solution.Goals.First<Goal>().ToDouble() };
  127. context.ClearModel();
  128. return ret;
  129. }
  130. //返回公式
  131. private static Term GetFun(double[] gg,Decision delta, Decision lambda)
  132. {
  133. // double[] gg = { 140, 240, 532, 205, 150, 110, 200, 180, 220, 300, 70, 390, 100, 90, 320, 190, 250, 150, 280, 250, 490, 120, 500, 200 };
  134. // Array.Sort(gg);
  135. Term xx = Model.Log(1 / delta) - (gg[0] - lambda) / delta - Model.Exp((lambda - gg[0]) / delta);
  136. for (int i = 1; i < gg.Count(); i++)
  137. {
  138. xx = xx + Model.Log(1 / delta) - (gg[i] - lambda) / delta - Model.Exp((lambda - gg[i]) / delta);
  139. }
  140. return xx;
  141. }
  142. /// <summary>
  143. /// 获取XML节点参数
  144. /// </summary>
  145. /// <param name="Name">节点参数名称</param>
  146. /// <returns>节点参数</returns>
  147. public static string GetXMLInformations(string xmlFilePath, string Name)
  148. {
  149. try
  150. {
  151. string value = string.Empty;
  152. XmlDocument doc = new XmlDocument();
  153. doc.Load(xmlFilePath); //加载Xml文件
  154. XmlElement root = doc.DocumentElement; //获取根节点
  155. XmlNodeList mainNodes = root.GetElementsByTagName("parameter"); //获取子节点集合
  156. foreach (XmlNode node in mainNodes)
  157. {
  158. //获取Name属性值
  159. string name = ((XmlElement)node).GetAttribute("Name");
  160. if (name.Equals(Name))
  161. {
  162. value = ((XmlElement)node).GetAttribute("Value");
  163. }
  164. }
  165. return value;
  166. }
  167. catch (Exception)
  168. {
  169. return "";
  170. }
  171. }
  172. #region Base64加密解密
  173. /// <summary>
  174. /// Base64加密
  175. /// </summary>
  176. /// <param name="input">需要加密的字符串</param>
  177. /// <returns></returns>
  178. public static string Base64Encrypt(string input)
  179. {
  180. return Base64Encrypt(input, new UTF8Encoding());
  181. }
  182. /// <summary>
  183. /// Base64加密
  184. /// </summary>
  185. /// <param name="input">需要加密的字符串</param>
  186. /// <param name="encode">字符编码</param>
  187. /// <returns></returns>
  188. public static string Base64Encrypt(string input, Encoding encode)
  189. {
  190. return Convert.ToBase64String(encode.GetBytes(input));
  191. }
  192. /// <summary>
  193. /// Base64解密
  194. /// </summary>
  195. /// <param name="input">需要解密的字符串</param>
  196. /// <returns></returns>
  197. public static string Base64Decrypt(string input)
  198. {
  199. return Base64Decrypt(input, new UTF8Encoding());
  200. }
  201. /// <summary>
  202. /// Base64解密
  203. /// </summary>
  204. /// <param name="input">需要解密的字符串</param>
  205. /// <param name="encode">字符的编码</param>
  206. /// <returns></returns>
  207. public static string Base64Decrypt(string input, Encoding encode)
  208. {
  209. return encode.GetString(Convert.FromBase64String(input));
  210. }
  211. #endregion
  212. }
  213. //分组数据信息
  214. public class groupInfo
  215. {
  216. //数据
  217. public double[] values { set; get; }
  218. //名称
  219. public string groupTitle { set; get; }
  220. }
  221. }