数组在一定程度上可以代替 for 循环实行并行处理,实现矢量化加速。

在工作过程中,遇到 "遗传算法如果因为意外情况中断了,如何恢复?" 的问题。

首先,需要记录优化结果对应的最优解.

然后,最优解编码后用于代替随机初始化基因序列。

这个过程为了实现矢量化并行加速,需要将输入的数组传递进编码系统进行编码处理。

代码

以下代码展示的参数均为数组形式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def real2gray(lb, ub, precision, x):
len_single_Chrom = int(np.ceil(np.log2((ub-lb)/precision+1)))
y = np.round((x-lb)/precision)
bin_list=[]
bin_offset = []
bin_offset.append(np.zeros(len(y)))
for i in range(len_single_Chrom):
binary_list = np.logspace(start=(len_single_Chrom-1-i),stop=0,base=2,num=(len_single_Chrom-i))
binary_array = np.cumsum(binary_list)
one_mode = ((y >= (2**(len_single_Chrom-i-1))) & (binary_array[0] <= y))
bin = np.where(one_mode, 1 , 0)
bin_list.append(bin)
bin_offset.append(bin)
y = np.where(y - (2**(len_single_Chrom-i-1))>=0, y - (2**(len_single_Chrom-i-1)),y)
bin_list = np.array(bin_list).T
bin_offset = np.array(bin_offset[:-1]).T
gray_v = np.where(bin_list==bin_offset, 0, 1)
return gray_v

改进

上述代码中 len_single_Chrom 为数字,进一步改进成数组。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def real2gray(len_single_Chrom, init_X, lb, ub, precision):
y = np.round((init_X-lb)/precision)
bin_list=[]
bin_offset = []
bin_offset.append(np.zeros(len(y)))
while not (len_single_Chrom==0).all() :
binary_list = np.logspace(start=(len_single_Chrom-1),stop=0,base=2,num=np.max(len_single_Chrom))
binary_array = binary_list.cumsum(axis=0)
one_mode = ((y >= (2**(len_single_Chrom-1))) & (binary_array[0] <= y))
bin = np.where(one_mode, 1 , 0)
bin_list.append(bin)
bin_offset.append(bin)
y = np.where(y - (2**(len_single_Chrom-1))>=0, y - (2**(len_single_Chrom-1)),y)
len_single_Chrom = np.int64(np.where(len_single_Chrom>0, len_single_Chrom-1, 0))
bin_list = np.array(bin_list).T
bin_offset = np.array(bin_offset[:-1]).T
gray_v = np.where(bin_list==bin_offset, 0, 1)
return gray_v

这个问题的解决对于多阶段优化也非常重要。

⚓ Carl Zhao
🏢 逍遥科技有限公司
💭 曾经也是追光少年,然而少年归来已不再是少年,但依然在追光的路上。
📧 邮箱:1005513510@qq.com