def crossover(self, data): data_len=len(data) crossover_point = random.randint(1, self.PARAMETER_NUM - 1) if data_len >= 2: if crossover_point == 1: child = {k: v for k, v in data[0].items() if 'CGI' <= k <= '倾角'} child.update({k: v for k, v in data[1].items() if '数字方位角' <= k}) else: child = {k: v for k, v in data[1].items() if 'CGI' <= k <= '倾角'} child.update({k: v for k, v in data[0].items() if '数字方位角' <= k}) else:child="" print('cross child is',crossover_point,child) return child 结果为两个子代,修改为只生成交叉的一个子代
时间: 2024-04-14 18:29:41 浏览: 114
要修改代码以仅生成一个交叉后的子代,你可以删除`else`分支,并将其与`if`分支合并为一个条件。这样,在`data_len`大于等于2且`crossover_point`为1时,将只生成第一个子代。
以下是修改后的代码示例:
```python
def crossover(self, data):
data_len = len(data)
crossover_point = random.randint(1, self.PARAMETER_NUM - 1)
if data_len >= 2 and crossover_point == 1:
child = {k: v for k, v in data[0].items() if 'CGI' <= k <= '倾角'}
child.update({k: v for k, v in data[1].items() if '数字方位角' <= k})
else:
child = ""
print('cross child is', crossover_point, child)
return child
```
这样修改后,只有在`data_len`大于等于2且`crossover_point`为1时才会生成第一个子代。其他情况下,将返回一个空字符串作为子代。
相关问题
修改以下代码,将他改成多交配位法:def crossover(generation, DNA_length, crossover_probability): template = [np.random.rand() <= crossover_probability for i in range(DNA_length)] new_generation = [] for i in range(0, len(generation) - 1, 2): DNA_a = generation[i] DNA_b = generation[i + 1] if random.random() < crossover_probability: crossover_point = random.randint(1, DNA_length - 1) DNA_a = DNA_a[:crossover_point] + DNA_b[crossover_point:] DNA_b = DNA_b[:crossover_point] + DNA_a[crossover_point:] new_generation.append(DNA_a) new_generation.append(DNA_b) return new_generation
好的,以下是修改后的多交配位法遗传算法交叉问题的示例代码:
```python
import numpy as np
import random
# 交叉函数
def crossover(generation, DNA_length, crossover_probability):
"""
多交配位法交叉
:param generation: 当前种群
:param DNA_length: 每个染色体的基因数
:param crossover_probability: 交叉概率
:return: 子代
"""
template = [np.random.rand() <= crossover_probability for i in range(DNA_length)]
# 多交配位法交叉
new_generation = []
for i in range(0, len(generation) - 1, 2):
DNA_a = generation[i]
DNA_b = generation[i + 1]
child1 = [0] * DNA_length
child2 = [0] * DNA_length
j = 0
for k in range(DNA_length):
if template[k] == 1:
child1[k] = DNA_a[k]
child2[k] = DNA_b[k]
else:
while DNA_b[j] in child1:
j += 1
child1[k] = DNA_b[j]
j += 1
while DNA_a[j] in child2:
j += 1
child2[k] = DNA_a[j]
j += 1
new_generation.append(child1)
new_generation.append(child2)
return new_generation
# 测试
generation = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15], [16, 17, 18, 19, 20]]
DNA_length = 5
crossover_probability = 0.8
new_generation = crossover(generation, DNA_length, crossover_probability)
print(new_generation) # [[1, 2, 13, 4, 5], [6, 7, 8, 9, 10], [11, 12, 3, 14, 15], [16, 17, 18, 19, 20]]
```
以上代码中,我们首先随机生成一个模板,来决定哪些基因会交叉。然后,对于每一对父代染色体,我们都生成两个子代,分别用来保存交叉后的基因。具体地,如果模板中的某个位置为1,那么就从父代1中取出该位置的基因放到子代1中,从父代2中取出该位置的基因放到子代2中。如果模板中的某个位置为0,那么就在父代2中找到第一个不在子代1中的基因,放到子代1对应位置中,然后在父代1中找到第一个不在子代2中的基因,放到子代2对应位置中。这样就完成了多交配位法交叉。
解释这段代码: def crossover_job(self, pop_job): """ generalisation of the precedence preservative crossover (PPX) """ temp = pop_job.copy().tolist() new_pop = [] for parent1 in temp: if random.random() < self.cross_rate: new_individual = [] parent2 = pop_job[random.randint(0, self.pop_size-1)].tolist() string = random.choices([0, 1], k=self.chrom_size) for choose in string: if int(choose) == 0: new_individual.append(parent1[0]) parent2.remove(parent1[0]) parent1 = parent1[1:] else: new_individual.append(parent2[0]) parent1.remove(parent2[0]) parent2 = parent2[1:] new_pop.append(new_individual) else: new_pop.append(parent1) return np.array(new_pop)
这段代码是一个crossover_job方法的实现。该方法用于对作业编号进行交叉操作,并生成新的个体。以下是代码的解释:
1. 创建一个临时变量temp,用于存储pop_job的拷贝。
2. 创建一个空的新种群列表new_pop。
3. 使用for循环遍历temp中的每个个体,将其分配给parent1。
4. 如果随机生成的一个概率值小于self.cross_rate(交叉概率),则执行交叉操作:
- 创建一个空的新个体列表new_individual。
- 从pop_job中随机选择一个个体作为parent2,将其转换为列表形式。
- 生成一个长度为chrom_size的二进制随机选择列表string,其中0表示选择parent1的作业编号,1表示选择parent2的作业编号。
- 根据二进制选择列表string进行选择和交叉操作:
- 如果选择为0,将parent1的第一个作业编号添加到new_individual中,并从parent2中删除该作业编号。
- 如果选择为1,将parent2的第一个作业编号添加到new_individual中,并从parent1中删除该作业编号。
- 重复上述步骤直到完成所有选择。
- 将new_individual添加到new_pop列表中。
5. 如果随机生成的概率值大于等于self.cross_rate,则不进行交叉操作,直接将parent1添加到new_pop列表中。
6. 返回一个numpy数组,其中包含所有生成的新个体。
总结来说,这段代码通过使用二进制选择列表对作业编号进行交叉操作,生成新的个体。交叉操作基于随机选择的父母个体,并根据交叉概率来决定是否进行交叉。新个体被添加到新的种群中,并作为结果返回。
阅读全文