使用遗传算法或者粒子群优化算法计算函数f(x1-x2-x3)=x1*x1-x1x2+x3的最大值

本文介绍了两种使用Python进行优化的方法,包括遗传算法和粒子群优化,来寻找函数f(x1-x2-x3)=x1^2-x1*x2+x3在约束条件x1-x2-x3∈[1,10]下的最大值及对应的x1-x2-x3取值。" 82224838,8003122,iOS高性能Key-Value持久化组件FastKV详解,"['ios开发', 'objective-c', 'key-value存储', '数据持久化', '性能优化']

 

利用python构造遗传算法计算函数f(x1-x2-x3)=x1^2-x1*x2+x3的最大值以及函数f最大值时x1-x2-x3的取值x1-x2-x3∈[1,10].

方法一:

注意:需安装python第三方库:matplotlib或者numpy

import numpy as np

DNA_SIZE = 12
POP_SIZE = 200
CROSSOVER_RATE = 0.8
MUTATION_RATE = 0.005
N_GENERTATIONS = 30
X1_BOUND = [0, 10]
X2_BOUND = [0, 10]
X3_BOUND = [0, 10]


def F(x1, x2, x3):
    return x1 ** 2 - x1 * x2 + x3;


def translateDNA(pop):
    x1_pop = pop[:, :DNA_SIZE]
    x2_pop = pop[:, DNA_SIZE:-DNA_SIZE]
    x3_pop = pop[:, -DNA_SIZE:]

    x1 = x1_pop.dot(2 ** np.arange(DNA_SIZE)[::-1]) / float(2 ** DNA_SIZE - 1) * (X1_BOUND[1] - X1_BOUND[0]) + X1_BOUND[
        0]
    x2 = x2_pop.dot(2 ** np.arange(DNA_SIZE)[::-1]) / float(2 ** DNA_SIZE - 1) * (X2_BOUND[1] - X2_BOUND[0]) + X2_BOUND[
        0]
    x3 = x3_pop.dot(2 ** np.arange(DNA_SIZE)[::-1]) / float(2 ** DNA_SIZE - 1) * (X3_BOUND[1] - X3_BOUND[0]) + X3_BOUND[
        0]
    return x1, x2, x3


def get_fitness(pop):
  
