lixiaojun
2022-11-23 b5c20e5143555a1bdd450a1e660216b90c93b6f1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
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;
        }
        
    }
}