Skip to content

Commit

Permalink
scaling
Browse files Browse the repository at this point in the history
  • Loading branch information
Łukasz Żarczyński committed Nov 7, 2017
1 parent 28e81b9 commit 74ceeb8
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 22 deletions.
2 changes: 1 addition & 1 deletion src/com/lukzar/Chess.java
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ public void testScale() throws IOException {

double scale = 0.5;

Main.writeToFile(Arrays.asList(p, p.scale(scale)), "out/scale");
Main.writeToFile(Arrays.asList(p, p.scale(scale, Point.of(0,0), Point.of(200,200))), "out/scale");
}


Expand Down
6 changes: 4 additions & 2 deletions src/com/lukzar/config/Configuration.java
Original file line number Diff line number Diff line change
Expand Up @@ -115,9 +115,11 @@ public static List<String> getDescription() {
public static class Mutation {

public static double STARTING_POINT_CHANCE = 0.1;
public static double CHANCE_TO_CHANGE_POINT = 0.6;
public static double CHANCE_TO_CHANGE_POINT = 0.5;
public static double CHANCE_TO_CHANGE_PART = 0.38;
// CHANCE_TO_CONVERT_TO_ASYM = 1 - CHANCE_TO_CHANGE_POINT - CHANCE_TO_CHANGE_PART
public static double CHANCE_TO_CONVERT_TO_ASYNC = 0.02;
public static double CHANCE_TO_SCALE = 1.0 - CHANCE_TO_CHANGE_POINT - CHANCE_TO_CHANGE_PART - CHANCE_TO_CONVERT_TO_ASYNC;
public static double SCALE_OFFSET = 0.1;
public static double CHANCE_TO_SPLIT_LINE = 0.8; // 20% to convert to Arc, 80% to split
public static double OFFSET = 40;
}
Expand Down
30 changes: 18 additions & 12 deletions src/com/lukzar/model/Piece.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
package com.lukzar.model;

import com.lukzar.config.Configuration;
import com.lukzar.config.Templates;
import com.lukzar.fitness.FitnessUtil;
import com.lukzar.model.elements.Arc;
import com.lukzar.model.elements.DoubleArc;
import com.lukzar.model.elements.Line;
import com.lukzar.model.elements.Part;
import com.lukzar.utils.IntersectionUtil;
import com.lukzar.utils.RandomUtils;

import sun.security.krb5.Config;

import java.util.BitSet;
import java.util.Collection;
Expand Down Expand Up @@ -61,35 +65,37 @@ public String toSvg() {
);
}

public Piece scale(double scale) {
Piece result = new Piece(scale(this.getStart(), scale));
public Piece scale(double scale, Point minBound, Point maxBound) {
Point startPoint = scale(this.getStart(), scale, minBound, maxBound);
Piece result = new Piece(Point.of(startPoint.getX(), Configuration.Piece.HEIGHT));
if (this.isAsymmetric()) {
result.convertToAsymmetric();
}

for (Part part : this.getParts()) {
if (part instanceof Line) {
result.add(new Line(scale(part.getEndPos(), scale)));
result.add(new Line(scale(part.getEndPos(), scale, minBound, maxBound)));
} else if (part instanceof Arc) {
result.add(new Arc(
scale(part.getEndPos(), scale),
scale(((Arc) part).getQ(), scale)));
scale(part.getEndPos(), scale, minBound, maxBound),
scale(((Arc) part).getQ(), scale, minBound, maxBound)));
} else if (part instanceof DoubleArc) {
result.add(new DoubleArc(
scale(part.getEndPos(), scale),
scale(((DoubleArc) part).getQ1(), scale),
scale(((DoubleArc) part).getQ2(), scale))
scale(part.getEndPos(), scale, minBound, maxBound),
scale(((DoubleArc) part).getQ1(), scale, minBound, maxBound),
scale(((DoubleArc) part).getQ2(), scale, minBound, maxBound))
);
}
}
return result;
}

private Point scale(Point p, double scale) {
private Point scale(Point p, double scale, Point min, Point max) {
double scaledX = p.getX() * scale + ((Configuration.Piece.WIDTH / 2) * (1.0 - scale));
double scaledY = p.getY() * scale + (Configuration.Piece.HEIGHT * (1.0 - scale));
return Point.of(

p.getX() * scale + (100 * (1.0 - scale)),
p.getY() * scale + (200 * (1.0 - scale))
RandomUtils.ensureRange(scaledX, min.getX(), max.getX()),
RandomUtils.ensureRange(scaledY, min.getY(), max.getY())
);
}

Expand Down
20 changes: 13 additions & 7 deletions src/com/lukzar/services/evolution/Evolution.java
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ public static Collection<Piece> initialize(int size) {
public static Collection<Piece> evolvePopulation(Collection<Piece> input) {
final Set<Piece> newPopulation = new HashSet<>();

for (int i = 0; i < Math.min(Configuration.Evolution.CROSSOVER_SIZE, input.size() / 2); i++) {
for (int i = 0; i < Math.min(Configuration.Evolution.CROSSOVER_SIZE, input.size()); i++) {
final List<Piece> crossover = crossover(tournamentSelection(input), tournamentSelection(input));
crossover
.stream()
Expand Down Expand Up @@ -125,7 +125,7 @@ private static Piece mutate(Piece piece) {
startPoint = piece.getStart();
}

final Piece result = new Piece(startPoint, piece);
Piece result = new Piece(startPoint, piece);

final Point minBound = Point.of(result.isAsymmetric() ? 0 : Configuration.Piece.WIDTH / 2.0, 0);
final Point maxBound = Point.of(Configuration.Piece.WIDTH, Configuration.Piece.HEIGHT);
Expand All @@ -137,10 +137,9 @@ private static Piece mutate(Piece piece) {

final Part newPart;


if (random <= Configuration.Evolution.Mutation.CHANCE_TO_CHANGE_POINT) {
// change points


newPart = PointMutation.mutate(part, minBound, maxBound);
newPart.setStartPos(part.getStartPos());
result.getParts().set(partToChange, newPart);
Expand All @@ -152,9 +151,16 @@ private static Piece mutate(Piece piece) {
for (int i = 0; i < mutate.size(); i++) {
result.getParts().add(partToChange + i, mutate.get(i));
}
} else {
} else if (random <= Configuration.Evolution.Mutation.CHANCE_TO_CHANGE_POINT + Configuration.Evolution.Mutation.CHANCE_TO_CHANGE_PART
+ Configuration.Evolution.Mutation.CHANCE_TO_CONVERT_TO_ASYNC) {
// convert to asymmetric
result.convertToAsymmetric();
} else {
double scaleMin = 1 - Configuration.Evolution.Mutation.SCALE_OFFSET;
double scaleMax = 1 + Configuration.Evolution.Mutation.SCALE_OFFSET;
result = result.scale(
RandomUtils.randomRange(scaleMin, scaleMax),
minBound, maxBound);
}

result.updateStartPoints();
Expand Down Expand Up @@ -200,8 +206,8 @@ private static List<Piece> crossover(Piece piece1, Piece piece2) {
right = piece2.getParts();
}

int l = new Random().nextInt(left.size() - 2) + 1;
int r = new Random().nextInt(right.size() - 2) + 1;
int l = new Random().nextInt(left.size());
int r = new Random().nextInt(right.size());

final List<Part> l1 = left.subList(0, l);
final List<Part> l2 = left.subList(l, left.size());
Expand Down

0 comments on commit 74ceeb8

Please sign in to comment.