00001
00020 #include "distance.h"
00021 #include <cmath>
00022 #include <cassert>
00023
00024 using namespace realea;
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 double distreal(const tChromosomeReal &x, const tChromosomeReal &y, bool *checkGen) {
00037 double dist = 0;
00038 unsigned size = x.size();
00039 assert(x.size() == y.size());
00040
00041 for (unsigned i = 0; i < size; i++) {
00042 if (checkGen == NULL || checkGen[i]) {
00043 dist += (x[i]-y[i])*(x[i]-y[i]);
00044 }
00045 }
00046
00047 return sqrt(dist)/size;
00048 }
00049
00050 double distanceMin(const tChromosomeReal &x, PopulationReal *pop, unsigned *posmin) {
00051 tIndividualRealPtr ind;
00052 double dist, lowest;
00053 unsigned i;
00054
00055 if (pop->size() == 0) {
00056 throw new string("dist:Error, popsize is zero");
00057 }
00058
00059 *posmin = 0;
00060 lowest = 0;
00061
00062 for (i = 0; i < pop->size(); i++) {
00063 ind = pop->getInd(i);
00064 dist = distreal(x, ind->sol());
00065
00066 if (dist > 0 && (lowest == 0 || dist < lowest) ) {
00067 *posmin = i;
00068 lowest = dist;
00069 }
00070 }
00071
00072 return lowest;
00073 }
00074
00075 double distanceMax(const tChromosomeReal &x, PopulationReal *pop, unsigned *posmin) {
00076 tIndividualRealPtr ind;
00077 double dist, greatest;
00078 unsigned i;
00079
00080 if (pop->size() == 0) {
00081 throw new string("dist:Error, popsize is zero");
00082 }
00083
00084 ind = pop->getInd(0);
00085 greatest = distreal(x, ind->sol());
00086
00087 for (i = 0; i < pop->size(); i++) {
00088 ind = pop->getInd(i);
00089 dist = distreal(x, ind->sol());
00090
00091 if (dist > greatest) {
00092 *posmin = i;
00093 greatest = dist;
00094 }
00095 }
00096
00097 return greatest;
00098 }
00099
00100
00101 void vector_distance(const tChromosomeReal &x, const tChromosomeReal &y, vector<tGen> &mindist) {
00102 unsigned size = x.size();
00103 assert(x.size() == y.size());
00104
00105 for (unsigned i = 0; i < size; i++) {
00106 mindist[i] = fabs(x[i]-y[i]);
00107 }
00108 }
00109
00110
00111 void min_vector_distance(const tChromosomeReal &x, const tChromosomeReal &y, vector<tGen> &mindist) {
00112 double dist = 0;
00113 unsigned size = x.size();
00114 assert(x.size() == y.size());
00115
00116 for (unsigned i = 0; i < size; i++) {
00117 dist = fabs(x[i]-y[i]);
00118
00119 if (dist < mindist[i] && dist > 0) {
00120 mindist[i] = dist;
00121 }
00122 }
00123
00124 }
00125
00126
00127 unsigned getNeigh(const tChromosomeReal &x, PopulationReal *pop, double min) {
00128 double dist, distMin;
00129 unsigned posmin,i,size;
00130
00131 distMin = -1;
00132 size = pop->size();
00133
00134 for (int i = 0; i < size; i++) {
00135 dist = distreal(x, pop->getInd(i)->sol());
00136
00137 if (dist > min && (distMin < 0 || dist < distMin)) {
00138 posmin = i;
00139 distMin = dist;
00140 }
00141 }
00142
00143 assert(distMin > 0);
00144 return posmin;
00145 }
00146
00147 void min_vector_distance(const tChromosomeReal &x, PopulationReal *pop, vector<tGen> &mindist) {
00148 tIndividualRealPtr ind;
00149 vector<double> distMin(x.size());
00150 unsigned i, initial;
00151
00152 if (pop->size() == 0) {
00153 throw new string("dist:Error, popsize is zero");
00154 }
00155
00156 initial = 0;
00157 ind = pop->getInd(initial);
00158
00159 if (ind->sol() != x) {
00160 initial += 1;
00161 ind = pop->getInd(initial);
00162 }
00163
00164 vector_distance(x, ind->sol(), mindist);
00165
00166 for (i = initial+1; i < pop->size(); i++) {
00167 ind = pop->getInd(i);
00168 min_vector_distance(x, ind->sol(), mindist);
00169 }
00170
00171 }
00172
00173 void min_dim_distance(const tChromosomeReal &sol, PopulationReal *pop, vector<unsigned> &minind) {
00174 tChromosomeReal sol_ind;
00175 unsigned i, dim;
00176 unsigned ndim=sol.size();
00177 double dist;
00178
00179 vector<double> mindist(ndim);
00180 assert(minind.size()==ndim);
00181 fill(mindist.begin(), mindist.end(), 0);
00182
00183 if (pop->size() == 0) {
00184 throw new string("dist:Error, popsize is zero");
00185 }
00186
00187 for (i = 0; i < pop->size(); i++) {
00188 sol_ind = pop->getInd(i)->sol();
00189
00190 for (dim = 0; dim < ndim; ++dim) {
00191 dist = fabs(sol_ind[dim]-sol[dim]);
00192
00193 if (mindist[dim] == 0 || (dist > 0 && (dist < mindist[dim]))) {
00194 mindist[dim] = dist;
00195 minind[dim] = i;
00196 }
00197 }
00198
00199 }
00200
00201 }