2017-09-15 18:18:36 +00:00
|
|
|
package presenter.algorithms.naiv;
|
|
|
|
|
|
|
|
import model.Line;
|
|
|
|
import presenter.algorithms.Algorithm;
|
2017-10-23 15:48:36 +00:00
|
|
|
import presenter.util.FastElementSelector;
|
2017-09-15 18:18:36 +00:00
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.LinkedList;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Implementierung verschiedener Algorithmen zur Berechnung von Ausgleichsgeraden.
|
|
|
|
*
|
|
|
|
* @Author: Armin Wolf
|
|
|
|
* @Email: a_wolf28@uni-muenster.de
|
|
|
|
* @Date: 15.09.2017.
|
|
|
|
*/
|
|
|
|
public class NaivTheilSenEstimator implements Algorithm {
|
|
|
|
|
|
|
|
|
|
|
|
private LinkedList<Line> lines;
|
2019-08-01 05:19:04 +00:00
|
|
|
private double slope;
|
|
|
|
private double yInterception;
|
2017-09-15 18:18:36 +00:00
|
|
|
|
2017-10-15 13:21:53 +00:00
|
|
|
/**
|
|
|
|
* Konstruktor
|
|
|
|
* @param lines Liste der Geraden
|
|
|
|
*/
|
2017-09-15 18:18:36 +00:00
|
|
|
public NaivTheilSenEstimator(LinkedList<Line> lines) {
|
|
|
|
this.lines = lines;
|
|
|
|
this.slope = 0d;
|
|
|
|
this.yInterception = 0d;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void run() {
|
2017-10-12 15:21:16 +00:00
|
|
|
System.out.println("=== S T A R T - naiv T S ===");
|
|
|
|
long start;
|
|
|
|
long end;
|
|
|
|
start = System.currentTimeMillis();
|
2017-09-15 18:18:36 +00:00
|
|
|
ArrayList<Double> slopesList = new ArrayList<>();
|
|
|
|
int cnt = 0;
|
|
|
|
for (int i = 0; i < lines.size(); i++) {
|
|
|
|
double x = lines.get(i).getM();
|
|
|
|
double y = lines.get(i).getB();
|
|
|
|
|
|
|
|
for (int j = i + 1; j < lines.size(); j++) {
|
|
|
|
if (x != lines.get(j).getM()) { // x must be different, otherwise slope becomes infinite
|
|
|
|
Double slope = (lines.get(j).getB() - y) / (lines.get(j).getM() - x);
|
|
|
|
slopesList.add(slope);
|
|
|
|
++cnt;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ArrayList<Double> list1 = new ArrayList<>();
|
|
|
|
ArrayList<Double> list2 = new ArrayList<>();
|
2017-09-19 11:34:06 +00:00
|
|
|
for (int i = 0; i < lines.size(); i++) {
|
2017-09-15 18:18:36 +00:00
|
|
|
list1.add(lines.get(i).getM());
|
|
|
|
list2.add(lines.get(i).getB());
|
|
|
|
}
|
2019-08-01 05:19:04 +00:00
|
|
|
double median1 = FastElementSelector.randomizedSelect(list1, list1.size() / 2);
|
|
|
|
double median2 = FastElementSelector.randomizedSelect(list2, list2.size() / 2);
|
2017-09-19 11:34:06 +00:00
|
|
|
slope = FastElementSelector.randomizedSelect(slopesList, slopesList.size() / 2);
|
2017-09-15 18:18:36 +00:00
|
|
|
yInterception = median2 - slope * median1;
|
2017-10-12 15:21:16 +00:00
|
|
|
end = System.currentTimeMillis();
|
|
|
|
System.out.println("Zeit: "+ ((end-start)/1000));
|
2017-09-15 18:18:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2017-10-15 10:45:47 +00:00
|
|
|
public void pepareResult() {
|
2017-09-15 18:18:36 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2017-10-15 13:21:53 +00:00
|
|
|
/**
|
|
|
|
* @return Steigung
|
|
|
|
*/
|
2019-08-01 05:19:04 +00:00
|
|
|
public double getM() {
|
2017-09-16 13:26:33 +00:00
|
|
|
return slope * -1;
|
2017-09-15 18:18:36 +00:00
|
|
|
}
|
|
|
|
|
2017-10-15 13:21:53 +00:00
|
|
|
/**
|
|
|
|
* @return y-Achsenabschnitt
|
|
|
|
*/
|
2019-08-01 05:19:04 +00:00
|
|
|
public double getB() {
|
2017-09-16 13:26:33 +00:00
|
|
|
return yInterception * -1;
|
2017-09-15 18:18:36 +00:00
|
|
|
}
|
|
|
|
}
|