|
|
|
@ -0,0 +1,64 @@
|
|
|
|
|
import random
|
|
|
|
|
from deap import algorithms, base, creator, tools
|
|
|
|
|
import matplotlib.pyplot as plt
|
|
|
|
|
|
|
|
|
|
# 定义问题和个体
|
|
|
|
|
# 创建一个具有两个目标函数的多目标优化问题
|
|
|
|
|
creator.create("FitnessMulti", base.Fitness, weights=(-1.0, -1.0))
|
|
|
|
|
# 创建一个个体类,它包含一个列表和一个适应度函数
|
|
|
|
|
creator.create("Individual", list, fitness=creator.FitnessMulti)
|
|
|
|
|
|
|
|
|
|
# 定义问题和个体
|
|
|
|
|
IND_SIZE = 10 # 定义个体的长度为10
|
|
|
|
|
toolbox = base.Toolbox()
|
|
|
|
|
# 注册一个生成随机浮点数的函数
|
|
|
|
|
toolbox.register("attr_float", random.uniform, -10, 10)
|
|
|
|
|
# 注册一个生成个体的函数,它通过多次调用attr_float函数来生成一个长度为IND_SIZE的列表
|
|
|
|
|
toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_float, n=IND_SIZE)
|
|
|
|
|
# 注册一个生成种群的函数,它调用多次individual函数来生成一个列表
|
|
|
|
|
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
|
|
|
|
|
|
|
|
|
|
# 定义目标函数
|
|
|
|
|
def fitness(individual):
|
|
|
|
|
x = individual[0]
|
|
|
|
|
y = individual[1]
|
|
|
|
|
f1 = x**2 + y**2 # 第一个目标函数
|
|
|
|
|
f2 = (x-1)**2 + y**2 # 第二个目标函数
|
|
|
|
|
g1 = 2 * x - y**2 - 1 <= 0 # 第一个约束条件
|
|
|
|
|
g2 = 2 * y - x**2 - 2 <= 0 # 第二个约束条件
|
|
|
|
|
if g1 and g2:
|
|
|
|
|
return f1, f2 # 如果个体满足约束条件,则返回目标函数值
|
|
|
|
|
else:
|
|
|
|
|
return 10000, 10000 # 否则返回一个非常大的值
|
|
|
|
|
|
|
|
|
|
# 注册算子
|
|
|
|
|
toolbox.register("evaluate", fitness) # 注册目标函数
|
|
|
|
|
toolbox.register("mate", tools.cxSimulatedBinaryBounded, low=-10, up=10, eta=20.0) # 注册交叉算子
|
|
|
|
|
toolbox.register("mutate", tools.mutPolynomialBounded, low=-10, up=10, eta=20.0, indpb=1.0/IND_SIZE) # 注册变异算子
|
|
|
|
|
toolbox.register("select", tools.selNSGA2) # 注册选择算子
|
|
|
|
|
|
|
|
|
|
# 参数设置
|
|
|
|
|
POP_SIZE = 100 # 种群大小
|
|
|
|
|
NGEN = 50 # 迭代次数
|
|
|
|
|
CXPB = 0.9 # 交叉概率
|
|
|
|
|
MUTPB = 0.1 # 变异概率
|
|
|
|
|
|
|
|
|
|
# 运行算法
|
|
|
|
|
pop = toolbox.population(n=POP_SIZE) # 初始化种群
|
|
|
|
|
# 使用NSGA-II算法进行优化
|
|
|
|
|
algorithms.eaMuPlusLambda(pop, toolbox, mu=POP_SIZE, lambda_=POP_SIZE, cxpb=CXPB, mutpb=MUTPB, ngen=NGEN)
|
|
|
|
|
|
|
|
|
|
# 输出结果
|
|
|
|
|
print("Final population:")
|
|
|
|
|
for i, ind in enumerate(pop):
|
|
|
|
|
print("Individual {}: {}".format(i, ind))
|
|
|
|
|
|
|
|
|
|
# 获取帕累托前沿上的解的目标函数值
|
|
|
|
|
fits = [ind.fitness.values for ind in pop]
|
|
|
|
|
|
|
|
|
|
# 绘制散点图
|
|
|
|
|
plt.scatter([f[0] for f in fits], [f[1] for f in fits])
|
|
|
|
|
plt.xlabel('Objective 1')
|
|
|
|
|
plt.ylabel('Objective 2')
|
|
|
|
|
plt.title('NSGA-II Result')
|
|
|
|
|
plt.show()
|