使用遗传算法解决图着色问题,学生会面试题目100及最佳答案

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Python全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img



既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Python知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024c (备注Python)
img

正文

def getViolationsCount(self,colorArrangement):

“”"

计算给定颜色排列中违反颜色的次数

“”"

if len(colorArrangement) != self.len():

raise ValueError("size of color arrangement should be equal to ", self.len())

violations = 0

遍历每对节点,查找它们之间是否存在链接并使用相同的颜色

for i in range(len(colorArrangement)):

for j in range(i + 1,len(colorArrangement)):

if self.adjMatrix[i,j]:

if colorArrangement[i] == colorArrangement[j]:

violations += 1

return violations

def getNumberOfColors(self, colorArrangement):

“”"

计算给定颜色排列使用的颜色数量

“”"

return len(set(colorArrangement))

def plotGraph(self, colorArrangement):

“”"

绘制具有根据给定颜色排列进行着色的图

“”"

if len(colorArrangement) != self.len():

raise ValueError("size of color list should be equal to ",self.len())

创建唯一色列表

colorList = list(set(colorArrangement))

创建实际颜色列表

colors = plt.cm.rainbow(np.linspace(0,1,len(colorList)))

遍历节点,并根据颜色组合分配颜色

colorMap = []

for i in range(self.len()):

color = colors[colorList.index(colorArrangement[i])]

colorMap.append(color)

对相应节点进行着色

nx.draw_kamada_kawai(self.graph,node_color=colorMap,with_labels=True)

return plt

遗传算法解决图着色问题


常量及遗传算子定义

  1. 导入所需库

from deap import base

from deap import creator

from deap import tools

import random

import numpy as np

from matplotlib import pyplot as plt

import seaborn as sns

import networkx as nx

  1. 硬约束惩罚因子

HARD_CONSTRAINT_PENALTY = 10

  1. 基因算法常量

POPULATION_SIZE = 100

P_CROSSOVER = 0.9

P_MUTATION = 0.1

MAX_GENERATIONS = 100

HALL_OF_FAME_SIZE = 10

MAX_COLORS = 10

  1. 实例化图着色问题,该实例具有要解决的所需NetworkX图,以及hardConstraintPenalty的所需值

gcp = GraphColoringProblem(nx.petersen_graph(),HARD_CONSTRAINT_PENALTY)

  1. 定义最小化适应度策略

creator.create(“FitnessMin”,base.Fitness,weights=(-1.0,))

  1. .由于解由代表参与颜色的整数值列表表示,因此需要定义一个随机生成器,该生成器将创建介于0和颜色数减1之间的整数。每个整数代表一种颜色。然后,定义解(个体)创建器,该创建器将生成随机整数的列表,列表的长度与给定图的长度匹配。最后,定义创建整个群体的运算符:

creator.create(“Individual”,list,fitness=creator.FitnessMin)

toolbox = base.Toolbox()

toolbox.register(“Integers”,random.randint,0,MAX_COLORS - 1)

toolbox.register(“individualCreator”,tools.initRepeat,creator.Individual,toolbox.Integers,len(gcp))

toolbox.register(“populationCreator”,tools.initRepeat,list,toolbox.individualCreator)

  1. 通过调用GraphColoringProblem类的getCost()方法,将适应度评估函数设置为计算解的违反颜色数和使用的颜色数量

def getCost(individual):

return gcp.getCost(individual),

toolbox.register(“evaluate”,getCost)

  1. 定义遗传算子

toolbox.register(“select”,tools.selTournament,tournsize=2)

toolbox.register(“mate”,tools.cxTwoPoint)

mutUniformInt运算符,将给定的整数更改为允许范围内的另一个随机生成的整数

toolbox.register(“mutate”,tools.mutUniformInt,low=0,up=MAX_COLORS - 1,indpb=1.0/len(gcp))

使用精英主义策略

使用名人堂可以用来保留进化过程中种群中曾经存在的最佳个体,并不会由于选择,交叉或变异而失去了它们,HallOfFame类在tools模块中实现。

