栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

车间调度遗传算法相关-python

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

车间调度遗传算法相关-python

遗传算法:编码√-解码(根据车间环境写)-判断(根据所选目标写)-选择√-交叉√-变异√

遗传算法解车间调度问题的边角程序基本如下,核心代码是解码,根据车间约束条件写。其中有一个适应度函数根据车间目标写。

编码

import random


def code(workpeice_number, process_number):
    a = [i for i in range(workpeice_number)] * process_number
    random.shuffle(a)
    return a

轮盘赌选择

def roulette_selection(population):
    new_pop = []
    temp_fitness =[]
    for i in population:
        temp_fitness.append(get_fitness(i))
    #
    # 精英保留策略在此位置写比较好
    #
    max_fitness = max(temp_fitness)
    min_fitness = min(temp_fitness)
    for i in range(len(population)):
        temp_fitness[i] /= max_fitness - min_fitness
    temp = 0
    while len(new_pop) != len(population):
        if temp_fitness[temp] > random.random():
            new_pop.append(population[temp])
        temp += 1
        if temp == len(population):
            temp = 0
    return new_pop

竞标赛选择

def tournament_selection(population, group_number):
    new_pop = []
    #
    # 精英保留策略在此处写比较好, 下面可以优化:首先把所有的fitness全求出,下面一次求一批可能最终求fitness次数多于整体数量
    #
    for i in range(len(population)):
        temp = []
        temp_fitness = []
        for j in range(group_number):
            temp.append(random.choice(population))
            temp_fitness.append(get_fitness(temp[j]))
        new_pop.append(temp[temp_fitness.index(max(temp_fitness))])
    return new_pop

POX交叉

def pox_crossover(code1, code2):
    random_gens = random.choice(list(set(code1)))  # 随机选中一个基因
    code11, code12, code21, code22 = [], [], [], []
    for i in range(len(code1)):
        code11.append(code1[i] if code1[i] == random_gens else 666)   # 得到两个部分
        code12.append(888 if code1[i] == random_gens else code1[i])
        code21.append(code2[i] if code2[i] == random_gens else 666)
        code22.append(888 if code2[i] == random_gens else code2[i])
    code22.reverse()  # 将两条染色体合并
    for i in range(len(code1)):
        if code11[i] == 666:
            a = code22.pop()
            while a == 888:
                a = code22.pop()
            code11[i] = a
    code12.reverse()
    for i in range(len(code1)):
        if code21[i] == 666:
            a = code12.pop()
            while a == 888:
                a = code12.pop()
            code21[i] = a
    return code11, code21


cod1 = [1, 2, 3, 4, 4, 3, 2, 1, 1]
cod2 = [1, 1, 2, 3, 2, 3, 4, 4, 1]
print(pox_crossover(cod1, cod2))

单点交叉

def one_point_crossover(code1, code2):
    a = random.randint(0, len(code1) - 1)
    tem = code1[0:a]
    code1[0:a] = code2[0:a]
    code2[0:a] = tem
    return code1, code2

随机变异

def random_mutation(codes):
    a = random.randint(0, len(codes) - 1)
    b = random.randint(0, len(codes) - 1)
    temp = codes[a]
    codes[a] = codes[b]
    codes[b] = temp
    return codes
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/580757.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号