ADD file via upload

master
xtu202105570105 2 years ago
parent 3cadf1a175
commit a49d208c82

@ -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()
Loading…
Cancel
Save