###実現したいこと
IaaSクラウドオントロジクラスタリングに関するシステムを作っています
要素(elem)と要素(elem)
要素(elem)とクラスタ(cluster)
クラスタ(cluster)とクラスタ(cluster)
このそれぞれ3種類を、類似度を使いJavaで実現したいと思っています。
###発生している問題(分からないこと)
イメージとしては、類似度(Similarity)で
要素(elem)と要素(elem)を線で結ぶ
要素(elem)とクラスタ(cluster)を線で結ぶ
クラスタ(cluster)とクラスタ(cluster)を線で結ぶ
で作りたいと考えていますが、類似度を測った後、類似度が高い要素、又はクラスタを線で結ぶという表現をどのようにすればよいか(コードの書き方)がわからないという感じです。
このように3種類をそれぞれメソッドで実装したまでは普通なのですが、そこから全く手がついていません。
###試したこと
本を引っ張り出して読んで、HashMapとか文字列結合などありましたが、どれも実装できませんでした。
単に自分がプログラミングが嫌いなので、逃げてるだけかもしれません。(このような場で言うことではないですが)
###補足情報(言語/FW/ツール等のバージョンなど)
上記の説明ではわからないと思いますので、パワーポイントのスライドを添付させていただきます。
大変わかりづらい説明で恐縮でございますが、どうぞ宜しくお願いします。
public class Plan1 { public static void main(String[] args) throws IOException { final String MODE = "CSV"; final String ClusteringMode = "Avarage"; double hreshold = 0.5d; int clusterSize = 32; String ontFile = "IaaS.owl"; int elemSize = 0; HashMap<String, Integer> elemList = new HashMap<String, Integer>(); double[][] similarity = null; OntModel m = ModelFactory.createOntologyModel(); try { m.read(new FileInputStream("IaaS.owl"), "RDF/XML-ABBREV"); // 指定したファイルをバイナリファイルとして読み込む } catch (FileNotFoundException e) { e.printStackTrace(); } HashMap<String, String> query = new HashMap<String, String>(); OntModel ontModel = loadOnt("IaaS.owl"); String mode = "NORMAL"; String[] csv = loadCSV("cluster.csv"); query.put("CPU", ""); query.put("OS", ""); query.put("Memory", ""); query.put("GHz", ""); query.put("HDD", ""); query.put("SLA", ""); query.put("RAM", ""); query.put("Hourly_Usage_Rate", ""); query.put("Monthly_Usage_Rate", ""); } static String setClusterName(String line, OntModel m) throws IOException { String[] elems = toArray(line); HashMap<String, Integer> names = new HashMap<String, Integer>(); for (int i = 0; i < elems.length; i++) { if (!elems[i].isEmpty() && !elems[i].equals("")) { OntClass targetClass = m .getOntClass("http://www.owl-ontologies.com/Ontology1383285788.owl#" + elems[i]); @SuppressWarnings("unchecked") Iterator<OntClass> superClasses = targetClass.listSuperClasses(true); while (superClasses.hasNext()) { OntClass superClass = superClasses.next(); if ((getString(superClass).equals("CPU") || getString(superClass).equals("Memory") || getString(superClass).equals("GHz") || getString(superClass).equals("HDD") || getString(superClass).equals("SLA") || getString(superClass).equals("RAM") || getString(superClass).equals("Hourly_Usage_Rate") || getString(superClass).equals("Hourly_Usage_Rate")) && !names.containsKey(getString(superClass))) { names.put(getString(superClass), 1); } else if ((getString(superClass).equals("OS") || getString(superClass.getSuperClass()).equals("OS") || getString(superClass.getSuperClass().getSuperClass()).equals("OS")) && !names.containsKey(getString(superClass))) { names.put("OS", 1); } } } } line += ":"; Iterator<String> name = names.keySet().iterator(); while (name.hasNext()) { String key = name.next(); line += key + ","; } return line.substring(0, line.length() - 1); } static double[][] setSimilarity(double[][] similarity) {// similarityの計算方法 System.out.println("---- Set Similarity ----"); for (int i = 0; i < similarity.length; i++) { for (int j = i + 1; j < similarity.length; j++) { similarity[i][j] = Math.random() + 0.1 * Math.random(); if (similarity[i][j] == 0) similarity[i][j] = 0.001; similarity[j][i] = similarity[i][j]; System.out.println(i + "-" + j + ":" + similarity[i][j]); } } return similarity; // 計算結果をsimilarityに返す } @SuppressWarnings("unused") static void Elem_And_Elem(ArrayList<Integer>[] cluster, double[][] similarity, int elemSize, int currentNum) throws IOException { int a_min = 0; int b_min = 0; double sim_min = 1.0d; double sim_max = 0.0d; for (int i = 0; i < cluster[currentNum].size(); i++) { int num1 = cluster[currentNum].get(i); for (int j = 0; j < cluster[currentNum].size(); j++) { int num2 = cluster[currentNum].get(j); if (similarity[num1][num2] < sim_min && num1 != num2) { if (cluster[currentNum * 2].isEmpty() && cluster[currentNum * 2 + 1].isEmpty()) { a_min = num1; b_min = num2; sim_min = similarity[num1][num2]; } else if (!cluster[currentNum * 2].contains(num1) && !cluster[currentNum * 2 + 1].contains(num2)) { a_min = num1; b_min = num2; sim_min = similarity[num1][num2]; } } } if (sim_min == 1.0d) break; } } static void Cluster_And_Elem(ArrayList<Integer>[] cluster, double[][] similarity, int elemSize, int currentNum) throws IOException { @SuppressWarnings("unchecked") // ClusteringTest.javaより引用 static void Cluster_And_Cluster(double[][] similarity, int elemSize, int clusterSize, HashMap<String, Integer> elemList, String ontFile, OntModel m) throws IOException { ArrayList<Integer>[] cluster = new ArrayList[clusterSize * 2]; // ArrayList for (int i = 0; i < clusterSize * 2; i++) { // 0からクラスタサイズの2倍作成を繰り返す cluster[i] = new ArrayList<Integer>(); } for (int i = 0; i < elemSize; i++) { cluster[1].add(i); } cluster = ClusteringProccess(cluster, similarity, elemSize, 1); // // クラスタリングの結果 System.out.println("---- Clustering Result ----"); for (int i = 0; i < cluster.length; i++) { System.out.print("Cluster[" + i + "]:"); for (int j = 0; j < cluster[i].size(); j++) { System.out.print(cluster[i].get(j) + " "); } System.out.println(""); return; } } private static ArrayList<Integer>[] ClusteringProccess(ArrayList<Integer>[] cluster, double[][] similarity, int elemSize, int i) throws IOException { // TODO 自動生成されたメソッド・スタブ return null; } @SuppressWarnings("unused") private static String[] toArray(String line) throws IOException { return line.split(":")[1].split(","); } /** * * @param rdfNode * @return */ @SuppressWarnings("unused") private static String getString(RDFNode rdfNode) { return rdfNode.toString().substring(rdfNode.toString().indexOf("#") + 1, rdfNode.toString().length()); } private static String[] loadCSV(String file) throws IOException { ArrayList<String> csv = new ArrayList<String>(); FileReader fr; try { fr = new FileReader(file); BufferedReader br = new BufferedReader(fr); String line; while ((line = br.readLine()) != null) { csv.add(line); } } catch (FileNotFoundException e) { e.printStackTrace(); } return (String[]) csv.toArray(new String[0]); } private static OntModel loadOnt(String file) { OntModel ontModel = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); try { ontModel.read(new FileInputStream(file), "RDF/XML-ABBREV"); } catch (FileNotFoundException ex) { ex.printStackTrace(); } return ontModel; } }
※ソースコードの全体を載せます。
回答2件
あなたの回答
tips
プレビュー