Newer
Older
package Evaluators;
import Interfaces.Evaluator;
import MainClasses.Candidate;
import MainClasses.Vertex;
public class EvaluatorNESW implements Evaluator {
final int POINTS_PER_BOND;
final int[] isHydrophobic;
public EvaluatorNESW(int pointsPerBond, int[] isHydrophobic) {
this.isHydrophobic = isHydrophobic;
public Candidate evaluateFitness(Candidate candidate) {
//TODO Is it a good idea to "cache" fitness this way? Maybe
//If fitness was not calculated yet, calculate it
if (candidate.getFitness() <= -1) { // Not calculated before
double fitness;
int hydrophobicBonds = evaluateBonds(candidate);
int overlaps = evaluateOverlaps(candidate);
fitness =(double) (hydrophobicBonds * this.POINTS_PER_BOND) / (double) (overlaps + 1);
}
public int evaluateBonds(Candidate candidate) {
for (int i = 0; i < candidate.getVertices().size() - 2; i++) {
Vertex toCompare = candidate.getVertices().get(i);
if (isHydrophobic[i]==1) {
for (int j = i + 2; j < candidate.getVertices().size(); j++) {
Vertex vertex = candidate.getVertices().get(j);
if (isHydrophobic[j]==1) {
if (toCompare.neighbouringPosition(vertex)) {
bonds++;
}
public int evaluateOverlaps(Candidate candidate) {
for (int i = 0; i < candidate.getVertices().size(); i++) {
Vertex toCompare = candidate.getVertices().get(i);
for (Vertex vertex : candidate.getVertices()) {
if (toCompare.equalsPosition(vertex) && toCompare != vertex) {
overlaps++;
overlaps /= 2;
return overlaps;