Exemple #1
0
def generate_one_unit(i, paper, problem_list):
    """
    随机生成一个个体
    """

    unit = Unit()
    unit.id = i + 1

    each_type_count = paper.each_type_count
    while paper.total_score != unit.sum_score:
        unit.problem_list = []
        for j in range(len(each_type_count)):
            one_type_problem = [
                p for p in problem_list
                if p.type == j+1 and is_contain_points(p, paper)]

            for k in range(0, each_type_count[j]):
                length = len(one_type_problem)
                index = randint(0, length - k - 1)
                unit.problem_list.append(one_type_problem[index])
                one_type_problem[index], one_type_problem[length-k-1] = \
                    one_type_problem[length-k-1], \
                    one_type_problem[index]

    return unit
Exemple #2
0
def cross(unit_list, count, paper):
    """
    基因重组
    """

    crossed_unit_list = []
    while (len(crossed_unit_list) != count):
        index_one = randint(0, len(unit_list) - 1)
        index_two = randint(0, len(unit_list) - 1)
        if index_one == index_two:
            continue

        unit_one = unit_list[index_one]
        unit_two = unit_list[index_two]
        cross_position = randint(0, unit_one.problem_count - 2)
        score_one = unit_one.problem_list[cross_position].score + \
            unit_one.problem_list[cross_position+1].score
        score_two = unit_two.problem_list[cross_position].score + \
            unit_two.problem_list[cross_position+1].score

        if score_one == score_two:
            unit_new_one = Unit()
            unit_new_one.problem_list += unit_one.problem_list
            unit_new_two = Unit()
            unit_new_two.problem_list += unit_two.problem_list
            p = random()
            if p < 0.8:
                for i in range(cross_position, cross_position + 2):
                    unit_new_one.problem_list[i] = unit_two.problem_list[i]
                    unit_new_two.problem_list[i] = unit_one.problem_list[i]

            unit_new_one.id = len(crossed_unit_list)
            unit_new_two.id = unit_new_one.id + 1
            if len(crossed_unit_list) < count:
                crossed_unit_list.append(unit_new_one)

            if len(crossed_unit_list) < count:
                crossed_unit_list.append(unit_new_two)

        crossed_unit_list = list(set(crossed_unit_list))

    set_kp_coverage(crossed_unit_list, paper)
    set_adaptation_degree(crossed_unit_list, paper, FKPCOV, FDIFF)
    return crossed_unit_list