def random_repair(self, i, m): '''transforms an infeasible solution into a feasible solution by random repair''' while (self.chromosome[i] != str(m)): #find knapsack with exceeded capacity i = choice(range(1, len(self.chromosome), 2)) if self.chromosome[i - 1] == '1': c = Chromosome(self.chromosome[0:i - 1] + '00' + self.chromosome[i + 1: len(self.chromosome)]) self.chromosome = c self.knapsack_items_map = ItemList(ItemParser(RcParser().get_rc_items()).items).get_all_on_items(c, len(self.knapsacks)) return
def exe(self): for i in range(0, len(self.chromosome), 2): if choice(range(1, self.probabilty + 1)) == 1: if self.chromosome[i] == '1': return Chromosome(self.chromosome[:i] + '00' + self.chromosome[i + 2:]) elif self.chromosome[i] == '0': return Chromosome(self.chromosome[:i] + '1' + str(randint(1, RcParser().get_m())) + self.chromosome[i + 2:]) return self.chromosome
def do_selection(self): '''performs roulette selection''' fsum = 0 pop_fsum = [] for i in range(len(self.population)): rc = RcParser() fitness_function = FitnessFunction( self.population[i], ItemList(ItemParser(rc.get_rc_items()).items).get_all_on_items( self.population[i].solution, RcParser().get_m())) fitness = fitness_function.sum_all_fitness() fsum = fsum + fitness pop_fsum.append(fitness) bound = uniform(0, fsum) curr_fsum = 0 for i in range(len(self.population)): curr_fsum = curr_fsum + pop_fsum[i] if curr_fsum >= bound: return self.population[i]
if __name__ == '__main__': from parser import RcParser, ItemParser, KnapsackParser from chromosome import Chromosome from factory import ChromosomeFactory, PopulationFactory from crossover import OnePoint from item import ItemList from knapsack import KnapsackList from fitness import FitnessFunction from selection import RouletteSelection from population import Population from random import choice from mutation import Mutation from time import sleep rc = RcParser() items = ItemList(ItemParser(rc.get_rc_items()).items) knapsacks = KnapsackList(KnapsackParser(rc.get_rc_knapsacks()).knapsacks) n = rc.get_n() m = rc.get_m() print( 'please note that the number of iterations must be greater than or equal to the number of items' ) print('number of knapsacks = {0}'.format(m)) print('number of items = {0}'.format(n)) p = 10 print('population size = ' + str(p)) population = PopulationFactory(p, n, m).gen() iterations = 12 print('iterations = {0}'.format(iterations)) sleep(3)
def gen_item_list(): return ItemList(ItemParser(RcParser().get_rc_items()).items)
if __name__ == '__main__': from parser import RcParser, ItemParser, KnapsackParser from chromosome import Chromosome from factory import ChromosomeFactory, PopulationFactory from crossover import OnePoint from item import ItemList from knapsack import KnapsackList from fitness import FitnessFunction from selection import RouletteSelection from population import Population from random import choice from mutation import Mutation from time import sleep rc = RcParser() items = ItemList(ItemParser(rc.get_rc_items()).items) knapsacks = KnapsackList(KnapsackParser(rc.get_rc_knapsacks()).knapsacks) n = rc.get_n() m = rc.get_m() print('please note that the number of iterations must be greater than or equal to the number of items') print('number of knapsacks = {0}'.format(m)) print('number of items = {0}'.format(n)) p = 10 print('population size = ' + str(p)) population = PopulationFactory(p, n, m).gen() iterations = 12 print('iterations = {0}'.format(iterations)) sleep(3) fittest_chromosome = None fittest_chromosomes = []
def sum_all_fitness(self): '''returns total fitness of this chromosome''' fsum = 0 for knapsack in range(1, RcParser().get_m() + 1): fsum = fsum + self.sum_single_fitness(knapsack) return fsum
def get_knapsack_capacity(self, m): '''returns capacity of knapsack m''' return RcParser().get_rc_knapsacks()[m]