#define DEBUG_TIME1
|
using AForge;
|
using AForge.Genetic;
|
using Hydro.CommonBase;
|
using Hydro.HydraulicHelperNS;
|
using System;
|
using System.Collections.Generic;
|
using System.Numerics;
|
using System.Threading;
|
using System.Threading.Tasks;
|
//using WaterDistributioinManager;
|
|
|
namespace Hydro.ParrelControl
|
{
|
|
|
[Serializable]
|
public class OPTFunction : IFitnessFunctionDouble
|
{
|
Quene Quene;
|
int Level;
|
|
public enum Modes
|
{
|
Maximization,
|
Minimization
|
}
|
|
/// <summary>
|
/// ÿһά¶ÈµÄȡֵ·¶Î§Çø¼ä
|
/// </summary>
|
private DRange[] list_Range;
|
/// <summary>
|
/// ÿһά¶ÈµÄȡֵ·¶Î§Çø¼ä
|
/// </summary>
|
private double?[] list_Accuracy;
|
|
/// <summary>
|
/// ά¶ÈÊý
|
/// </summary>
|
private int COUNT_D;
|
|
|
|
/// <summary>
|
/// µ¥Î¬¶È³¤¶È
|
/// </summary>
|
private int[] Length_Ds;
|
///// <summary>
|
///// ÓÅѡģʽ£¨0ÊÇ×î´óÖµ£¬1ÊÇ×îСֵ£©
|
///// </summary>
|
//private Modes mode;
|
|
|
//Ôö¼ÓÒ»¸öÒÀÀµ¹ØÏµÊôÐÔ£¬ÓÃÓÚ¼ÆËã
|
public int[] Dependencies;
|
|
|
//public double Evaluate(BinaryChromo chromosome)
|
//{
|
// ReSet(chromosome);
|
// ChromosomeBase chromosome1 = chromosome as ChromosomeBase;
|
|
// lock (Quene.ResultChrome)
|
// {
|
// if (Quene.ResultChrome.ContainsKey(chromosome1.ID)) return 1;
|
// Quene.ResultChrome.Add(chromosome1.ID, chromosome1);
|
// }
|
// double[] array = Translate(chromosome1);
|
// chromosome1.AttemptArray = array;
|
|
|
// double num = OptimizationFunction(array, chromosome1.ID,chromosome);
|
// return 1;
|
// //if (mode != 0)
|
// //{
|
// // return 1.0 / num;
|
// //}
|
// return num;
|
//}
|
public double Evaluate(IChromosome chromosome)
|
{
|
//if (chromosome is BinaryChromo bi)
|
//{
|
// ReSet(bi);
|
//}
|
//ReSet(chromosome, param, wParam, gParam);
|
ChromosomeBase chromosome1 = chromosome as ChromosomeBase;
|
/*[CloudflightÐÞ¸Ä]2024-6-3
|
½âËø
|
*/
|
lock (Quene.ResultChrome)
|
{
|
if (Quene.ResultChrome.ContainsKey(chromosome1.ID)) return 1;
|
Quene.ResultChrome.Add(chromosome1.ID, chromosome1);
|
}
|
double[] array = Translate(chromosome1);
|
chromosome1.AttemptArray = array;
|
|
|
double num = OptimizationFunction(array, chromosome1.ID, chromosome);
|
return 1;
|
//if (mode != 0)
|
//{
|
// return 1.0 / num;
|
//}
|
return num;
|
}
|
|
public double[] Translate(IChromosome chromosome)
|
{
|
double[] result = new double[COUNT_D];
|
if (chromosome is BinaryChromo bi)
|
{
|
|
if (bi == null)
|
{
|
for (int i = 0; i < COUNT_D; i++)
|
{
|
result[i] = 1;
|
};
|
return result;
|
}
|
else if (bi.AttemptArray != null)
|
return bi.AttemptArray;
|
else
|
{
|
ulong value = bi.Value;//»ñÈ¡ÕûÊýÖµ
|
int length = bi.Length;//³¤¶È
|
BinaryNums bNum = new BinaryNums(value, length, ulong.MaxValue, 64);
|
|
for (int i = 0; i < COUNT_D; i++)
|
{
|
result[i] = bNum.GetDoubleValue1D(Length_Ds[i], list_Range[i], list_Accuracy[i]);
|
|
};
|
}
|
|
}
|
else if (chromosome is RandDoubleChromo)
|
{
|
RandDoubleChromo Rchromosome = chromosome as RandDoubleChromo;
|
result = Rchromosome.Value;
|
}
|
return result;
|
}
|
public BinaryChromo DisTranslate(double[] OriginValueList, LogicModelParams param, WdnmoParam wParam, GeneticParams gParam)
|
{
|
ulong value = 0;
|
int length = 0;
|
BinaryNums bNum = new BinaryNums(value, length, ulong.MaxValue, 64);
|
|
|
double[] result = new double[COUNT_D];
|
|
for (int i = COUNT_D - 1; i >= 0; i--)
|
{
|
bNum.AddBinary(OriginValueList[i], Length_Ds[i], list_Range[i]);
|
};
|
|
return new BinaryChromo(bNum.ulongValue, bNum.length,Level,param,wParam,gParam,this);
|
}
|
public void ReSet(BinaryChromo chromosome)
|
{
|
var arr = Translate(chromosome);
|
if (arr == null) return;
|
for (int i=0;i<arr.Length;i++)
|
{
|
//ÅжÏÊÇ·ñÓÐÒÀÀµÏî
|
if (Dependencies[i]>=0 && arr[Dependencies[i]]==0)
|
{
|
arr[i] = list_Range[i].Min;
|
}
|
//if (item == 1) return;
|
}
|
var source = DisTranslate(arr, chromosome.param, chromosome.wParam, chromosome.gParam);
|
chromosome.Level = source.Level;
|
chromosome.ID = source.ID;
|
chromosome.setval(source.getval());
|
|
}
|
|
private static DRange[] DR(List<DRange> drs)
|
{
|
var DRS = new DRange[drs.Count];
|
for(int i=0;i<DRS.Length;i++)
|
{
|
DRS[i] = new DRange(drs[i].Min, drs[i].Max);
|
|
}
|
return DRS;
|
|
}
|
|
//public OptimizationFunctionXDs(DRange[] listRange, int[] Length_Ds, double?[] list_Accuracy)
|
//{
|
// this.list_Range = listRange;
|
// COUNT_D = listRange.Length;
|
// this.Length_Ds = Length_Ds;
|
// this.list_Accuracy = list_Accuracy;
|
//}
|
//LogicModelParams param;
|
// public OPTFunction( LogicModelParams param,GeneticParams gParam)
|
// : base(DR(gParam.ranges) , gParam.DLengths.ToArray(), gParam.accuracys.ToArray())
|
//{
|
|
|
|
// Quene = gParam.Quene;
|
// Level=gParam.Level;
|
// //this.param = param;
|
|
// }
|
public OPTFunction( LogicModelParams param,GeneticParams gParam)
|
{
|
|
this.list_Range = DR(gParam.ranges);
|
|
this.Length_Ds = gParam.DLengths.ToArray();
|
COUNT_D = Length_Ds.Length;
|
this.list_Accuracy = gParam.accuracys.ToArray();
|
|
Quene = gParam.Quene;
|
Level=gParam.Level;
|
//this.param = param;
|
|
}
|
|
private void sendCalc(calcParam param)
|
{
|
/*[CloudflightÐÞ¸Ä]2024-6-3
|
½âËø
|
*/
|
#if DEBUG_TIME
|
var time = DateTime.Now;
|
#endif
|
|
|
lock (Quene.ResultDictionary)
|
{
|
if (Quene.ResultDictionary.ContainsKey(param.ID)) return;
|
Quene.ResultDictionary.Add(param.ID, null);
|
}
|
|
/*[CloudflightÐÞ¸Ä]2024-6-3
|
½âËø
|
*/
|
lock (Quene.MissionQuene)
|
{
|
Quene.MissionQuene.Add(param);
|
//Quene.MissionQueneCount++;
|
}
|
#if DEBUG_TIME
|
HydraulicHelper.TimeSet["Ìí¼Ó¼ÆËãÈÎÎñ"]+=(DateTime.Now-time).TotalSeconds;
|
HydraulicHelper.TimeSetCount["Ìí¼Ó¼ÆËãÈÎÎñ"]++;
|
#endif
|
|
|
}
|
//private double WaitCalcResult(Guid ID)
|
//{
|
// while (Quene.ResultDictionary.ContainsKey(ID) && Quene.ResultDictionary[ID] ==null)
|
// {
|
// Thread.Sleep(20);
|
// }
|
// return Quene.ResultDictionary[ID] ??0;
|
//}
|
/// <summary>
|
/// Ä¿±êº¯Êý¶¨Òå
|
/// </summary>
|
/// <param name="array">Ë®±ÃƵÂʵÄ×éºÏ</param>
|
/// <returns></returns>
|
public double OptimizationFunction(double[] array,Guid ID, IChromosome chromosome)
|
{
|
//List<ModelOutputNode> modelOutputNodes = null;
|
//List<ModelOutputLink> modelOutputLinks = null;
|
//List<double> pumpFlows = null;
|
//string result = null;
|
//double press;
|
//double energe;
|
|
|
var cParam = new calcParam();
|
cParam.ID = ID;
|
cParam.vars = array;
|
cParam.chromosome = chromosome;
|
sendCalc(cParam);
|
return 0;
|
|
|
|
//if (array.Length > 2) Log.Add($"×Ó·½°¸¼ÆË㣬ÅÉ·¢¼ÆËãÏß³Ì{ID}£¬µ±Ç°ÈÎÎñÊýÁ¿{Quene.MissionQuene.Count}¸ö");
|
|
//if (array.Length > 2) Log.Add("×Ó·½°¸¼ÆË㣬·µ»Ø¼ÆËãÏ߳̽á¹û" + ID.ToString());
|
//double resultValue = 0;
|
//string result = EPAHelper.GetHelper().GetResult(cParam, out resultValue);
|
//var rValue = resultValue;
|
|
|
|
|
//var rValue = WaitCalcResult(cParam.ID);
|
//return rValue;
|
|
|
}
|
|
|
|
|
}
|
|
|
}
|