如何在DEAP中定义带顺序约束的自定义GA个体并解决初始化报错?
The root cause of your error is straightforward: your make_individual_valid function is almost certainly returning a standard Python list instead of an instance of your custom MyContainer (aka creator.Individual). When you reassign this plain list to the individual variable, you overwrite the original DEAP individual object that had the fitness attribute attached—leaving you with a basic list that doesn't know anything about DEAP's fitness properties.
Here are two reliable solutions depending on how your make_individual_valid function works:
Solution 1: Modify the existing individual in-place
If your constraint function only needs to rearrange or adjust elements of the individual (not create an entirely new sequence), modify the original Individual instance directly instead of returning a new list:
def make_individual_valid(individual, other_parameters): # Apply your custom order constraints directly to the individual # (individual is a MyContainer instance, which inherits from list) # Example: Reorder elements based on your custom rules custom_order = get_custom_order_rules(other_parameters) individual[:] = [individual[i] for i in custom_order] # Return the modified individual (or skip return, since we modified it in-place) return individual def generate_individual(ind_class, size): # Create initial individual as a MyContainer/Individual instance individual = ind_class(random.sample(range(IND_SIZE), k=size)) # Modify it in-place (no reassignment, so we keep the fitness attribute) individual = make_individual_valid(individual, other_parameters) return individual
Solution 2: Replace the contents of the existing individual
If your constraint function must generate a new sequence (e.g., it returns a fresh list), don't overwrite the entire individual variable. Instead, replace the contents of the original Individual instance:
def make_individual_valid(raw_sequence, other_parameters): # Generate a valid sequence from the raw input valid_sequence = apply_constraints(raw_sequence, other_parameters) # This returns a standard list return valid_sequence def generate_individual(ind_class, size): # Create initial individual as a MyContainer/Individual instance individual = ind_class(random.sample(range(IND_SIZE), k=size)) # Get the valid sequence from your function valid_seq = make_individual_valid(list(individual), other_parameters) # Replace the contents of the original individual (preserves fitness attribute) individual[:] = valid_seq return individual
Why this works
By keeping the original Individual instance intact and only modifying its contents, you retain all the DEAP-specific attributes (like fitness) that were added when you created the individual with ind_class(...). The key mistake in your original code was replacing the entire DEAP object with a plain list—these fixes avoid that.
内容的提问来源于stack exchange,提问作者Stephanie

