TS terminiert endlich :D

This commit is contained in:
Armin Wolf 2017-09-07 11:21:48 +02:00
parent 528bc7651f
commit 63fb2abb74
7 changed files with 108 additions and 46 deletions

View File

@ -14,16 +14,17 @@ public class YOrderLineComparatorBegin implements Comparator<Line> {
@Override @Override
public int compare(Line o1, Line o2) { public int compare(Line o1, Line o2) {
if (o1.getY1() == o2.getY1()) { // if (o1.getY1() == o2.getY1()) {
if (o1.getX1() <= o2.getX1()) { // if (o1.getX1() <= o2.getX1()) {
return -1; // return -1;
} else { // } else {
return 1; // return 1;
} // }
} else if (o1.getY1() < o2.getY1()) { // } else if (o1.getY1() < o2.getY1()) {
return -1; // return -1;
} else { // } else {
return 1; // return 1;
} // }
return o1.getY1().compareTo(o2.getY1());
} }
} }

View File

@ -14,16 +14,17 @@ public class YOrderLineComparatorEnd implements Comparator<Line> {
@Override @Override
public int compare(Line o1, Line o2) { public int compare(Line o1, Line o2) {
if (o1.getY2() == o2.getY2()) { // if (o1.getY2() == o2.getY2()) {
if (o1.getX2() <= o2.getX2()) { // if (o1.getX2() <= o2.getX2()) {
return -1; // return -1;
} else { // } else {
return 1; // return 1;
} // }
} else if (o1.getY2() < o2.getY2()) { // } else if (o1.getY2() < o2.getY2()) {
return -1; // return -1;
} else { // } else {
return 1; // return 1;
} // }
return o1.getY2().compareTo(o2.getY2());
} }
} }

View File

