def hillclimber(protein):
    ''' Dit algoritme probeert de beste score van een gegeven proteine te vinden. 
        Door eerst een kopie te maken van de huidige staat, dan een mutatie uit te
        voeren en vervolgens de twee met elkaar te vergelijken. De hoogste score 
        wordt behouden. In het geval dat de score's gelijk aan elkaar zijn wordt de
        nieuwste score behouden.
        
        Het neemt een proteine in de vorm van een string als argument en geeft een
        score in de vorm van een integer terug.
    '''

    fold = ff.Fold(protein)
    helpe.insert_protein(fold.Protein)

    scoreslist = []
    for i in range(10000):
        current_grid, current_score, current_p_list = fold.random_fold()
        if helpe.check_protein(fold.grid, fold.Protein) <= current_score:
            continue
        else:
            fold.grid = current_grid 
            fold.Protein.protein_list = current_p_list 
        proteinlistlist = []
        score = helpe.check_protein(fold.grid, fold.Protein)
        scoreslist.append(score)
        for k in range(len(fold.Protein.protein_list)):
            proteinlistlist.append(fold.Protein.protein_list[k].row)
            proteinlistlist.append(fold.Protein.protein_list[k].column)
        scoreslist.append(proteinlistlist)        
    return scoreslist
Beispiel #2
0
 def __init__(self, protein):
     ''' Initialiseert een fold-object. Neemt een string die het proteïne representeerd
         als argument. Maakt een proteine-object aan en zet het object in een grid.
     '''
     self.protein = protein
     self.Protein = pp.Protein(self.protein)
     self.grid = helpe.insert_protein(self.Protein)
Beispiel #3
0
    def random_fold(self):
        ''' Random_fold neemt een fold object als argument. Er wordt een aanpassing 
            gemaakt op een random plek in het proteïne naar een random vouwoptie.
            Het geturnt het grid als numpy array, een integer die voor de score staat
            en een proteinlist met Aminode objecten in een lijst.
        '''

        # Maak kopie van huidige staat voor latere vergelijkingen.
        current_grid = copy.deepcopy(self.grid)
        current_score = helpe.check_protein(self.grid, self.Protein)
        current_p_list = copy.deepcopy(self.Protein.protein_list)

        # Kies een random plek om te vouwen en kies een random optie om naar te vouwen.
        j = random.randint(2, (len(self.Protein.protein_list) - 1))
        current_row = self.Protein.protein_list[j - 1].row
        current_col = self.Protein.protein_list[j - 1].column
        future_row, future_col = self.choose_option(
            self.optionlist(current_row, current_col, j), current_row,
            current_col)

        # Vouw en zet in het grid.
        self.fold(future_row, future_col, current_row, current_col, j)
        self.grid = helpe.insert_protein(self.Protein)

        return current_grid, current_score, current_p_list
Beispiel #4
0
def random_structure_without_collision(protein):
    ''' Random_structure_without_collision neemt een proteïne string als argument
        en maakt van dit proteïne een random structuur zonder collisions. Returnt
        een proteïne object
    '''
    
    # Maak random structuur, zolang deze collisions heeft probeer opnieuw.
    pro_obj = pp.Protein(protein)
    row_list, column_list = random_structure(pro_obj)
    while check_for_collision(row_list, column_list) == False:
        row_list, column_list = random_structure(pro_obj)
    grid = hp.insert_protein(pro_obj)
    score = hp.check_protein(grid, pro_obj)
    return score  
def sim_anneal(protein, cool):
    ''' Ti = T0 - i(T0-Tn) / N
        Kan ik i als temp gebruiken? denk dat dit handig is
        T0 is iets van count die hoog staat
        De begintemp kies je zo dat op iedere verslechtering de kans 1 is
    '''
    fold = ff.Fold(protein)
    score = hill.hillclimber(protein)
    highscore = copy.copy(score)
    highproteinlist = copy.deepcopy(fold.Protein.protein_list)
    fold.grid = helpe.insert_protein(fold.Protein)

    # Linear
    if cool == int(1):
        T0 = 1000
        Tn = 0
        N = 10000

    # Exponential
    elif cool == int(2):
        T0 = 10000
        Tn = 1000
        N = 1000

    # Logarithmic
    elif cool == int(3):
        T0 = 1000
        Tn = 0
        N = 10000
        A = ((T0 - Tn) * (N + 1)) / N
        B = T0 - A

    for i in range(0, 10000):
        current_grid, current_score, current_p_list = fold.random_fold()
        if helpe.check_protein(fold.grid, fold.Protein) <= current_score:
            highscore, highproteinlist = helpe.check_highscore(
                fold, current_score, highscore, highproteinlist)
        else:
            if cool == int(1):
                temperature = T0 - (i * (T0 - Tn)) / N
            elif cool == int(2):
                temperature = T0 * ((Tn / T0)**(i / N))
            elif cool == int(3):
                temperature = (A / (i + 1)) + B
            helpe.probability(temperature, fold, current_score, current_grid,
                              current_p_list)
    return highscore