gaft是GA的一个python包,安装pip install gaft就可以用了,先来个例子:

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "wxf"
# Email: yingxiongmowenchuchu@126.com
# Date: 2021/4/20

from math import sin, cos, pi

from gaft import GAEngine
from gaft.components import BinaryIndividual
from gaft.components import Population
from gaft.operators import TournamentSelection
from gaft.operators import RouletteWheelSelection
from gaft.operators import UniformCrossover
from gaft.operators import FlipBitBigMutation

# Built-in best fitness analysis.
from gaft.analysis.fitness_store import FitnessStore
from gaft.analysis.console_output import ConsoleOutput

# Define population.
# 变量的范围以及精度,eps可以是1个值或者是1个list,长度是变量的个数
indv_template = BinaryIndividual(ranges=[(-2, 2), (-2, 2)], eps=[0.0001, 0.0001])

# 种群中个体个数为50个
population = Population(indv_template=indv_template, size=50).init()

# Create genetic operators.
#selection = RouletteWheelSelection()
# 选择个体用于后续产生后代,
# 随机产生
# selection = TournamentSelection()
# 使用轮盘法,选择适应度最高的个体
selection = RouletteWheelSelection()

# UniformCrossover表示个体的每个位都有交换的可能性(每个位进行交换的概率为pe)
# pc的含义为进行交叉操作的概率(整体)
crossover = UniformCrossover(pc=0.8, pe=0.5)
# 定义变异操作,pm表示当前step进行变异的概率
# 这里的FlipBitBigMutation是为了防止陷入局部最优的,也可以使用FlipBitMutation
# pbm和alpha是为了之后结合engine修正pm的
# pbm取一个大于5pm的在(0,1)内的值,alpha取一个(0.5,1.0)内的值即可
mutation = FlipBitBigMutation(pm=0.1, pbm=0.55, alpha=0.6)

# Create genetic algorithm engine.
# Here we pass all built-in analysis to engine constructor.
engine = GAEngine(population=population, selection=selection,
                  crossover=crossover, mutation=mutation,
                  #analysis=[ FitnessStore])
                  analysis=[ConsoleOutput, FitnessStore])

# Define fitness function.
# 如果优化目标是最小化目标函数
# 则可以加上装饰器如下
# 如果加上这个装饰器,相当于返回值加了一个负号,之后还得自己取反
# 因此我建议如果是需要最小化,则可以自己手动修改优化函数(取反即可),更加方便自己的理解
# 注意:在这里添加适应度函数,如果是其他的方法,使用GA调参之类的,则可以将其他的算法卸载fitness中
@engine.fitness_register
# @engine.minimize # 最小化的装饰器
def fitness(indv):
    x, y = indv.solution
    ret = y*sin(2*pi*x) + x*cos(2*pi*y) + 10
    return ret

# 会生成best_fit.py,里面存储了迭代过程中的最优点以及目标函数的信息
# 进行30次种群进化
engine.run(ng=30)

 然后是用gaft解决我的问题:

 

计算f取最小时的\gammaI_{1}^{c} I_{2}^{c} I_{3}^{c} I_{1}^{s} I_{2}^{s} I_{3}^{s}是知道的,分别为相机抓取的三张图以及光机投影的三张图

from math import sin, cos, pi

from gaft import GAEngine
from gaft.components import BinaryIndividual
from gaft.components import Population
from gaft.operators import TournamentSelection
from gaft.operators import RouletteWheelSelection
from gaft.operators import UniformCrossover
from gaft.operators import FlipBitBigMutation

# Built-in best fitness analysis.
from gaft.analysis.fitness_store import FitnessStore
from gaft.analysis.console_output import ConsoleOutput

import cv2
import numpy as np

I1 = cv2.imread("D:/ret1.jpg",0)
I2 = cv2.imread("D:/ret2.jpg",0)
I3 = cv2.imread("D:/ret3.jpg",0)

# Define population.
# 变量的范围以及精度,eps可以是1个值或者是1个list,长度是变量的个数
indv_template = BinaryIndividual(ranges=[(1, 5)], eps=[0.0001])

# 种群中个体个数为50个
population = Population(indv_template=indv_template, size=50).init()

# Create genetic operators.
#selection = RouletteWheelSelection()
# 选择个体用于后续产生后代,
# 随机产生
# selection = TournamentSelection()
# 使用轮盘法,选择适应度最高的个体
selection = RouletteWheelSelection()

# UniformCrossover表示个体的每个位都有交换的可能性(每个位进行交换的概率为pe)
# pc的含义为进行交叉操作的概率(整体)
crossover = UniformCrossover(pc=0.8, pe=0.5)
# 定义变异操作,pm表示当前step进行变异的概率
# 这里的FlipBitBigMutation是为了防止陷入局部最优的,也可以使用FlipBitMutation
# pbm和alpha是为了之后结合engine修正pm的
# pbm取一个大于5pm的在(0,1)内的值,alpha取一个(0.5,1.0)内的值即可
mutation = FlipBitBigMutation(pm=0.1, pbm=0.55, alpha=0.6)

# Create genetic algorithm engine.
# Here we pass all built-in analysis to engine constructor.
engine = GAEngine(population=population, selection=selection,
                  crossover=crossover, mutation=mutation,
                  #analysis=[ FitnessStore])
                  analysis=[ConsoleOutput, FitnessStore])

# Define fitness function.
# 如果优化目标是最小化目标函数
# 则可以加上装饰器如下
# 如果加上这个装饰器,相当于返回值加了一个负号,之后还得自己取反
# 因此我建议如果是需要最小化,则可以自己手动修改优化函数(取反即可),更加方便自己的理解
# 注意:在这里添加适应度函数,如果是其他的方法,使用GA调参之类的,则可以将其他的算法卸载fitness中
@engine.fitness_register
# @engine.minimize # 最小化的装饰器
def fitness(indv):
    r = indv.solution
    # 整张图像参与找最优解
    # I1Power = np.power(I1, r)
    # I2Power = np.power(I2, r)
    # I3Power = np.power(I3, r)
    # diffSum = 0
    # for h in range(1024):
    #     for w in range(1280):
    #         diffI = (I1[h][w] - I2[h][w]) / (I1[h][w] - I3[h][w] + 0.00000001)
    #         diffIPower = (I1Power[h][w] - I2Power[h][w]) / (I1Power[h][w] - I3Power[h][w] + 0.00000001)
    #         diff = diffI - diffIPower
    #         diffSum += diff
    # ret = diffSum
    
    # 单个像素点找最优解
    h = 100
    w = 100
    I1val = I1[h][w]
    I2val = I2[h][w]
    I3val = I3[h][w]
    I1valPow = np.power(I1[h][w], r)
    I2valPow = np.power(I2[h][w], r)
    I3valPow = np.power(I3[h][w], r)


    diffI = (I1val - I2val) / (I1val - I3val + 0.00000001)
    diffIPower = (I1valPow - I2valPow) / (I1valPow - I3valPow + 0.00000001)
    diff = diffI - diffIPower
    ret = diff
    return ret

# 会生成best_fit.py,里面存储了迭代过程中的最优点以及目标函数的信息
# 进行30次种群进化
engine.run(ng=30)

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