@ -88,11 +88,11 @@ public class TheilSenEstimator extends Observable implements Algorithm {
interval = new Interval(NEGATIV_INF, POSITIV_INF); interval = new Interval(NEGATIV_INF, POSITIV_INF);
r = (double) n; r = (double) n;
while (true) { while (true) {
if (this.N <= n) { if (this.N <= n || (interval.getUpper() - interval.getLower()) < 0.00001) {
break; break;
} else { } else {
//Anzahl der Schnittpunkte im Intervall [-Inf, a) //Anzahl der Schnittpunkte im Intervall [-Inf, a)
int numberOfIntersections = getIntervalSize(NEGATIV_INF, interval.getLower(), setOfIntersections); int numberOfIntersections = getOpenIntervalSize(NEGATIV_INF, interval.getLower(), setOfIntersections);
//Randomized Interpolating Search //Randomized Interpolating Search
j = (r / N) * (double) (k - numberOfIntersections); j = (r / N) * (double) (k - numberOfIntersections);
@ -112,8 +112,8 @@ public class TheilSenEstimator extends Observable implements Algorithm {
interval.setLower(aVariant); interval.setLower(aVariant);
interval.setUpper(bVariant); interval.setUpper(bVariant);
N = Double.valueOf(getIntervalSize(interval.getLower(), interval.getUpper())); intervalIntersections = getOpenIntervalElements(interval.getLower(), interval.getUpper());
intervalIntersections = getIntervalElements(interval.getLower(), interval.getUpper()); N = Double.valueOf(getOpenIntervalSize(interval.getLower(), interval.getUpper()));
} }
} }
} }
@ -129,12 +129,16 @@ public class TheilSenEstimator extends Observable implements Algorithm {
private Boolean checkCondition() { private Boolean checkCondition() {
//Double kthElement = FastElementSelector.randomizedSelect(xCoordinates, k); //Double kthElement = FastElementSelector.randomizedSelect(xCoordinates, k);
//Boolean cond1 = (kthElement > aVariant) && (kthElement <= bVariant); //Boolean cond1 = (kthElement > aVariant) && (kthElement <= bVariant);
Boolean conda = k > getIntervalSize(NEGATIV_INF, aVariant, setOfIntersections);
Boolean condb = k <= getIntervalSize(NEGATIV_INF, bVariant, setOfIntersections); int lowerCount = getIntervalSize(NEGATIV_INF, aVariant, setOfIntersections);
int higherCount = getIntervalSize(NEGATIV_INF, bVariant, setOfIntersections);
Boolean conda = k > lowerCount;
Boolean condb = k <= higherCount;
Boolean cond1 = conda && condb; Boolean cond1 = conda && condb;
Boolean cond2 = (getIntervalSize(aVariant+1, bVariant+1, intervalIntersections) <= ((11 * N) / Math.sqrt(r))); Boolean cond2 = (higherCount-lowerCount) <= ((11 * N) / Math.sqrt(r));
return cond1 && cond2; return cond1 && cond2;
} }
@ -158,6 +162,24 @@ public class TheilSenEstimator extends Observable implements Algorithm {
return counter; return counter;
} }
/**
* Berechne wieviele von den Schnittpunkten in dem Interval zwischen <code>a</code> und <code>b</code>
* enthalten sind.
*
* @param a untere Grenze des Intervals
* @param b obere Grenze des Intrvals
* @return Anzahl der Schnittpunkte im Interval (a,b)
*/
public int getOpenIntervalSize(double a, double b, ArrayList<Point> set) {
int counter = 0;
for (Point x : set) {
if (x.getX() >= a && x.getX() < b) {
counter++;
}
}
return counter;
}
/** /**
* Berechne wieviele von den Schnittpunkten in dem Interval zwischen <code>a</code> und <code>b</code> * Berechne wieviele von den Schnittpunkten in dem Interval zwischen <code>a</code> und <code>b</code>
* enthalten sind. * enthalten sind.
@ -166,11 +188,11 @@ public class TheilSenEstimator extends Observable implements Algorithm {
* @param b obere Grenze des Intrvals * @param b obere Grenze des Intrvals
* @return Anzahl der Schnittpunkte im Interval [a,b) * @return Anzahl der Schnittpunkte im Interval [a,b)
*/ */
public int getIntervalSize(double a, double b) { public int getOpenIntervalSize(double a, double b) {
int counter = 0; int counter = 0;
for (int i=0;i<intervalIntersections.size();i++) { for (int i=0;i<intervalIntersections.size();i++) {
Point x = intervalIntersections.get(i); Point x = intervalIntersections.get(i);
if (x.getX() >= a && x.getX() < b) { if (x.getX() > a && x.getX() < b) {
counter++; counter++;
} }
} }
@ -184,17 +206,18 @@ public class TheilSenEstimator extends Observable implements Algorithm {
* *
* @param a untere Grenze des Intervals * @param a untere Grenze des Intervals
* @param b obere Grenze des Intrvals * @param b obere Grenze des Intrvals
* @return Liste der Schnittpunkte die im Interval [a,b) vertreten sind * @return Liste der Schnittpunkte die im Interval (a,b) vertreten sind
*/ */
public ArrayList<Point> getIntervalElements(double a, double b) { public ArrayList<Point> getOpenIntervalElements(double a, double b) {
ArrayList<Point> list = new ArrayList<>(); ArrayList<Point> list = new ArrayList<>();
for (int i=0;i<intervalIntersections.size();i++) { for (int i=0;i<intervalIntersections.size();i++) {
Point x = intervalIntersections.get(i); Point x = intervalIntersections.get(i);
if (x.getX() >= a && x.getX() < b) { if (x.getX() > a && x.getX() < b) {
list.add(x); list.add(x);
} }
} }
intervalIntersections.clear();
intervalIntersections = null;
return list; return list;
} }
@ -214,7 +237,7 @@ public class TheilSenEstimator extends Observable implements Algorithm {
y = yCoordinates.get(((n + 1) / 2) - 1); y = yCoordinates.get(((n + 1) / 2) - 1);
} }
ArrayList<Point> resultSt = getIntervalElements(interval.getLower(), interval.getUpper()); ArrayList<Point> resultSt = getOpenIntervalElements(interval.getLower(), interval.getUpper());
int size = resultSt.size(); int size = resultSt.size();
if (size % 2 == 0) { if (size % 2 == 0) {
m = 0.5 * (resultSt.get((size / 2) - 1).getX() + resultSt.get((size / 2)).getX()); m = 0.5 * (resultSt.get((size / 2) - 1).getX() + resultSt.get((size / 2)).getX());

View File

@ -11,8 +11,6 @@ import java.util.ArrayList;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Observable; import java.util.Observable;
import javax.swing.JOptionPane;
import sun.awt.image.ImageWatched.Link;
/** /**
* Implementierung verschiedener Algorithmen zur Berechnung von Ausgleichsgeraden. * Implementierung verschiedener Algorithmen zur Berechnung von Ausgleichsgeraden.
@ -85,7 +83,7 @@ public class EvaluateAlgorithms extends Observable {
generator = new DatasetGenerator(); generator = new DatasetGenerator();
} }
arrangement.setLines(generator.generateDataset()); arrangement.setLines(generator.generateDataCloud());
setChanged(); setChanged();
String[] msg = {"eval-dataset-generated"}; String[] msg = {"eval-dataset-generated"};
notifyObservers(msg); notifyObservers(msg);

View File

@ -2,6 +2,7 @@ package Presenter.Generator;
import Model.Line; import Model.Line;
import java.util.HashMap;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.Observable; import java.util.Observable;
import java.util.Random; import java.util.Random;
@ -31,7 +32,7 @@ public class DatasetGenerator extends Observable{
} }
public LinkedList<Line> generateDataset(){ public LinkedList<Line> generateDataCloud(){
LinkedList<Line> lines = new LinkedList<>(); LinkedList<Line> lines = new LinkedList<>();
m = 1 + random.nextDouble(); m = 1 + random.nextDouble();
b = random.nextDouble(); b = random.nextDouble();
@ -54,5 +55,43 @@ public class DatasetGenerator extends Observable{
return lines; return lines;
} }
public LinkedList<Line> generateDataLines(){
LinkedList<Line> lines = new LinkedList<>();
m = 1 + random.nextDouble();
b = random.nextDouble();
int size = 0;
HashMap<Double, Double> points = new HashMap<>();
//speichere die Koordinaten in einer HashMap, damit keine Punkte
//entstehen deren x-Koordinate zu sehr beieinander liegt.
while (size < 100){
double y = (random.nextGaussian() * 100) % 100;
double signal = m * y + b;
signal *= -1;
if (!points.containsKey(y)){
points.put(y,signal);
size++;
}
}
int idx = 1;
for (Double d :points.keySet()) {
Line line = new Line((double) d, points.get(d));
line.setId(idx-1+"");
lines.add(line);
idx++;
}
String[] ret = {"generator","Es wurden "+100+" Daten generiert mit den Parametern",
"</br> <b>m</b> = "+m+"",
"</br> <b>b</b> = "+b+""};
setChanged();
notifyObservers(ret);
return lines;
}
} }

View File

@ -294,7 +294,7 @@ public class Presenter implements Observer {
generatorThread = new Thread(() -> { generatorThread = new Thread(() -> {
DatasetGenerator generator = new DatasetGenerator(); DatasetGenerator generator = new DatasetGenerator();
generator.addObserver(this); generator.addObserver(this);
getModel().setLines(generator.generateDataset()); getModel().setLines(generator.generateDataLines());
calculateIntersections(); calculateIntersections();
getView().enableFunctionality(); getView().enableFunctionality();
}); });

View File

@ -97,8 +97,8 @@ public class PlotDialog extends JPanel {
public void addLineToPlot(double m, double b, Paint color, String name) { public void addLineToPlot(double m, double b, Paint color, String name) {
XYSeries linesA = new XYSeries(name); XYSeries linesA = new XYSeries(name);
linesA.add(min.doubleValue()-10, min.doubleValue() * m + b); linesA.add(min.doubleValue(), min.doubleValue() * m + b);
linesA.add(max.doubleValue()+10, max.doubleValue() * m + b); linesA.add(max.doubleValue(), max.doubleValue() * m + b);
datapoints.addSeries(linesA); datapoints.addSeries(linesA);
@ -114,8 +114,8 @@ public class PlotDialog extends JPanel {
public void addLineToPlot(double m, double b, String name) { public void addLineToPlot(double m, double b, String name) {
XYSeries linesA = new XYSeries(name); XYSeries linesA = new XYSeries(name);
linesA.add(min.intValue()-10, min.intValue() * m + b); linesA.add(min.intValue(), min.intValue() * m + b);
linesA.add(max.intValue()+10, max.intValue() * m + b); linesA.add(max.intValue(), max.intValue() * m + b);
datapoints.addSeries(linesA); datapoints.addSeries(linesA);
seriesCount = xyPlot.getSeriesCount(); seriesCount = xyPlot.getSeriesCount();