TS terminiert endlich :D
This commit is contained in:
parent
528bc7651f
commit
63fb2abb74
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
});
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue