遗传算法求解带约束优化问题的处理办法

针对不满足约束染色体的处理对策

1、 直接标记为非法解,全部删去。相当于在种群中杀死所有的畸形个体。 问题:全部杀死,重新生成个体,直到满足约束,耗费时间很长。

2、 加高额的惩罚值。使得其在进化中快速淘汰。问题:耗时短,但是可能一直到迭代结束也无法找到合法解。

3、 加惩罚值的同时,不使用随机初始化,使用某种有策略的初始化。问题:需要知道问题的规则,并针对规则设计定制化的初始化算法。

例子

随机初始化:

1
2
3
4
5
def gen_chrom(num_order, num_seru):
sequence = np.random.permutation(list(range(1,num_order+1)))
assign = np.random.choice(range(1,num_seru+1), num_order)
x = np.concatenate([sequence, assign],axis=0)
return x

定制化初始化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
def gen_chrom(num_order, num_seru, data_seru):
sequence = np.random.permutation(list(range(1,num_order+1)))
process_able_matrix = np.zeros([num_seru,data_seru.shape[1]-1])
for i in range(num_seru):
for j in range(data_seru.shape[1]-1):
if np.isnan(data_seru.iloc[i][j+1][0]):
pass
else:
process_able_matrix[i,j] = j+1
process_able_list = [[int(value) for value in row if value != 0] for row in process_able_matrix]
# 找出所有的产品类型
product_types = set()
for machine in process_able_list:
product_types.update(machine)

# 创建一个包含每个产品类型可以在哪个机器加工的列表
product_to_machine = {product: [] for product in product_types}
for machine_index, machine in enumerate(process_able_list):
for product in machine:
product_to_machine[product].append(machine_index+1)

# 按产品类型排序并转换为列表
result = [product_to_machine[product] for product in sorted(product_to_machine)]
sequence = np.random.permutation(list(range(1,num_order+1)))
sequence_type = [data_order.iloc[i-1]['product type'] for i in sequence]
assign = [np.random.choice(result[sequence_type[i]-1]) for i in range(num_order)]
x = np.concatenate([sequence, assign],axis=0)
return x

效果比较

使用对策2的效果

图片未能加载!

使用对策3的效果

image-20240704204703410