/// <summary> /// 将当前的变换器设计方案集合转化为系统设计方案集合 /// </summary> /// <param name="configs">额外配置信息</param> public void Transfer(string[] configs) { ConverterDesignData now = head; while (now != null) { List <string> newConfigs = new List <string> { now.Efficiency.ToString(), now.Volume.ToString(), now.Cost.ToString() }; foreach (string config in configs) { newConfigs.Add(config); } foreach (string config in now.Configs) { newConfigs.Add(config); } now.Configs = newConfigs.ToArray(); now = now.Next; } Filter(); }
/// <summary> /// 将当前设计方案集合与另一设计方案集合组合成新的设计方案集合,并更新当前设计方案集合 /// </summary> /// <param name="designList">另一个设计方案集合</param> public void Combine(ConverterDesignList designList) { if (head == null) { head = designList.head; size = designList.size; } else { ConverterDesignList newList = new ConverterDesignList(); ConverterDesignData p = head; while (p != null) { ConverterDesignData q = designList.head; while (q != null) { string[] configs = new string[p.Configs.Length + q.Configs.Length]; p.Configs.CopyTo(configs, 0); q.Configs.CopyTo(configs, p.Configs.Length); newList.Add(p.Efficiency + q.Efficiency - 1, p.Volume + q.Volume, p.Cost + q.Cost, configs); q = q.Next; } p = p.Next; } head = newList.head; size = newList.size; } }
/// <summary> /// 添加一个设计,并进行Pareto改进 /// </summary> /// <param name="efficiency">效率</param> /// <param name="volume">体积</param> /// <param name="cost">成本</param> /// <param name="configs">配置信息</param> public void Add(double efficiency, double volume, double cost, string[] configs) { if (!IsAll) //若不记录全部设计,则进行Pareto改进 { //Pareto改进 ConverterDesignData now = head; while (now != null) { //若当前Pareto集合中存在一个点,可以支配新添加的点,则新添加的点不为Pareto最优解,不需要添加进集合 if (now.Efficiency >= efficiency && now.Volume <= volume && now.Cost <= cost) { return; } //若新添加的点支配集合中存在的点,则将被支配的点剔除 if (now.Efficiency <= efficiency && now.Volume >= volume && now.Cost >= cost) { Delete(now); } now = now.Next; } } //将该点添加进集合中 Insert(new ConverterDesignData() { Efficiency = efficiency, Volume = volume, Cost = cost, Configs = configs }); }
/// <summary> /// 在链表头部插入一个节点 /// </summary> /// <param name="data"></param> private void Insert(ConverterDesignData node) { if (head != null) { head.Prev = node; node.Next = head; } head = node; size++; }
/// <summary> /// 合并另一个设计方案集合 /// </summary> /// <param name="designList">另一个设计方案集合</param> public void Merge(ConverterDesignList designList) { ConverterDesignData now = designList.head; while (now != null) { Add(now.Efficiency, now.Volume, now.Cost, now.Configs); now = now.Next; } }
/// <summary> /// 获取变换器设计方案数据(数组形式) /// </summary> /// <returns>变换器设计方案数据</returns> public IConverterDesignData[] GetData() { IConverterDesignData[] data = new IConverterDesignData[size]; ConverterDesignData now = head; for (int i = 0; i < size; i++) { data[i] = now; now = now.Next; } return(data); }
/// <summary> /// 得到对应编号的配置信息 /// </summary> /// <param name="id">编号</param> /// <returns>配置信息</returns> public string[] GetConfigs(int id) { if (id >= size) { return(null); } ConverterDesignData now = head; while (id > 0) { id--; now = now.Next; } return(now.Configs); }
/// <summary> /// 删除一个节点 /// </summary> /// <param name="data"></param> private void Delete(ConverterDesignData node) { if (node.Prev != null) { node.Prev.Next = node.Next; } else { head = node.Next; } if (node.Next != null) { node.Next.Prev = node.Prev; } node.Prev = null; node.Next = null; size--; }
/// <summary> /// 去除效率低于90%的设计方案 /// </summary> public void Filter() { ConverterDesignData now = head; List <ConverterDesignData> list = new List <ConverterDesignData>(); while (now != null) { if (now.Efficiency < 0.9) { list.Add(now); } now = now.Next; } foreach (ConverterDesignData design in list) { Delete(design); } }
/// <summary> /// 得到效率最高设计的配置信息 /// </summary> /// <returns>配置信息</returns> public string[] GetMaxEfficiencyConfigs() { if (size <= 0) { return(null); } ConverterDesignData max = head; ConverterDesignData now = max.Next; while (now != null) { if (now.Efficiency > max.Efficiency) { max = now; } now = now.Next; } return(max.Configs); }