using Accord;
|
using Accord.Genetic;
|
using System.Collections.Generic;
|
|
namespace IStation
|
{
|
public abstract class OptimizationFunctionXD : IFitnessFunction
|
{
|
public enum Modes
|
{
|
Maximization,
|
Minimization
|
}
|
|
/// <summary>
|
/// 每一维度的取值范围区间
|
/// </summary>
|
private DoubleRange[] list_Range;
|
/// <summary>
|
/// 维度数
|
/// </summary>
|
private int COUNT_D;
|
/// <summary>
|
/// 单维度长度
|
/// </summary>
|
private int Length_D;
|
/// <summary>
|
/// 优选模式(0是最大值,1是最小值)
|
/// </summary>
|
private Modes mode;
|
|
public DoubleRange[] ListRange
|
{
|
get
|
{
|
return list_Range;
|
}
|
set
|
{
|
list_Range = value;
|
}
|
}
|
|
|
|
public Modes Mode
|
{
|
get
|
{
|
return mode;
|
}
|
set
|
{
|
mode = value;
|
}
|
}
|
|
public OptimizationFunctionXD(DoubleRange[] listRange,int Length_D)
|
{
|
this.list_Range = listRange;
|
COUNT_D = listRange.Length;
|
this.Length_D = Length_D;
|
}
|
|
public double Evaluate(IChromosome chromosome)
|
{
|
double[] array = Translate(chromosome);
|
double num = OptimizationFunction(array);
|
if (mode != 0)
|
{
|
return 1.0 / num;
|
}
|
return num;
|
}
|
|
public double[] Translate(IChromosome chromosome)
|
{
|
//ulong value = ((BinaryChromosome)chromosome).Value;//获取整数值
|
//int length = ((BinaryChromosome)chromosome).Length;//长度
|
//int num = length / 2;//获取一半的长度
|
//int num2 = length - num;
|
//ulong num3 = ulong.MaxValue >> 64 - num;//相对最大长度
|
//ulong num4 = ulong.MaxValue >> 64 - num2;//相对最大长度
|
//double num5 = value & num3;//取值的且值
|
//double num6 = value >> num;
|
//return new double[2]
|
//{
|
// num5 * rangeX.Length / (double)num3 + rangeX.Min,
|
// num6 * rangeY.Length / (double)num4 + rangeY.Min
|
//};
|
|
|
|
|
ulong value = ((BinaryChromosome)chromosome).Value;//获取整数值
|
int length = ((BinaryChromosome)chromosome).Length;//长度
|
BinaryNum bNum = new BinaryNum(value,length, ulong.MaxValue,64);
|
|
|
double[] result = new double[COUNT_D];
|
|
for (int i=0;i<COUNT_D;i++)
|
{
|
result[i] = bNum.GetValue1D(Length_D, list_Range[i]);
|
};
|
|
return result;
|
}
|
|
public abstract double OptimizationFunction(double[] array);
|
}
|
class BinaryNum
|
{
|
/// <summary>
|
/// 当前数据的值
|
/// </summary>
|
ulong value;
|
/// <summary>
|
/// 当前数据的长度
|
/// </summary>
|
int length;
|
|
/// <summary>
|
/// 数据类型的最大值
|
/// </summary>
|
ulong MaxValue;
|
/// <summary>
|
/// 数据类型的最大长度
|
/// </summary>
|
int MaxLength;
|
|
|
public double GetValue1D(int length_D,DoubleRange range)
|
{
|
if (length - length_D < 0) return -1;
|
int length_Remain = length - length_D;//获取剩余的长度
|
ulong MaxValue_1D = MaxValue >> MaxLength - length_D;//num3是取8位二进制的最大值(得到每一个维度的最大长度)
|
double value_1D = value & MaxValue_1D;//取最后8位二进制
|
ulong value_Remain = value >> length_D;//取剩余位数的值
|
|
|
length = length_Remain;
|
value = value_Remain;
|
|
|
return range.Length * value_1D / (double)MaxValue_1D + range.Min;
|
}
|
public BinaryNum(ulong value,int length,ulong MaxValue,int MaxLength)
|
{
|
this.length = length;
|
this.MaxValue = MaxValue;
|
this.value = value;
|
this.MaxLength = MaxLength;
|
}
|
|
}
|
}
|