将Halloffame对象用于实现精英主义。 Halloffame对象中包含的个体被直接注入下一代,并且不受选择,交叉和突变的遗传算子的影响

名人堂成员数量

HALL_OF_FAME_SIZE = 30

def eaSimpleWithElitism(population,

toolbox,

cxpb,

mutpb,

ngen,

stats=None,

halloffame=None,

verbose=debug):

“”"使用halloffame来实现精英机制。 包含在名人堂麦中的个体被直接注入下一代,并且不受选择,交叉和突变的遗传算子的影响。

“”"

logbook = tools.Logbook()#用于监控算法运行,和统计数据

logbook.header = [‘gen’,‘nevals’] + (stats.fields if stats else [])

计算个体适应度

invalid_ind = [ind for ind in population if not ind.fitness.valid]

fitnesses = toolbox.map(toolbox.evaluate,invalid_ind)

for ind,fit in zip(invalid_ind,fitnesses):

ind.fitness.values = fit

if halloffame is None:

raise ValueError(“halloffame parameter must not be empty!”)

#更新名人堂成员

halloffame.update(population)

hof_size = len(halloffame.items) if halloffame.items else 0

record = stats.compile(population) if stats else {}

logbook.record(gen=0,nevals=len(invalid_ind),**record)

if verbose:

print(logbook.stream)

#开始遗传流程

for gen in range(1,ngen + 1):

#选择个体数目=种群个体数-名人堂成员数

offspring = toolbox.select(population,len(population) - hof_size)

#种群更新到下一代

offspring = algorithms.varAnd(offspring,toolbox,cxpb,mutpb)

#计算个体适应度

invalid_ind = [ind for ind in offspring if not ind.fitness.valid]

fitnesses = toolbox.map(toolbox.evaluate,invalid_ind)

for ind,fit in zip(invalid_ind,fitnesses):

ind.fitness.values = fit

#将名人堂成员添加到当前代

offspring.extend(halloffame.items)

#更新名人堂

halloffame.update(offspring)

#使用当前代替换种群

population[:] = offspring

#将当前统计信息附加到日志

record = stats.compile(population) if stats else {}

logbook.record(gen=gen,nevals=len(invalid_ind),**record)

if verbose:

print(logbook.stream)

return population,logbook

遗传流程

def main():

创建初始种群

population = toolbox.populationCreator(n=POPULATION_SIZE)

定义监听统计数据

stats = tools.Statistics(lambda ind: ind.fitness.values)

stats.register(“min”,np.min)

stats.register(“avg”,np.mean)

实例化名人堂类

hof = tools.HallOfFame(HALL_OF_FAME_SIZE)

执行遗传流程

population, logbook = eaSimpleWithElitism(population,

toolbox,

cxpb=P_CROSSOVER,

mutpb=P_MUTATION,

ngen=MAX_GENERATIONS,

stats=stats,

halloffame=hof,

verbose=True)

打印算法找到的最优解

best = hof.items[0]

print("-- Best Individual = ",best)

print("-- Best Fitness = ",best.fitness.values[0])

print()

print("Number of colors = ",gcp.getNumberOfColors(best))

print("Number of violations = ",gcp.getViolationsCount(best))

print("Cost = ",gcp.getCost(best))

绘制最优解

plt.figure(1)

gcp.plotGraph(best)

提取监听的统计结果

minFitnessValues,meanFitnessValues = logbook.select(“min”,“avg”)

绘制统计结果

plt.figure(2)

sns.set_style(“whitegrid”)

plt.plot(minFitnessValues, color=‘red’)

plt.plot(meanFitnessValues, color=‘green’)

plt.xlabel(‘Generation’)

plt.ylabel(‘Min / Average Fitness’)

plt.title(‘Min and Average fitness over Generations’)

plt.show()

结果

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

四、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

五、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注python)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
https://img-blog.csdnimg.cn/img_convert/252731a671c1fb70aad5355a2c5eeff0.png)

六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注python)
[外链图片转存中…(img-HITya6t2-1713464248942)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值