遗传算法python实现

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
import random

def size(n1,n2):
    p_num = np.empty((n1, n2))
    for i in range(n1):
        for j in range(n2):
            p_num[i][j] = random.randint(0, 1)
    return p_num

def select(obj, n1, n2, p_num):
    a = np.zeros(n1)

    temp = []
    s = []
    p_num = np.array(p_num)

    for i in range(n1):

        for j in range(n2):
            if j < n2/2:
                a[i] += 2 ** (n2/2 - j - 1) * p_num[i,j]
            else:

                a[i] += 2 ** (n2-j) * 0.1 * p_num[i,j]
    #print(a)
    for i in a:
        temp = np.append(temp,obj(i))
    #print(temp)
    b = np.argsort(temp)

    for i in range(int(n1/2)):
        s = np.append(s, b[i])
    #print(s)

    return s, temp[b[0]]

def cross(p_num, s, n1, n2):
    temp = np.empty((n1, n2))
    for i in range(len(s)):
        temp[i] = p_num[int(s[i])]
    #print(temp)
    s1 = s
    random.shuffle(s1)


    for i in range(len(s1)):

        if i / 2 != 0:
            n = random.randint(0, n2)
            for j in range(n):
                index = random.randint(0, n2-1)
                #print(index)
                t1 = p_num[(int(s1[i])-1), index]
                #print(t1)
                t2 = p_num[int(s1[i]), index]
                #print(t1,t2)
                p_num[int(s[i-1]), index] = t2
                p_num[int(s1[i]), index] = t1

            temp[int(n1/2 + i -1)] = p_num[int(s[i-1])]
            temp[int(n1/2 + i)] = p_num[int(s1[i])]
    #print(temp)
    return temp

def hete(p, m, n1, n2):
    l = random.random()
    i = random.randint(0, n1-1)
    j = random.randint(0, n2-1)
    if l < m:
        #print('------------------------')
        #print(i,j)
        if p[i,j] == 1:
            p[i,j] = 0
        else:
            p[i,j] = 1
    return p


def main():
    plt.ion()
    n1 = 8; n2 = 18;
    obj = lambda x : (x-50) ** 2 + 10
    p = size(n1, n2)
    e = 2000

    for i in range(e):
        s, r = select(obj, n1, n2, p)
        p = cross(p, s, n1, n2)
        #print(p)
        p = hete(p, 0.8, n1, n2)
        print(r)
        if i == 0:
            y_axis = r
        plt.xlim(0, e)
        plt.ylim(0, y_axis)
        plt.scatter(i, r, c='b')
        plt.pause(0.001)
        plt.ioff()
    plt.pause(0)
    plt.show
    


if __name__ == '__main__':
    main()

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逯小蓝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值