slp遗传算法代码
遗传算法(Genetic Algorithm)是通过模拟生物进化过程来解决问题的一种随机优化算法。该算法可以应用于各种优化问题,并且具有全局优化能力、鲁棒性强等特点,被广泛应用于优化问题的解决中。下面将介绍SLP遗传算法的代码实现。
SLP遗传算法是一种求解单目标离散组合优化问题的遗传算法。其流程如下:
1. 随机生成一个种群
2. 对每个个体进行适应度计算
3. 选择操作:根据轮盘赌算法等选择方法选择优秀的个体,保留至下一代。
4. 交叉操作:从选择出的优秀个体中随机选取两个进行交叉,生成子代。
5. 变异操作:对子代进行变异操作,增加遗传的多样性。 6. 重复执行第2至第5步,直到满足终止条件。 以下是SLP遗传算法的代码实现: import random class SLP_GA():
def __init__(self, fit_func, pop_size=50,
chrom_len=10, max_iter=100, p_crossover=0.8, p_mutation=0.15):
\"\"\"
:param fit_func: 适应度函数 :param pop_size: 种群大小 :param chrom_len: 染色体长度 :param max_iter: 最大迭代次数 :param p_crossover: 交叉概率 :param p_mutation: 变异概率 \"\"\"
self.fit_func = fit_func self.pop_size = pop_size self.chrom_len = chrom_len self.max_iter = max_iter self.p_crossover = p_crossover self.p_mutation = p_mutation self.generation = [] # 当前种群 self.best_chrom = None # 最优个体
self.best_fitness = None # 最优适应度 def init_population(self): \"\"\"
初始化种群 \"\"\"
for i in range(self.pop_size):
chrom = [random.randint(0, 1) for _ in range(self.chrom_len)]
fit = self.fit_func(chrom)
self.generation.append((chrom, fit)) def selection(self): \"\"\" 选择操作 \"\"\"
total_fit = sum([fit for chrom, fit in self.generation])
select_prob = [fit / total_fit for chrom, fit in self.generation] # 计算每个个体被选择的概率
new_generation = []
for i in range(self.pop_size): # 轮盘赌算法选择优秀个体
choice = random.choices(self.generation, select_prob)[0]
new_generation.append(choice) self.generation = new_generation def crossover(self): \"\"\" 交叉操作 \"\"\"
new_generation = []
for i in range(self.pop_size // 2): # 随机选取两个个体进行交叉
chrom1, fit1 = random.choice(self.generation) chrom2, fit2 = random.choice(self.generation) if random.random() < self.p_crossover:
cross_pos = random.randint(1, self.chrom_len - 1) # 随机交叉点
new_chrom1 = chrom1[:cross_pos] + chrom2[cross_pos:]
new_chrom2 = chrom2[:cross_pos] + chrom1[cross_pos:]
new_generation.append((new_chrom1, self.fit_func(new_chrom1)))
new_generation.append((new_chrom2, self.fit_func(new_chrom2)))
else:
new_generation.append((chrom1, fit1)) new_generation.append((chrom2, fit2)) self.generation = new_generation def mutation(self): \"\"\" 变异操作 \"\"\"
for i in range(self.pop_size):
chrom, fit = self.generation[i] if random.random() < self.p_mutation: mut_pos = random.randint(0, self.chrom_len - 1) # 随机变异位
chrom[mut_pos] = 1 - chrom[mut_pos] # 异操作
self.generation[i] = (chrom, self.fit_func(chrom))
def evolve(self): \"\"\"
遗传算法进化过程 \"\"\"
self.init_population()
for i in range(self.max_iter): self.selection() self.crossover() self.mutation()
变 self.best_chrom, self.best_fitness = max(self.generation, key=lambda x: x[1])
def run(self): \"\"\"
运行函数,返回最终结果 \"\"\"
self.evolve()
return self.best_chrom, self.best_fitness # 示例应用
def knapsack(chrom):
# 物品重量、价值和背包容量
weights = [2, 2, 4, 6, 5, 8, 5, 11, 15] values = [4, 6, 8, 3, 5, 3, 7, 10, 13] w_limit = 30 w_total = 0 v_total = 0
for i in range(len(chrom)): if chrom[i] == 1:
w_total += weights[i] v_total += values[i] if w_total > w_limit: return 0 else:
return v_total
ga = SLP_GA(fit_func=knapsack)
print(()) # 输出最大价值及其对应的0/1序列