遺伝アルゴリズムで0-1リュックの問題を解決することを教えます||python実現

3274 ワード

本例では、設定された初期クラスタの数が限られており、遺伝子突然変異が設定されていないため、得られた結果は、毎回が最適であることを保証することができず、毎回の適応度関数が終了時に収束することを保証するしかない.
# coding utf-8
import  random

x ={
    1: [10, 15],
    2: [15, 25],
    3: [20, 35],
    4: [25, 45],
    5: [30, 55],
    6: [35, 70]
}

#       
FINISH_LIMT = 0 []

#     
WEIGHT_LIMIT = 80

#      
CHROMOSOME_SIZE =6

#     
SELECT_NUMBER = 4

#          
max_last = 0

#                  
diff_last = 10000


#          
#          
def init():
    chromosomes_state1 = '100100'
    chromosomes_state2 = '101010'
    chromosomes_state3 = '010101'
    chromosomes_state4 = '101011'
    chromosomes_states = [chromosomes_state1, chromosomes_state2, chromosomes_state3, chromosomes_state4]
    return chromosomes_states


#         
#                           
def fitness(chromosomes_states):
    fitnesses = []
    for chromosomes_state in chromosomes_states:
        value_sum = 0
        weight_sum = 0
        # enumerate            ,           
        for i,v in enumerate(chromosomes_state):
            if int(v)==1:
                weight_sum += x[i+1][0]
                value_sum += x[i + 1][1]
        fitnesses.append([value_sum,weight_sum])
    return fitnesses


#                      
#                     
#                   
def is_finished(fitnesses):
    global max_last
    global diff_last
    max_current = 0
    #               
    for v in fitnesses:
        if v[1]>max_current:
            max_current = v[1]
    diff = max_current - max_last
    #      ,               
    if diff= 0:
        index -= 1
        if fitnesses[index][1] > WEIGHT_LIMIT:
            chromosomes_states.pop(index)
            fitnesses.pop(index)
    select_index = [0] * len(chromosomes_states)
    #       
    for i in range(SELECT_NUMBER):
        j = chromosomes_states.index(random.choice(chromosomes_states))
        select_index[j] += 1
    return select_index


#      
#                  ,                   
#          
def crossover(chromosomes_states,select_index):
    chromosomes_states_new = []
    tmp = chromosomes_states[:]
    index = len(chromosomes_states) - 1
    while index >= 0:
        index -= 1
        chromosomes_state = tmp.pop(index)
        for i in range(select_index[index]):
            chromosomes_state_x =random.choice(chromosomes_states)
            #              
            pos = random.choice(range(1,CHROMOSOME_SIZE-1))
            chromosomes_states_new.append(chromosomes_state[:pos]+chromosomes_state_x[pos:])
    return chromosomes_states_new


#       
chromosomes_states = init()
#        100 
n = 100
while n>0:
    n -= 1
    #      100-i       
    fitnesses = fitness(chromosomes_states)
    for i in fitnesses:
        print(i, end=' ')

    #                           
    if is_finished(fitnesses):
        break
    #   
    select_index = filter(chromosomes_states,fitnesses)
    #      
    chromosomes_states = crossover(chromosomes_states,select_index)
    print()

print()
for i in chromosomes_states:
    print(i,end=' ')