| | |
| | | using System.Collections.Concurrent; |
| | | using Dapper; |
| | | using NPOI.SS.Formula.Functions; |
| | | using NPOI.SS.Formula.Eval; |
| | | //using NPOI.Util.Collections; |
| | | |
| | | namespace Hydro.CommonBase |
| | |
| | | if (Quene!=null) Quene.Dispose(); |
| | | Quene = new Quene(); |
| | | this.Quene= Quene; |
| | | //获取全局默认设置 |
| | | var globalConfig = Db.Connection.QueryFirstOrDefault<string>("SELECT FValue FROM MyConfig WHERE FKey='GlobalConfig'"); |
| | | GlobalConfig = JsonConvert.DeserializeObject<GlobalConfig>(globalConfig) ?? new GlobalConfig(); |
| | | this.GlobalConfig = GlobalConfig; |
| | | if (ConfigPath!=null) |
| | | { |
| | | //获取全局默认设置 |
| | | var globalConfig = Db.Connection.QueryFirstOrDefault<string>("SELECT FValue FROM MyConfig WHERE FKey='GlobalConfig'"); |
| | | GlobalConfig = JsonConvert.DeserializeObject<GlobalConfig>(globalConfig) ?? new GlobalConfig(); |
| | | this.GlobalConfig = GlobalConfig; |
| | | } |
| | | |
| | | isInited = true; |
| | | //return gParam; |
| | | } |
| | | public string Load_GeneticSettings(LogicModelParams param) |
| | | { |
| | | |
| | | var ranges = new List<DRange>(); |
| | | var accuracys = new List<Double?>(); |
| | | var DLengths = new List<int>(); |
| | | //chromosomeLength = 0; |
| | | param.试算变量.ForEach(v => |
| | | { |
| | | ranges.Add(v.doubleRange); |
| | | DLengths.Add(getDLength(v.doubleRange, v.accuracy)); |
| | | accuracys.Add(v.accuracy); |
| | | }); |
| | | this.ranges = ranges; |
| | | this.DLengths = DLengths; |
| | | this.accuracys = accuracys; |
| | | return null; |
| | | } |
| | | public string Load_Settings(LogicModelParams param, FinishEvent onFinished, FinishEvent onError, FinishEvent onReportProgress, SetEvent SetVarsMethod) |
| | | { |
| | | //string result = null; |
| | | |
| | | |
| | | //DLengths.ForEach(m => chromosomeLength += m); |
| | | |
| | | this.populationSize = this.GlobalConfig.Ext.populationNum; |
| | | this.iterations = this.GlobalConfig.Ext.iterationNum; |
| | | this.populationSize_min = this.GlobalConfig.Ext.populationNum_full; |
| | | this.iterations_full = this.GlobalConfig.Ext.iterationNum_full; |
| | | |
| | | this.selectionMethod = 0; |
| | | this.optimizationMode = param.OFunction.ExpressType == "最大" ? 1 : 0; |
| | | this.强制重计算 = this.GlobalConfig.Ext.是否优选方案; |
| | | this.iterations_min = this.GlobalConfig.Ext.iterationNum_Min; |
| | | |
| | | this.onReportProgress = onReportProgress; |
| | | this.onFinished = onFinished; |
| | | this.onError = onError; |
| | | this.setVars = SetVarsMethod; |
| | | |
| | | |
| | | |
| | | return null; |
| | | |
| | | } |
| | | int getDLength(DRange dr, double? accur) |
| | | { |
| | | if (accur == null) accur = 0.1; |
| | | var num_Total = dr.Length / (double)accur; |
| | | var Dlength = 0; |
| | | var value = 1; |
| | | var i = 0; |
| | | //判断需要多少位二进制数 |
| | | //Dlength=Math.Log(num_Total, 2) > 0 ? (int)Math.Ceiling( Math.Log(num_Total, 2)) : 0; |
| | | while (value <= num_Total && i < 1000) |
| | | { |
| | | value *= 2; |
| | | Dlength += 1; |
| | | i++; |
| | | } |
| | | return Dlength; |
| | | } |
| | | public void Dispose() |
| | | { |
| | |
| | | |
| | | } |
| | | |
| | | //世代最优解列表 |
| | | public List<double> list_FitnessByItera; |
| | | |
| | | public List<double> list_BestEnerge; |
| | | public List<double> list_AvgHz; |
| | | #region 解析参数 |
| | | public List<DRange> ranges; |
| | | public List<int> DLengths; |
| | | public List<double?> accuracys; |
| | | public List<int> Dependencies; |
| | | public double[] list_AtemtpArr; |
| | | #endregion |
| | | |
| | | |
| | | |
| | | //public double[] list_AtemtpArr; |
| | | |
| | | public string SolutionSaveName; |
| | | public int populationSize; |
| | | public int iterations; |
| | | public int populationSize_full; |
| | | public int populationSize_min; |
| | | public int iterations_full; |
| | | public List<ulong> Upopulations = null; |
| | | |
| | |
| | | public int num; |
| | | public double BestOptValue; |
| | | public DRange tolerance; |
| | | [JsonIgnore] |
| | | public FinishEvent onFinished; |
| | | [JsonIgnore] |
| | | public FinishEvent onError; |
| | | [JsonIgnore] |
| | | public FinishEvent onReportProgress; |
| | | [JsonIgnore] |
| | | public SetEvent setVars; |
| | | |
| | | public Db Db; |
| | | public dynamic SolutionDBHelper = null; |
| | | public GlobalConfig GlobalConfig; |
| | | public bool isInited=false; |
| | | [JsonIgnore] |
| | | public Quene Quene; |
| | | public int Level; |
| | | public int ID; |
| | |
| | | public bool isNeedOutput = true; |
| | | |
| | | public double CurrentTotalDemand = -1; |
| | | public GeneticParams DeepCopy() |
| | | { |
| | | var copy = new GeneticParams(this.Level); |
| | | copy.list_BestEnerge = this.list_BestEnerge?.ToList(); |
| | | copy.list_AvgHz = this.list_AvgHz?.ToList(); |
| | | copy.ranges = this.ranges?.Select(range => new DRange(range.Min, range.Max))?.ToList(); |
| | | copy.DLengths = this.DLengths?.ToList(); |
| | | copy.accuracys = this.accuracys?.ToList(); |
| | | copy.Dependencies = this.Dependencies?.ToList(); |
| | | copy.list_AtemtpArr = this.list_AtemtpArr?.ToArray(); |
| | | copy.SolutionSaveName = this.SolutionSaveName; |
| | | copy.populationSize = this.populationSize; |
| | | copy.iterations = this.iterations; |
| | | copy.populationSize_full = this.populationSize_full; |
| | | copy.iterations_full = this.iterations_full; |
| | | copy.Upopulations = this.Upopulations?.ToList(); |
| | | copy.selectionMethod = this.selectionMethod; |
| | | copy.optimizationMode = this.optimizationMode; |
| | | copy.强制重计算 = this.强制重计算; |
| | | copy.iterations_min = this.iterations_min; |
| | | copy.accuracyNum = this.accuracyNum; |
| | | copy.MaxRobot = this.MaxRobot; |
| | | copy.RuningRobot = this.RuningRobot; |
| | | copy.num = this.num; |
| | | copy.BestOptValue = this.BestOptValue; |
| | | copy.tolerance = tolerance==null?null: new DRange(this.tolerance.Min, this.tolerance.Max); |
| | | copy.onFinished = this.onFinished; |
| | | copy.onError = this.onError; |
| | | copy.onReportProgress = this.onReportProgress; |
| | | copy.setVars = this.setVars; |
| | | copy.Db = this.Db; // Assuming Db is a reference type |
| | | copy.SolutionDBHelper = this.SolutionDBHelper; // Assuming SolutionDBHelper is a reference type |
| | | copy.GlobalConfig = this.GlobalConfig.DeepCopyByBin<GlobalConfig>(); // Assuming GlobalConfig has a copy constructor |
| | | copy.isInited = this.isInited; |
| | | copy.Quene = this.Quene; // Assuming Quene has a copy constructor |
| | | copy.ID = this.ID; |
| | | copy.isNeedOutput = this.isNeedOutput; |
| | | copy.CurrentTotalDemand = this.CurrentTotalDemand; |
| | | //public GeneticParams DeepCopy() |
| | | //{ |
| | | // var copy = new GeneticParams(this.Level); |
| | | // copy.list_FitnessByItera = this.list_FitnessByItera?.ToList(); |
| | | // copy.ranges = this.ranges?.Select(range => new DRange(range.Min, range.Max))?.ToList(); |
| | | // copy.DLengths = this.DLengths?.ToList(); |
| | | // copy.accuracys = this.accuracys?.ToList(); |
| | | |
| | | // //copy.list_AtemtpArr = this.list_AtemtpArr?.ToArray(); |
| | | // copy.SolutionSaveName = this.SolutionSaveName; |
| | | // copy.populationSize = this.populationSize; |
| | | // copy.iterations = this.iterations; |
| | | // copy.populationSize_min = this.populationSize_min; |
| | | // copy.iterations_full = this.iterations_full; |
| | | // copy.Upopulations = this.Upopulations?.ToList(); |
| | | // copy.selectionMethod = this.selectionMethod; |
| | | // copy.optimizationMode = this.optimizationMode; |
| | | // copy.强制重计算 = this.强制重计算; |
| | | // copy.iterations_min = this.iterations_min; |
| | | // copy.accuracyNum = this.accuracyNum; |
| | | // copy.MaxRobot = this.MaxRobot; |
| | | // copy.RuningRobot = this.RuningRobot; |
| | | // copy.num = this.num; |
| | | // copy.BestOptValue = this.BestOptValue; |
| | | // copy.tolerance = tolerance==null?null: new DRange(this.tolerance.Min, this.tolerance.Max); |
| | | // copy.onFinished = this.onFinished; |
| | | // copy.onError = this.onError; |
| | | // copy.onReportProgress = this.onReportProgress; |
| | | // copy.setVars = this.setVars; |
| | | // copy.Db = this.Db; // Assuming Db is a reference type |
| | | // copy.SolutionDBHelper = this.SolutionDBHelper; // Assuming SolutionDBHelper is a reference type |
| | | // copy.GlobalConfig = this.GlobalConfig;//.DeepCopyByBin<GlobalConfig>(); // Assuming GlobalConfig has a copy constructor |
| | | // copy.isInited = this.isInited; |
| | | // copy.Quene = this.Quene; // Assuming Quene has a copy constructor |
| | | // copy.ID = this.ID; |
| | | // copy.isNeedOutput = this.isNeedOutput; |
| | | // copy.CurrentTotalDemand = this.CurrentTotalDemand; |
| | | |
| | | return copy; |
| | | } |
| | | // return copy; |
| | | //} |
| | | } |
| | | public class Result |
| | | { |
| | |
| | | |
| | | public System.Collections.Generic.Queue<WdnmoParam> RequestQueues; |
| | | public HashSet<Guid> RequestFinished; |
| | | public Dictionary<ulong, double> ResultHash; |
| | | public ConcurrentDictionary<ulong, double> ResultHash; |
| | | public int Level; |
| | | public Dictionary<Guid, double?> ResultDictionary; |
| | | public Dictionary<Guid, ChromosomeBase> ResultChrome; |
| | | public ConcurrentDictionary<Guid, double?> ResultDictionary; |
| | | public ConcurrentDictionary<Guid, ChromosomeBase> ResultChrome; |
| | | public int MissionQueneCount; |
| | | public List<calcParam> MissionQuene; |
| | | //public List<calcParam> MissionQuene; |
| | | public ConcurrentQueue<calcParam> MissionQuene; |
| | | public DateTime ScadaTime; |
| | | //public List<TimePoint> TimePoints; |
| | | public double BestResult=double.MaxValue; |
| | |
| | | } |
| | | if (MissionQuene != null) |
| | | { |
| | | MissionQuene.Clear(); |
| | | //MissionQuene.Clear(); |
| | | MissionQuene = null; |
| | | } |
| | | |
| | |
| | | |
| | | public List<SetVar> setVars = new List<SetVar>(); |
| | | |
| | | public int CurrentIndex = -1; |
| | | |
| | | } |
| | | public class SetVar |
| | | { |
| | |
| | | public List<variable> 变量 = new List<variable>(); |
| | | public List<variable> 表达式 = new List<variable>(); |
| | | public List<variable> 预处理插件 = new List<variable>(); |
| | | public variable ChromeFilter = null; |
| | | public variable GeneFilter = null; |
| | | [JsonIgnore] |
| | | public List<variable> 输出变量 |
| | | { |
| | | get |
| | |
| | | return all; |
| | | } |
| | | } |
| | | [JsonIgnore] |
| | | public List<variable> 接口变量 |
| | | { |
| | | get |
| | |
| | | return all; |
| | | } |
| | | } |
| | | [JsonIgnore] |
| | | public List<variable> 设定变量 |
| | | { |
| | | get |
| | |
| | | return all; |
| | | } |
| | | } |
| | | |
| | | [JsonIgnore] |
| | | public List<variable> 变量全集 |
| | | { |
| | | get |
| | |
| | | //[NonSerialized] |
| | | [JsonIgnore] |
| | | public Dictionary<int, variable> dict_ID { get; set; } |
| | | [JsonIgnore] |
| | | public Dictionary<string, variable> dict_Tag { get; private set; } |
| | | |
| | | //[NonSerialized] |
| | |
| | | dict_Name = new Dictionary<string, variable>(); |
| | | dict_ID=new Dictionary<int, variable>(); |
| | | dict_Tag=new Dictionary<string, variable>(); |
| | | dict_OutPut = new Dictionary<string, Ivariable[]>(); |
| | | //dict_OutPut = new Dictionary<string, Ivariable[]>(); |
| | | |
| | | 变量全集.ForEach(vv => { if (!string.IsNullOrEmpty(vv.Name) && !dict_Name.ContainsKey(vv.Name)) dict_Name.Add(vv.Name, vv); }); |
| | | 变量全集.ForEach(vv => { if (!dict_ID.ContainsKey(vv.ID)) dict_ID.Add(vv.ID, vv); }); |
| | | 变量全集.ForEach(vv => { if (!string.IsNullOrEmpty(vv.Tag) && !dict_Tag.ContainsKey(vv.Tag)) dict_Tag.Add(vv.Tag, vv); }); |
| | | |
| | | 输出变量.ForEach(vv => |
| | | //输出变量.ForEach(vv => |
| | | //{ |
| | | // if (!string.IsNullOrEmpty(vv.Tag) && !dict_OutPut.ContainsKey(vv.Tag)) |
| | | // dict_OutPut.Add(vv.Tag, new Ivariable[] { vv }); |
| | | // if (!string.IsNullOrEmpty(vv.expressString) &&!dict_OutPut.ContainsKey(vv.expressString)) |
| | | // dict_OutPut.Add(vv.expressString,new Ivariable[] { vv }); |
| | | //}); |
| | | |
| | | 预处理插件.ForEach(vv => |
| | | { |
| | | if (!string.IsNullOrEmpty(vv.Tag) && !dict_OutPut.ContainsKey(vv.Tag)) |
| | | dict_OutPut.Add(vv.Tag, new Ivariable[] { vv }); |
| | | if (!string.IsNullOrEmpty(vv.expressString) &&!dict_OutPut.ContainsKey(vv.expressString)) |
| | | dict_OutPut.Add(vv.expressString,new Ivariable[] { vv }); |
| | | if (vv.IndicatorType=="方案筛选器") |
| | | ChromeFilter = vv; |
| | | if (vv.IndicatorType == "基因筛选器") |
| | | GeneFilter = vv; |
| | | }); |
| | | |
| | | } |
| | |
| | | [Serializable] |
| | | public class variable: Ivariable |
| | | { |
| | | public static List<string> list_indicatorTypeName |
| | | public static List<string> list_indicatorTypeName |
| | | { |
| | | get |
| | | { |
| | | if (_list_indicatorTypeName == null) |
| | | if (_list_indicatorTypeName==null) |
| | | { |
| | | _list_indicatorTypeName = new List<string>() { "已知压力", "节点用水量", "节点用水模式", "水池水位", "水泵转速比", "管线阻力系数", "阀门开度", "水泵开关", "阀门开关", "管线开关", "管线直径", "管线长度", "总水量", "节点压力", "节点自由压力", "节点需水量", "节点标高", "节点水龄", "节点水质", "管线流量", "管线流速", "水头损失", "当前状态", "水泵能耗", "水泵开关", "水泵转速比", "初始及运行传参", "初始传参", "运行传参", "种群生成器", "方案筛选器", "计算前处理", "结果处理", "当量分配", "随机分配" }; |
| | | _list_indicatorTypeName =new List<string>() { "已知压力", "节点用水量", "节点用水模式", "水池水位", "水泵转速比", "管线阻力系数", "阀门开度", "水泵开关", "阀门开关", "管线开关", "管线直径", "管线长度", "总水量", "节点压力", "节点自由压力", "节点需水量", "节点标高", "节点水龄", "节点水质", "管线流量", "管线流速", "水头损失", "当前状态", "水泵能耗", "水泵开关", "水泵转速比", "初始化","初始及运行传参", "初始传参", "运行传参", "种群生成器", "方案筛选器", "基因筛选器", "计算前处理", "输出计算处理", "结果处理", "当量分配", "随机分配" }; |
| | | } |
| | | return _list_indicatorTypeName; |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | } |
| | | |
| | | private static List<string> _list_indicatorTypeName = null; |
| | | |
| | | public static List<string> listUsedInitValue = new List<string>() { "初始计算值", "变化值", "绝对变化值" }; |
| | | //public static List<string> list_输入值 = new List<string>() { "基准值(界面)", "定义值", "基准值(接口)", "模式系数(界面)", "模式系数(接口)" }; |
| | | public static HashSet<string> list_输入值 = new HashSet<string>() { "基准值(界面)", "定义值", "基准值(接口)", "模式系数(界面)", "模式系数(接口)" }; |
| | |
| | | public bool isInput |
| | | { |
| | | get; |
| | | private set; |
| | | set; |
| | | } = false; |
| | | public bool isNode { get; set; } |
| | | //public bool? isOutput; |
| | |
| | | public int arrgFuncType; |
| | | public string defaultExpress; |
| | | private int _indicatorType; |
| | | |
| | | public string IndicatorType |
| | | { |
| | | get |
| | | { |
| | | |
| | | if (_indicatorType<0) |
| | | { |
| | | return list_indicatorTypeName[0]; |
| | |
| | | { |
| | | return _Values; |
| | | } |
| | | private set |
| | | set |
| | | { |
| | | _Values = value; |
| | | } |
| | |
| | | } |
| | | set |
| | | { |
| | | isInput = true; |
| | | |
| | | if (value==null) |
| | | LogicValues[0]=double.NaN; |
| | | else |
| | |
| | | /// </summary> |
| | | public string Value_Set(int period,double value) |
| | | { |
| | | _Values[period] = value; |
| | | if (_Values!=null && period < _Values.Length) |
| | | _Values[period] = value; |
| | | return null; |
| | | string result = null; |
| | | double formatValue = value; |
| | |
| | | if (_level!=0) return _level; |
| | | int tempLevel = 1; |
| | | if (Vars!=null) |
| | | foreach (var v in Vars) |
| | | for (int i=0;i<Vars.Count;i++) |
| | | { |
| | | if (v!=this && v is variable vv && tempLevel < vv.Level + 1) tempLevel = vv.Level + 1; |
| | | var v = Vars[i]; |
| | | |
| | | if (!VarIndexs.ContainsKey(i) && v !=this && v is variable vv && tempLevel < vv.Level + 1) tempLevel = vv.Level + 1; |
| | | } |
| | | _level= tempLevel; |
| | | return _level; |
| | |
| | | } |
| | | |
| | | public string Tag { get; set; } |
| | | public string AnFrom { get; set; } |
| | | public string AnValue { get; set; } |
| | | public double MuRange { get; set; } |
| | | public double MuRate { get; set; } |
| | | |
| | | public override string ToString() |
| | | { |
| | |
| | | v.ObjType = this.ObjType; |
| | | v.logicType = this.logicType; |
| | | v.LogicValue = this.LogicValue; |
| | | v.LogicValues = this.LogicValues; |
| | | v.LogicValues = this.LogicValues.ToArray(); |
| | | v.Values_Set = this.Values.ToArray(); |
| | | v.小数位数 = this.小数位数; |
| | | v.defaultExpress=this.defaultExpress; |
| | | v.sort = this.sort; |
| | | v.isInput = this.isInput; |
| | | v.virturl = this.virturl; |
| | | v.doubleRange =new DRange( this.doubleRange); |
| | | if (this.doubleRange == null) v.doubleRange = null; |
| | | else v.doubleRange =new DRange( this.doubleRange); |
| | | v.accuracy = this.accuracy; |
| | | //v.Vars = this.Vars; |
| | | v.Name = this.Name; |
| | | v.modelObjectID = this.modelObjectID; |
| | | v.modelIndex = this.modelIndex; |
| | | v.PeriodCount = this.PeriodCount; |
| | | //v.PeriodCount = this.PeriodCount; |
| | | v.childSolution = this.childSolution; |
| | | v.childTag = this.childTag; |
| | | v.childType = this.childType; |
| | |
| | | v.objListString = this.objListString; |
| | | v.obj_Best=this.obj_Best; |
| | | v._level=this._level; |
| | | v.AnFrom=this.AnFrom; |
| | | v.AnValue=this.AnValue; |
| | | v.MuRange=this.MuRange; |
| | | v.MuRate=this.MuRate; |
| | | return v; |
| | | } |
| | | } |