source: tags/cvs_2_svn/PARSIMONY/GA_main.cxx

Last change on this file was 5390, checked in by westram, 16 years ago
  • TAB-Ex
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.5 KB
Line 
1#include <stdlib.h>
2#include <arbdb.h>
3#include <arbdbt.h>
4#include <string.h>
5#include <stdio.h>
6#include <memory.h>
7// #include <malloc.h>
8#include <iostream.h>
9#include "AP_buffer.hxx"
10#include "parsimony.hxx"
11#include "ap_tree_nlen.hxx"
12#include "GA_genetic.hxx"
13
14void tree_init(AP_tree *tree0);
15GA_genetic * GAgenetic;
16void parsimony_func(AP_tree *);
17
18void  buildRandomTreeRek(AP_tree *tree,AP_tree **list,int *num) {
19    // builds a list of all species
20    if (tree->is_leaf == AP_TRUE) {
21        AP_tree_nlen *pntr = new AP_tree_nlen;
22        pntr->copy((AP_tree_nlen*)tree);
23        pntr->father = 0;
24        list[*num] = (AP_tree *)pntr;
25        (*num)++;
26        return;
27    }
28    buildRandomTreeRek(tree->leftson,list,num);
29    buildRandomTreeRek(tree->rightson,list,num);
30    return;
31}
32
33
34AP_tree * buildRandomTree(AP_tree *root) {
35    // function returns a random constructed tree
36    // root is tree with species (needed to build a list of species)
37    AP_tree **list;
38
39    if (root->sequence_proto == 0) tree_init(root);
40
41    AP_tree_nlen *ntree;
42    AP_tree *tree1,*tree0;
43    int num;
44    int count = 0;
45
46    root->arb_tree_leafsum();
47
48    list = (AP_tree **)calloc(root->gr.leave_sum +1,sizeof(AP_tree *));
49
50    buildRandomTreeRek(root,list,&count);
51    count--;
52    while (count >1) {
53        // choose two random numbers
54        num = (int)random()%(count+1);
55        tree0 = list[num];
56        list[num] = list[count];
57        count --;
58        num = (int)random()%(count+1);
59        tree1 = list[num];
60        ntree = new AP_tree_nlen;
61        ntree->leftson = tree0;
62        ntree->rightson = tree1;
63        ntree->sequence = 0;
64        tree0->father = ntree;
65        tree1->father = ntree;
66        ntree->is_leaf = GB_FALSE;
67        // ################## Laengenberechnung #################3
68        ntree->leftlen = .5;
69        ntree->rightlen = .5;
70        list[num] = (AP_tree *)ntree;
71    }
72    tree0 = list[0];
73    delete list;
74    //tree0->sequence_proto = root->sequence_proto->dup();
75    //tree0->sequence_proto = root->sequence_proto;
76    //tree0->sequence_proto = (AP_sequence *)new AP_sequence_parsimony;
77    return tree0;
78}
79
80void kernighan_lin(AP_tree_nlen *tree) {
81    if (tree ==0) new AP_ERR("kernighan_lin","No tree !");
82    // ruft kernighan auf
83}
84
85AP_tree_nlen *crossover(AP_tree_nlen *tree0,AP_tree_nlen *tree1) {
86    int size1,size0;
87    AP_CO_LIST *list0,*list1;
88
89    if (tree0 ==0 || tree1 == 0) {
90        new AP_ERR("crossover","Needs two tress as argument");
91        return 0;
92    }
93    list0 = tree0->createList(&size0);
94    list1 = tree1->createList(&size1);
95
96    fprintf(GAgenetic->fout,"\ncrossover tree %d %d size %d %d",
97            tree0,tree1,size0,size1);
98
99    // ruft crossover auf
100    return tree0;
101}
102
103int randomCluster() {
104    int maxcluster = GAgenetic->getMaxCluster();
105    int cluster;
106    cluster = (int)random()%maxcluster;
107    cout << cluster << "clust\n";
108    return cluster;
109}
110AP_ERR * make_start_population(GBDATA *gbmain,AP_tree *tree) {
111    // makes random startpopultation
112    // (at least two trees in each cluster)
113    static int msp = 0;
114    msp ++;
115    if (msp > 1) return new AP_ERR("make_start_population","Only call it once !");
116    int name=0,i =0,maxcluster;
117
118    AP_tree_nlen* rtree;
119
120    if (GAgenetic == 0) {
121        GAgenetic = new GA_genetic;
122        GAgenetic->init(gbmain);
123    }
124
125    maxcluster = GAgenetic->getMaxCluster();
126    while (i<maxcluster) {
127        rtree = (AP_tree_nlen *)buildRandomTree(tree);
128        rtree->parsimony_rek();
129        GAgenetic->put_start_tree((AP_tree *)rtree,name,i);
130        name ++;
131        fprintf(GAgenetic->fout,"\ncluster %d put Starttree %d",i,name-1);
132        rtree = (AP_tree_nlen *)buildRandomTree(tree);
133        rtree->parsimony_rek();
134        GAgenetic->put_start_tree((AP_tree *)rtree,name,i);
135        name ++;
136        fprintf(GAgenetic->fout,"\nCluster %d put Starttree %d",i,name-1);
137        i ++;
138    }
139    return 0;
140}
141
142void quit_genetic() {
143    fclose(GAgenetic->fout);
144}
145
146void start_genetic(GBDATA *gbmain) {
147    //
148    // the genetic algorithm is implemented here
149    //
150
151    GA_tree * starttree;
152    GA_job *job;
153    int cluster;
154
155
156    if (GAgenetic == 0) {
157        GAgenetic = new GA_genetic;
158        GAgenetic->init(gbmain);
159    }
160    fprintf(GAgenetic->fout,"\n**** Genetic ALGORITHEM *****\n");
161    make_start_population(gbmain,ap_main->tree_root);
162
163    //
164    // get starttree and optimize it
165    //
166
167    int i = 0;
168
169    while (i<GAgenetic->getMaxCluster()) {
170        cluster = i;
171        while ((starttree = GAgenetic->get_start_tree(cluster)) != 0){
172            if (starttree != 0) {
173                kernighan_lin(starttree->tree);
174                GAgenetic->put_optimized(starttree,cluster);
175                fprintf(GAgenetic->fout,"\nStarttree %d optimized in cluster %d",
176                        starttree->id,
177                        cluster);
178                delete starttree;
179            } else {
180                fprintf(GAgenetic->fout,"\nNo starttree found in cluster %d",cluster);
181            }
182        }
183        i ++;
184    }
185
186    //
187    // get job and do it
188    //
189    i =0;
190    while (i++ <20) {
191        cluster = randomCluster();
192        job = GAgenetic->get_job(cluster);
193        if (job != 0) {
194            switch(job->modus) {
195                case GA_CROSSOVER: {
196                    GA_tree * gaTree = new GA_tree;
197                    gaTree->tree = crossover(job->tree0->tree,job->tree1->tree);
198
199                    GB_push_transaction(gb_main);
200                    char *use =GBT_get_default_alignment(gb_main);
201                    gaTree->tree->load_sequences_rek(0,use);
202                    GB_pop_transaction(gb_main);
203
204                    parsimony_func(gaTree->tree);
205
206                    gaTree->criteria = gaTree->tree->mutation_rate;
207                    gaTree->id = -1;
208                    GAgenetic->put_optimized(gaTree,job->cluster0);
209                    delete gaTree;
210                    delete use;
211                    break; }
212                case GA_KERNIGHAN:
213                    kernighan_lin(job->tree0->tree);
214                    break;
215                case GA_NNI:
216                    break;
217                case GA_CREATEJOBS:
218                    break;
219                case GA_NONE:
220                default:
221                    break;
222            }
223            fprintf(GAgenetic->fout,"\njob %d in cluster %d : %d executed, mode %d"
224                    ,job,job->cluster0,job->cluster1,job->modus);
225            GAgenetic->put_optimized(job->tree0,cluster);
226        } else {
227            fprintf(GAgenetic->fout,"\nno job found");
228        }
229    }
230}
Note: See TracBrowser for help on using the repository browser.