数组在一定程度上可以代替 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