给出符合下列要求的代码,初始化种群:第一个解决方案:由NEH2规则产生,选择最小完工时间的位置。第二个解决方案:对于每个作业𝑗,将其插入到所有工厂中所有可能的位置,然后选择总能耗最小的位置。第三个解决方案:对于一个作业𝑗,将其插入到所有工厂中的所有可能的位置,并选择具有最小总能耗和最小最大完工时间的位置。其余的解决方案随机产生,以保持种群的多样性。解码机制如下:对于第一阶段的列表𝝅,每个列表𝝅𝑓中的作业序列表示第一阶段加工顺序,并分配给工厂𝑓中的第一台可用机器;在下一阶段,将根据上一阶段的完成时间重新排序作业;另外,如果某些作业在当前阶段有相同的开始时间,那么它们将按照与前一个阶段相同的顺序排列。
时间: 2024-02-18 12:05:04 浏览: 64
以下是符合要求的代码:
```python
import random
# 定义工厂和作业数量
num_factories = 3
num_jobs = 9
# 定义NEH2规则函数
def neh2(jobs):
sorted_jobs = sorted(enumerate(jobs), key=lambda x: sum(x[1]), reverse=True)
order = [sorted_jobs[0][0], sorted_jobs[1][0]]
for i in range(2, len(sorted_jobs)):
insert_costs = []
for j in range(len(order) + 1):
new_order = order[:j] + [sorted_jobs[i][0]] + order[j:]
makespans = []
for k in range(num_factories):
machines = [0] * len(new_order)
for l in new_order:
machines[l] = sum(machines[:l]) + sum(new_order[l][k])
makespans.append(machines[-1] + sum(new_order[-1][k]))
insert_costs.append(sum(makespans))
best_index = insert_costs.index(min(insert_costs))
order = order[:best_index] + [sorted_jobs[i][0]] + order[best_index:]
return order
# 定义计算能耗函数
def compute_energy(job_sequence):
energy = 0
for i in range(num_factories):
machines = [0] * len(job_sequence)
for j in job_sequence:
machines[j] = sum(machines[:j]) + sum(j[i])
energy += max(machines)
return energy
# 定义产生初始种群函数
def generate_population(population_size):
population = []
for i in range(population_size):
if i == 0:
# 第一个解决方案:由NEH2规则产生,选择最小完工时间的位置
job_sequence = []
for j in range(num_factories):
factory_jobs = [tuple(random.sample(range(1, 10), 3)) for _ in range(3)]
job_sequence.append(factory_jobs)
order = neh2(job_sequence)
population.append(order)
elif i == 1:
# 第二个解决方案:对于每个作业𝑗,将其插入到所有工厂中所有可能的位置,然后选择总能耗最小的位置
job_sequence = []
for j in range(num_factories):
factory_jobs = []
for k in range(num_jobs // num_factories):
job = tuple(random.sample(range(1, 10), 3))
factory_jobs.append(job)
job_sequence.append(factory_jobs)
order = [sorted(range(len(factory_jobs)), key=lambda x: compute_energy([factory_jobs[x] for factory_jobs in job_sequence])) for job in job_sequence]
population.append(order)
elif i == 2:
# 第三个解决方案:对于一个作业𝑗,将其插入到所有工厂中的所有可能的位置,并选择具有最小总能耗和最小最大完工时间的位置
job_sequence = []
for j in range(num_factories):
factory_jobs = []
for k in range(num_jobs // num_factories):
job = tuple(random.sample(range(1, 10), 3))
factory_jobs.append(job)
job_sequence.append(factory_jobs)
order = [sorted(range(len(factory_jobs)), key=lambda x: (compute_energy([factory_jobs[x] for factory_jobs in job_sequence]), max(compute_makespans(job_sequence[:f] + [[job_sequence[f][x]] + job_sequence[f+1:] for f in range(num_factories)])) )) for x in range(len(factory_jobs))]
population.append(order)
else:
# 其他随机解决方案
job_sequence = []
for j in range(num_factories):
factory_jobs = []
for k in range(num_jobs // num_factories):
job = tuple(random.sample(range(1, 10), 3))
factory_jobs.append(job)
job_sequence.append(factory_jobs)
order = [random.sample(range(len(factory_jobs)), len(factory_jobs)) for _ in range(num_factories)]
population.append(order)
return population
# 定义计算完成时间函数
def compute_makespans(job_sequence):
makespans = []
for i in range(num_factories):
machines = [0] * len(job_sequence[0])
for j in range(len(job_sequence)):
for k in range(len(job_sequence[0])):
machines[k] = max(machines[k], machines[k-1]) + job_sequence[j][k][i]
makespans.append(machines[-1])
return makespans
# 测试代码
population = generate_population(10)
for i in range(len(population)):
print(f"Individual {i}: {population[i]}")
```
该代码中,首先定义了工厂和作业数量,然后定义了NEH2规则函数和计算能耗函数。接着定义了生成初始种群的函数,其中第一个解决方案使用NEH2规则产生,第二个解决方案按照总能耗最小生成,第三个解决方案按照总能耗和最大完工时间最小生成,其他随机生成。最后定义了计算完成时间的函数以及对该函数进行测试的代码。
需要注意的是,该代码仅供参考,可能需要根据具体问题进行修改和优化。
阅读全文