-
Notifications
You must be signed in to change notification settings - Fork 0
/
immuneSys.cpp
63 lines (55 loc) · 1.3 KB
/
immuneSys.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include "immuneSys.h"
ImmuneSys::ImmuneSys(void)
{
for(int i=0;i<IMMUNELENGTH;i++) bitSet[i] = (rand()%2) != 0;
}
int ImmuneSys::numberOfBitsSet(void)
{
int ret=0;
for(int i=0;i<IMMUNELENGTH;++i) ret+= i[bitSet];
return ret;
}
void ImmuneSys::setFromParents(const ImmuneSys &a, const ImmuneSys &b)
{
for(int i=0;i<IMMUNELENGTH;i++){
if(a.bitSet[i] == b.bitSet[i]) this->bitSet[i] = a.bitSet[i];
else this->bitSet[i] = (rand()%2) != 0;
}
}
bool ImmuneSys::affected(Disease &d){
int lenD = d.randMax;
int hamm = lenD;
int hammPos = 0;
//look for the subset with the smallest hamming distance
for(int i=0;i<IMMUNELENGTH;++i){
int hammTemp = 0;
if(IMMUNELENGTH-lenD < i) break;
for(int j=0;j<lenD;++j){
hammTemp += (bitSet[i+j] != d.bitSet[j]);
}
if(hammTemp<hamm){
hamm = hammTemp;
hammPos = i;
}
}
//find the leftmost different bit
for(int j=0;j<lenD;++j){
if(bitSet[hammPos+j] != d.bitSet[j]){
bitSet[hammPos+j] = d.bitSet[j];
break;
}
}
return isSubstring(d);
}
bool ImmuneSys::isSubstring(Disease &dis){
int lenD = dis.randMax;
for(int i=0;i<IMMUNELENGTH;++i){
if((IMMUNELENGTH-lenD) < i) return false;
bool match = true;
for(int disi=0; disi<lenD; disi++){
match &= (this->bitSet[i+disi] == dis.bitSet[disi]);
}
if(match) return true;
}
return false;
}