parent_1_jobs = set(parent_1[job_ids[:factory_cutpoints[f]]])
时间: 2023-11-26 20:02:41 浏览: 23
这行代码是将 parent_1 中前 factory_cutpoints[f] 个基因作为一个集合 parent_1_jobs。其中 job_ids 是一个长度为 num_jobs 的数组,装了以 0~(num_jobs-1) 编号的作业。np.random.shuffle(job_ids) 是将 job_ids 随机打乱顺序,即随机生成一种作业调度顺序。然后通过切片 job_ids[:factory_cutpoints[f]] 取出前 factory_cutpoints[f] 个作业编号,即 parent_1 的前 factory_cutpoints[f] 个作业,将其转换为 set 类型并赋值给 parent_1_jobs。最后得到的 parent_1_jobs 是一个集合,里面装了 parent_1 中前 factory_cutpoints[f] 个作业的编号。
相关问题
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
这是一个遗传算法中的交叉操作函数,输入参数 population 是一个二维数组,每个元素都代表一个染色体,即工厂作业调度计划。函数返回两个子代染色体 child_1 和 child_2。具体操作是从 population 中随机选择两个染色体 parent_1 和 parent_2,然后按照随机生成的切割点 factory_cutpoints,将两个父代染色体进行切割。接着对每个工厂的切割部分进行基因交换,即将其中一个子代中属于另一个父代的基因替换掉,最终得到两个新的子代染色体。
def __init__(self,parent=None):
这是 Python 中的一个构造函数,用于初始化一个类的实例。通常情况下,构造函数的名称是 `__init__`,它有一个特殊的参数 `self`,它代表类的实例本身。
在这个具体的例子中,这个构造函数的参数 `parent` 可以为空,它表示这个类的实例可以没有父对象。在类的实例化过程中,这个构造函数将会被自动调用,用于初始化类的实例。如果在实例化时没有传递 `parent` 参数,则 `parent` 将被设置为 `None`。
在构造函数中,我们可以对类的属性进行初始化,也可以进行其他必要的操作,例如连接数据库、打开文件等。