本框架提供了有关粒子群算法(PSO)遗传算法(GA)的完整实现,以及一套关于改进、应用、测试、结果输出的完整框架。 本框架对粒子群算法遗传算法进行逻辑解耦,对其中的改进点予以封装,进行模块化,使用者可以采取自己对该模块的改进替换默认实现组成新的改进算法与已有算法进行对比试验。试验结果基于Excel文件输出,并可通过设定不同的迭代结束方式选择试验数据的输出方式,包括: 1. 输出随迭代次数变化的平均达优率数据(设定终止条件区间大于0)。 2. 输出随迭代次数变化的平均最优值数据(设定终止条件区间等于0)。 本框架了包含了常用基准函数的实现以及遗传算法粒子群算法对其的求解方案实现对比,如TSP,01背包,Banana函数,Griewank函数等。并提供大量工具方法,如KMeans,随机序列生成与无效序列修补方法等等。 对遗传算法的二进制编码,整数编码,实数编码,整数序列编码(用于求解TSP等),粒子群算法的各种拓扑结构,以及两种算法的参数各种更新方式均有实现,并提供接口供使用者实现新的改进方式并整合入框架进行试验。 其中还包括对PSO进行离散化的支持接口,自己的设计一种离散PSO方法及其用以求解01背包问题的实现样例。 欢迎参考并提出宝贵意见,特别欢迎愿意协同更新修补代码的朋友(邮箱starffly@foxmail.com)。 代码已作为lakeast项目托管在Google Code: http://code.google.com/p/lakeast http://code.google.com/p/lakeast/downloads/list 某些类的功能说明: org.lakest.common中: BoundaryType定义了一个枚举,表示变量超出约束范围时为恢复到约束范围所采用的处理方式,分别是NONE(不处理),WRAP(加减若干整数个区间长度),BOUNCE(超出部分向区间内部折叠),STICK(取超出方向的最大限定值)。 Constraint定义了一个代表变量约束范围的类。 Functions定义了一系列基准函数的具体实现以供其他类统一调用。 InitializeException定义了一个代表程序初始化出现错误的异常类。 Randoms类的各个静态方法用以产生各种类型的随机数以及随机序列的快速产生。 Range类的实现了用以判断变量是否超出约束范围以及将超出约束范围的变量根据一定原则修补到约束范围的方法。 ToStringBuffer是一个将数组转换为其字符串表示的类。 org.lakeast.ga.skeleton中: AbstractChromosome定义了染色体的公共方法。 AbstractDomain是定义问题域有关的计算与参数的抽象类。 AbstractFactorGenerator定义产生交叉概率变异概率的共同方法。 BinaryChromosome是采用二进制编码的染色体的具体实现类。 ConstantFactorGenerator是一个把交叉概率变异概率定义为常量的参数产生器。 ConstraintSet用于在计算过程中保存获取应用问题的各个维度的约束。 Domain是遗传算法求解中所有问题域必须实现的接口。 EncodingType是一个表明染色体编码类型的枚举,包括BINARY(二进制),REAL(实数),INTEGER(整型)。 Factor是交叉概率变异概率的封装。 IFactorGenerator参数产生器的公共接口。 Population定义了染色体种群的行为,包括种群的迭代,轮盘赌选择交叉以及最优个体的保存。 org.lakeast.ga.chromosome中: BinaryChromosome二进制编码染色体实现。 IntegerChromosome整数编码染色体实现。 RealChromosome实数编码染色体实现。 SequenceIntegerChromosome整数序列染色体实现。 org.lakeast.pso.skeleton中: AbstractDomain提供一个接口,将粒子的位置向量解释到离散空间,同时不干扰粒子的更新方式。 AbstractFactorGenerator是PSO中参数产生器的公共抽象类。 AbstractParticle定义了PSO种群中粒子的基本行为,最主要是实现了如何根据现有位置计算得到下一代粒子的位置的合法值。 ConstraintSet用于在粒子迭代过程中保存获取应用问题的各个维度的约束。 AbstractSwarm.java各种拓扑结构的PSO种群的抽象父类,主要实现了种群迭代过程中计算流程的定义以及中间数据被如何输出到测试工具类。 Domain是PSO算法求解中所有问题域必须实现的接口。 DynamicFatorGenerator若种群在迭代过程中,w,c1,c2随迭代次数发生变化,那么它们的产生器需要继承这个抽象类。 Factor封装了w,c1,c2三个参数的字面值。 Location用于保存获取迭代中粒子的位置速度向量的数值。 NeighborhoodBestParticle定义了采用邻域版本的PSO算法的具体实现。主要是实现了如何根据邻域版本的PSO算法计算下一迭代中的粒子速度。 RingTopoSwarm定义环拓扑结构的具体实现,主要是定义了如何获取粒子的邻域粒子的方法。 StaticTopoSwarm静态拓扑结构的PSO算法的抽象父类。 org.lakeast.pso.swarm中包含粒子群拓扑结构的各种实现,基本见名知意。 对各种问题的求解样例位于org.lakeast.main包中,以...TaskTest结尾,基本见名知意。 以ShafferF6DomainTaskTes对ShafferF6函数进行求解(采用的是PSO,遗传算法样例参见TSPValueTaskTest)为例说明求解过程如下: 1. 入口函数位于org.lakeast.main.ShafferF6DomainTaskTest中,go函数执行。 2. 在go函数中,首先指定迭代次数(numberOfIterations),测试多少轮(testCount,多次运行以得到平均达优值),种群大小(popSize),邻域大小(neighborhoodSize),迭代结束条件(exitCondition,由于制定了迭代次数,所以设定为[0,0],也就是只有达到指定迭代次数才退出)。 3. 以testCount,numberOfIterations以及迭代结束条件exitCondition为参数构建TestBatch类的实例batch。这个类用来进行管理参与测试的各种具体算法,且把数据结果按指定的格式输出为Excel文件。 4. 指定PSO中的因子产生方法,采用ExponentFactorGeneratorConstrictFactorGenerator两种方式(实现位于org.lakeast.pso.gen包)。 5. Y表示参与测试的算法数目。 6. Testable是所有可以被TestBatch测试的类需要实现的接口,以提供TestBatch生成结果Excel文件所需要的数据。 7. Domain接口是所有可以被算法解决的问题所需要实现的接口,比如说明该问题所需要的粒子位置约束范围,速度约束范围,以及适值评估的公司等。这里的Domain被实例化为ShafferF6Domain,也就是按照ShafferF6函数评估适值。 8. RingTopoSwarm是用来封装环拓扑邻域结构的类,NeighboordBestParticle是配合该类来实现按邻域最优更新速度而不是全局最优来更新。 9. 各个测试算法都被加入到TestBatch以后,batch.run()开始执行算法比较过程并输出结果Excel文件到C盘根目录(输出路径可在Testable接口中配置,除了生成Excel文件外,还可以通过修改log4j.properties在制定的位置产生运行结果日志)。
粒子群算法是一种优化算法,可以用于求解函数最大值或最小值。下面是使用粒子群算法优化求解y=1/(x1x1 + x2x2 + x3x3 + x4x4 + x5x5 + 100)的过程: 1.初始化粒子群,包括粒子的位置速度,以及每个粒子的适应度(即函数值)。 2.对于每个粒子,根据其当前位置速度更新其下一时刻的位置速度。 3.计算每个粒子的适应度,并更新全局最优位置适应度。 4.重复步骤23,直到满足停止条件(例如达到最大迭代次数或适应度达到一定阈值)。 5.返回全局最优位置作为函数最大值点。 下面是使用Python实现粒子群算法求解y=1/(x1x1 + x2x2 + x3x3 + x4x4 + x5x5 + 100)的代码: ```python import random # 定义粒子群类 class Particle: def __init__(self, dim): self.position = [random.uniform(-10, 10) for _ in range(dim)] # 初始化位置 self.velocity = [random.uniform(-1, 1) for _ in range(dim)] # 初始化速度 self.best_position = self.position.copy() # 初始化个体最优位置 self.best_fitness = float(&#39;inf&#39;) # 初始化个体最优适应度 self.fitness = float(&#39;inf&#39;) # 初始化适应度 # 更新粒子的位置速度 def update(self, global_best_position, omega, phi_p, phi_g): for i in range(len(self.position)): r_p = random.uniform(0, 1) r_g = random.uniform(0, 1) self.velocity[i] = omega * self.velocity[i] + phi_p * r_p * (self.best_position[i] - self.position[i]) + phi_g * r_g * (global_best_position[i] - self.position[i]) self.position[i] += self.velocity[i] self.fitness = 1 / (self.position[0]**2 + self.position[1]**2 + self.position[2]**2 + self.position[3]**2 + self.position[4]**2 + 100) if self.fitness < self.best_fitness: self.best_position = self.position.copy() self.best_fitness = self.fitness # 定义粒子群优化函数 def pso(dim, num_particles, max_iter): # 初始化粒子群 particles = [Particle(dim) for _ in range(num_particles)] global_best_position = particles[0].position.copy() global_best_fitness = float(&#39;inf&#39;) # 迭代优化 for i in range(max_iter): for particle in particles: particle.update(global_best_position, 0.5, 0.5, 0.5) if particle.fitness < global_best_fitness: global_best_position = particle.position.copy() global_best_fitness = particle.fitness return global_best_position, global_best_fitness # 调用粒子群优化函数求解y的最大值 x, y = pso(5, 50, 100) print(&#39;x1 =&#39;, x[0]) print(&#39;x2 =&#39;, x[1]) print(&#39;x3 =&#39;, x[2]) print(&#39;x4 =&#39;, x[3]) print(&#39;x5 =&#39;, x[4]) print(&#39;y =&#39;, 1 / (x[0]**2 + x[1]**2 + x[2]**2 + x[3]**2 + x[4]**2 + 100)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值