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
public int compare(Line o1, Line o2) {
if (o1.getY1() == o2.getY1()) {
if (o1.getX1() <= o2.getX1()) {
return -1;
} else {
return 1;
}
} else if (o1.getY1() < o2.getY1()) {
return -1;
} else {
return 1;
}
// if (o1.getY1() == o2.getY1()) {
// if (o1.getX1() <= o2.getX1()) {
// return -1;
// } else {
// return 1;
// }
// } else if (o1.getY1() < o2.getY1()) {
// return -1;
// } else {
// return 1;
// }
return o1.getY1().compareTo(o2.getY1());
}
}
}

View File

@ -14,16 +14,17 @@ public class YOrderLineComparatorEnd implements Comparator<Line> {
@Override
public int compare(Line o1, Line o2) {
if (o1.getY2() == o2.getY2()) {
if (o1.getX2() <= o2.getX2()) {
return -1;
} else {
return 1;
}
} else if (o1.getY2() < o2.getY2()) {
return -1;
} else {
return 1;
}
// if (o1.getY2() == o2.getY2()) {
// if (o1.getX2() <= o2.getX2()) {
// return -1;
// } else {
// return 1;
// }
// } else if (o1.getY2() < o2.getY2()) {
// return -1;
// } else {
// 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);
r = (double) n;
while (true) {
if (this.N <= n) {
if (this.N <= n || (interval.getUpper() - interval.getLower()) < 0.00001) {
break;
} else {
//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
j = (r / N) * (double) (k - numberOfIntersections);
@ -112,8 +112,8 @@ public class TheilSenEstimator extends Observable implements Algorithm {
interval.setLower(aVariant);
interval.setUpper(bVariant);
N = Double.valueOf(getIntervalSize(interval.getLower(), interval.getUpper()));
intervalIntersections = getIntervalElements(interval.getLower(), interval.getUpper());
intervalIntersections = getOpenIntervalElements(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() {
//Double kthElement = FastElementSelector.randomizedSelect(xCoordinates, k);
//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 cond2 = (getIntervalSize(aVariant+1, bVariant+1, intervalIntersections) <= ((11 * N) / Math.sqrt(r)));
Boolean cond2 = (higherCount-lowerCount) <= ((11 * N) / Math.sqrt(r));
return cond1 && cond2;
}
@ -158,6 +162,24 @@ public class TheilSenEstimator extends Observable implements Algorithm {
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>
* enthalten sind.
@ -166,11 +188,11 @@ public class TheilSenEstimator extends Observable implements Algorithm {
* @param b obere Grenze des Intrvals
* @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;
for (int i=0;i<intervalIntersections.size();i++) {
Point x = intervalIntersections.get(i);
if (x.getX() >= a && x.getX() < b) {
if (x.getX() > a && x.getX() < b) {
counter++;
}
}
@ -184,17 +206,18 @@ public class TheilSenEstimator extends Observable implements Algorithm {
*
* @param a untere Grenze des Intervals
* @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<>();
for (int i=0;i<intervalIntersections.size();i++) {
Point x = intervalIntersections.get(i);
if (x.getX() >= a && x.getX() < b) {
if (x.getX() > a && x.getX() < b) {
list.add(x);
}
}
intervalIntersections.clear();
intervalIntersections = null;
return list;
}
@ -214,7 +237,7 @@ public class TheilSenEstimator extends Observable implements Algorithm {
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();
if (size % 2 == 0) {
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.List;
import java.util.Observable;
import javax.swing.JOptionPane;
import sun.awt.image.ImageWatched.Link;
/**
* Implementierung verschiedener Algorithmen zur Berechnung von Ausgleichsgeraden.
@ -85,7 +83,7 @@ public class EvaluateAlgorithms extends Observable {
generator = new DatasetGenerator();
}
arrangement.setLines(generator.generateDataset());
arrangement.setLines(generator.generateDataCloud());
setChanged();
String[] msg = {"eval-dataset-generated"};
notifyObservers(msg);

View File

@ -2,6 +2,7 @@ package Presenter.Generator;
import Model.Line;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Observable;
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<>();
m = 1 + random.nextDouble();
b = random.nextDouble();
@ -54,5 +55,43 @@ public class DatasetGenerator extends Observable{
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(() -> {
DatasetGenerator generator = new DatasetGenerator();
generator.addObserver(this);
getModel().setLines(generator.generateDataset());
getModel().setLines(generator.generateDataLines());
calculateIntersections();
getView().enableFunctionality();
});

View File

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