def crossover(population): parent_1, parent_2 = random.sample(population, 2) child_1 = parent_1.copy() child_2 = parent_2.copy() factory_cutpoints = np.random.randint(1, num_jobs, size=num_factories) for f in range(num_factories): job_ids = np.arange(num_jobs) np.random.shuffle(job_ids) parent_1_jobs = set(parent_1[job_ids[:factory_cutpoints[f]]]) parent_2_jobs = set(parent_2[job_ids[factory_cutpoints[f]:]]) child_1_jobs = [job for job in child_1 if job not in parent_2_jobs] child_2_jobs = [job for job in child_2 if job not in parent_1_jobs] child_1_jobs.extend([job for job in parent_2 if job not in child_1_jobs]) child_2_jobs.extend([job for job in parent_1 if job not in child_2_jobs]) child_1[child_1 == f] = np.array([child_1_jobs.index(job) + num_jobs*f for job in range(num_jobs)]) child_2[child_2 == f] = np.array([child_2_jobs.index(job) + num_jobs*f for job in range(num_jobs)]) return child_1, child_2
时间: 2024-02-26 17:55:08 浏览: 100
GA.zip_comparer1j_door2t2_遗传算法
这是一个遗传算法中的交叉操作函数,输入参数 population 是一个二维数组,每个元素都代表一个染色体,即工厂作业调度计划。函数返回两个子代染色体 child_1 和 child_2。具体操作是从 population 中随机选择两个染色体 parent_1 和 parent_2,然后按照随机生成的切割点 factory_cutpoints,将两个父代染色体进行切割。接着对每个工厂的切割部分进行基因交换,即将其中一个子代中属于另一个父代的基因替换掉,最终得到两个新的子代染色体。
阅读全文