基本原理

遗传算法的基本思想是模拟自然选择的过程:

  • 在每次迭代中,选择适应度更高的解,然后通过变异和交叉产生新的解集
  • 通过多次迭代找到最优解

整体代码

import random

# 定义需要最小化的目标函数
def foo(x,y,z):
    return 6*x**3 + 9*y**2 + 90*z - 25

# 定义适应度函数(用于评估解的好坏)
def fitness(x,y,z):
    ans = foo(x,y,z)  # 引入目标函数的解

    if ans == 0:
        return 99999
    else:
        return abs(1/ans)
   
# 生成初始x,y,z的解(随机生成10000个解)
solutions = []
for s in range(1000):
    solutions.append((random.uniform(0,10000),
                      random.uniform(0,10000),
                      random.uniform(0,10000)))

# 迭代求解    
# 使用一个循环迭代1000次,每次迭代都重新评估和排序解
for i in range(10000):

    rankedsolutions = []
    for s in solutions:
        rankedsolutions.append((fitness(s[0],s[1],s[2]),s))
    rankedsolutions.sort()
    rankedsolutions.reverse()

# 每次迭代后,输出当前最佳解的信息
    print(f"=== Gen{i} best solutions ===")
    print(rankedsolutions[0])

    bestsolutions = rankedsolutions[:100]

    #创建一个新的种群,该种群是通过从最佳解中随机选择元素并进行微小的随机变化生成的(遗传算法中的交叉和变异)
    elements = []
    for s in bestsolutions:
        elements.append(s[1][0])
        elements.append(s[1][1])
        elements.append(s[1][2])

    newGen = []
    for _ in range(1000):
        e1 = random.choice(elements) * random.uniform(0.99,1.01)
        e2 = random.choice(elements) * random.uniform(0.99,1.01)
        e3 = random.choice(elements) * random.uniform(0.99,1.01)

        newGen.append((e1,e2,e3))
   
    rankedsolutions = newGen

定义目标函数

def foo(x,y,z):
    return 6*x**3 + 9*y**2 + 90*z - 25

定义适应度函数

首先调用目标函数foo计算的结果,然后根据结果返回一个适应度值

如果计算结果为0,则会返回一个很大的值99999,如果计算结果不为0,就返回其绝对值的倒数

def fitness(x,y,z):
    ans = foo(x,y,z)

    if ans == 0:
        return 99999
    else:
        return abs(1/ans)

创建一个空的初始方案列表,生成随机解并存放到初始方案列表中

创建一个空的solutions列表

每个随即生成的解,都是包含三个浮点数的元组,这三个数都分别介于0~10000之间

solutions = []
for s in range(1000):
solutions.append((random.uniform(0,10000),
random.uniform(0,10000),
random.uniform(0,10000)))

创建空的排序解决方案列表并重新排序,找出适应度最高的100个解元组

通过for循环遍历solutions列表中的每一个解元组,计算其适应度,并将适应度和解作为一个元组添加到rankedsolutions列表之中

用sort()方法对rankedsolutions列表进行排序,然后使用reverse()方法将其反转,使适应度最高的解元组位于列表的开头

选择适应度最高的100个解,存放到bestsolutions列表当中

for i in range(10000):
    rankedsolutions = []
for s in solutions:
    rankedsolutions.append((fitness(s[0],s[1],s[2]),s))
rankedsolutions.sort()
rankedsolutions.reverse()
    bestsolutions = rankedsolutions[:100]

生成新种群:选择、交叉、变异

选择——排序

通过在随机生成的解中找到100个适应度最高的解,并对其进行排序,完成了【选择】这一步骤

选择的结果就是bestsolutions列表

交叉、变异


0 条评论

发表回复

Avatar placeholder

您的邮箱地址不会被公开。 必填项已用 * 标注