Skip to content

Commit

Permalink
Parallel bee colony algoritmasi (yani.. umarim oyledir. "Haldir Huldu…
Browse files Browse the repository at this point in the history
…r" software engineering practice gururla sunar...). Onceki parallel degil miydi de bu ne? denecek olursa eger, simdi is boka sardi, 3 tane ABC var:

- BeeColonyAlgorithm - Bu baya single machine bee colony.
- ConcurrentBeeColony - Bu oncekinin uzerinde wrapper olarak calisiyor. Birden fazla makinaya runlari dagitmak icin. Su ana kadarki parallel buydu.
- ConcurrentParallelBeeColony -  Bu ise yeniden yazildi, populasyonu makinalar bolup calisiyor (umidimi o en azindan). O yuzden ismi Arjantin'li F1 pilotlarini andiriyor. Eger daha iyi isim bulan olursa kendisine mansiyon verecegim.

Hedefimiz bir gun ConcurrentParallelParetoMultiDimensionalAllahAllahQueenHoneyBeeAlgorithm yazmak. Henuz o noktaya gelemedik.

Pareto front kodunun da bir kismi hazir. Aslinda muhtemelen onun da tumu hazir ama henuz output vermiyor, o yuzden ne kadarinin hazir oldugu konusunda spekulasyon yapmak istemiyorum.

Yeni dizi bolumu var mi bakalim...

"We're gonna need another Timmy!"
- Homeworld Command
  • Loading branch information
antimon committed Apr 1, 2011
1 parent fdcc074 commit e14d9e8
Show file tree
Hide file tree
Showing 10 changed files with 493 additions and 1 deletion.
Binary file removed a-cma/data/benchmarks/simple.zip
Binary file not shown.
Binary file modified a-cma/data/user/user.config
Binary file not shown.
2 changes: 2 additions & 0 deletions a-cma/src/edu/atilim/acma/Core.java
Expand Up @@ -29,6 +29,8 @@ public static void main(String[] args) throws IOException {
runner = new Client(args[1], port);
} else if (args[0].equals("-ai")) {
runner = new ActionImpactCalculator();
} else if (args[0].equals("-pf")) {
runner = new ParetoFrontCalculator();
}

if (runner == null) {
Expand Down
87 changes: 87 additions & 0 deletions a-cma/src/edu/atilim/acma/ParetoFrontCalculator.java
@@ -0,0 +1,87 @@
package edu.atilim.acma;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map.Entry;

import edu.atilim.acma.metrics.MetricNormalizer;
import edu.atilim.acma.metrics.MetricSummary;
import edu.atilim.acma.ui.ConfigManager;

public class ParetoFrontCalculator implements Runnable {
@Override
public void run() {
ArrayList<RunResult> results = new ArrayList<RunResult>();

System.out.println("Please enter the results folder location: ");
String root = Console.readLine();

if (root.length() == 0) {
root = ".//data//results";
}

File rd = new File(root);

try {
if (rd.exists() && rd.isDirectory()) {
for (File inner : rd.listFiles()) {
if (inner.isDirectory()) {
for (File result : inner.listFiles()) {
if (!result.isFile() || !result.getName().endsWith(".txt")) continue;

results.add(RunResult.readFrom(result.getAbsolutePath()));
}
}
}
}
} catch (Exception e) {
throw new RuntimeException(e);
}

results = getParetoFront(results);

for (RunResult r : results) {
System.out.println(r.getRunInfo());
}
}

private ArrayList<RunResult> getParetoFront(ArrayList<RunResult> res) {
RunConfig config = ConfigManager.getRunConfig("Default");
ArrayList<RunResult> front = new ArrayList<RunResult>();

cur:
for (int i = 0; i < res.size(); i++) {
RunResult cur = res.get(i);

HashMap<String, Double> curMetrics = MetricNormalizer.normalizeEach(new MetricSummary(cur.getFinalDesign().getMetrics()), config);

for (int j = 0; j < res.size(); j++) {
if (i == j) continue;

RunResult check = res.get(j);

if (!cur.getBenchmark().equalsIgnoreCase(check.getBenchmark())) continue;

HashMap<String, Double> checkMetrics = MetricNormalizer.normalizeEach(new MetricSummary(check.getFinalDesign().getMetrics()), config);

boolean paretobetter = true;

for (Entry<String, Double> metric : checkMetrics.entrySet()) {
double checkVal = metric.getValue();
double curVal = curMetrics.get(metric.getKey());

if (checkVal > curVal)
paretobetter = false;
}

if (paretobetter)
continue cur;
}

front.add(cur);
}

return front;
}
}
132 changes: 132 additions & 0 deletions a-cma/src/edu/atilim/acma/RunResult.java
@@ -0,0 +1,132 @@
package edu.atilim.acma;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.UUID;

public class RunResult {
public class DesignInfo {
private double score;

private HashMap<String, Double> metrics;

protected HashMap<String, Double> getMetrics() {
return metrics;
}

protected double getScore() {
return score;
}

private DesignInfo() {
metrics = new HashMap<String, Double>();
}
}

private enum ReadStage {
HEADER,
INITIAL,
INITIALMETRICS,
FINAL,
FINALMETRICS
}

public static RunResult readFrom(String file) throws IOException {
BufferedReader br = new BufferedReader(new FileReader(file));

RunResult result = new RunResult();

ReadStage stage = ReadStage.HEADER;
String line = null;
while ((line = br.readLine()) != null) {
line = line.trim();

if (stage == ReadStage.HEADER) {
if (line.startsWith("* Name:"))
result.name = line.substring(8);
else if (line.startsWith("* Run Info:"))
result.runInfo = line.substring(12);
else if (line.startsWith("* Initial Design:"))
stage = ReadStage.INITIAL;
else if (line.startsWith("* Final Design:"))
stage = ReadStage.FINAL;
} else if (stage == ReadStage.INITIAL || stage == ReadStage.FINAL) {
DesignInfo design = stage == ReadStage.INITIAL ? result.initialDesign : result.finalDesign;

if (line.startsWith("* Score:"))
design.score = Double.parseDouble(line.substring(9).replace(',', '.'));
else if (line.startsWith("* Metric Summary:")) {
if (stage == ReadStage.INITIAL) stage = ReadStage.INITIALMETRICS;
else if (stage == ReadStage.FINAL) stage = ReadStage.FINALMETRICS;
continue;
}
} else if (stage == ReadStage.INITIALMETRICS || stage == ReadStage.FINALMETRICS) {
DesignInfo design = stage == ReadStage.INITIALMETRICS ? result.initialDesign : result.finalDesign;

if (line.length() == 0) {
stage = ReadStage.HEADER;
continue;
}

String[] tokens = line.split(" ");

String mName = tokens[1].trim();
mName = mName.replace(":", "");

double mVal = Double.parseDouble(tokens[2].replace(',', '.'));

design.metrics.put(mName, mVal);
}
}

br.close();

return result;
}

private UUID id;
private String name;
private String runInfo;
private DesignInfo initialDesign;
private DesignInfo finalDesign;

private RunResult() {
id = UUID.randomUUID();
initialDesign = new DesignInfo();
finalDesign = new DesignInfo();
}

private RunResult(UUID id, String name, String runInfo, DesignInfo initialDesign, DesignInfo finalDesign) {
this.id = id;
this.name = name;
this.runInfo = runInfo;
this.initialDesign = initialDesign;
this.finalDesign = finalDesign;
}

public String getBenchmark() {
return name.split(" ")[0].trim();
}

public DesignInfo getFinalDesign() {
return finalDesign;
}

public UUID getId() {
return id;
}

public DesignInfo getInitialDesign() {
return initialDesign;
}

public String getName() {
return name;
}

public String getRunInfo() {
return runInfo;
}
}
1 change: 1 addition & 0 deletions a-cma/src/edu/atilim/acma/Server.java
Expand Up @@ -42,6 +42,7 @@ public void run() {

try { Thread.sleep(5000); } catch (InterruptedException e) { }
} catch (Exception e) {
e.printStackTrace();
String name = String.format("./output/%s_exception.log", UUID.randomUUID().toString());
PrintWriter pw = null;
try {
Expand Down
5 changes: 5 additions & 0 deletions a-cma/src/edu/atilim/acma/metrics/MetricSummary.java
Expand Up @@ -56,6 +56,11 @@ public MetricSummary() {
metrics = new HashMap<String, Double>();
}

public MetricSummary(HashMap<String, Double> metrics) {
this();
this.metrics = metrics;
}

public String getName() {
return name;
}
Expand Down

0 comments on commit e14d9e8

Please sign in to comment.