質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

1回答

4639閲覧

山登り法というアルゴリズムのプログラムについてです.教えてください

randmaster

総合スコア31

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2016/09/06 10:18

編集2016/09/06 11:54

###前提・実現したいこと

Javaで山登り法を用いて,2つの都市を入れ替え続けるソースコードを書きました.最終的にツアーの経路がより短い物を選ぶというものです.
エラーメッセージは出ていないのですが,毎回ランダムの乱数を作っているはずなのに,同じベストスコア5.0と文字化けのような文字が出ます.
HillClimbingクラスのmain文をどう書けばいいのかが分かりません.

###発生している問題・エラーメッセージ

エラーは出ないですが,毎回これになります… maxImprove = 0.000000, i = -1, j = -1 Best found score: 5.0 tsp.Point@2c091cee tsp.Point@a4a63d8 tsp.Point@19e0ff2f tsp.Point@29173ef tsp.Point@1b52513a

###該当のソースコード

Java

1 2package tsp.impl; 3 4import java.util.ArrayList; 5import java.util.List; 6import java.util.Random; 7 8import tsp.AbstractTSPSolver; 9import tsp.Point; 10 11public class HillClimbing extends AbstractTSPSolver { 12 public HillClimbing(List<Point> points) { 13 super(points); 14 } 15 16 @Override 17 public void run() { 18 if (this.currentState.getPoints().size() <= 3) 19 return; 20 21 while (step()) { 22 System.out.println("crimb."); 23 } 24 } 25 26 // 1 step 進め、解が改ざんされたならば true を返す。 27 // 2つ選んで良くなるものを交換する、ということを繰り返す。 28 // i, j が並んでいる時は、(j == i + 1 とする) 29 // i-1, i, j, j+1 が、i-1, j, i, j + 1 になるので、 30 // -d(i-1, i)-d(i+1,i+2) 31 // +d(i-1, i+1)+d(i,i+2) 32 33 // 並んでいないときは、 34 // i-1, i, i + 1, ..., j - 1, j, j + 1 35 // -d(i-1, i)-d(i, i+1)-d(j-1, j)-d(j, j+1) 36 // +d(i-1, j)+d(j, i+1)+d(j-1, i)+d(i, j+1) 37 38 public boolean step() { 39 final int N = currentState.size(); 40 41 double maxImprove = 0; 42 int iMaxImprove = -1, jMaxImprove = -1; 43 44 // points[0] の位置は固定にする。 45 for (int i = 1; i < N - 1; ++i) { 46 for (int j = i + 1; j < N; ++j) { 47 double improvedScore = scoreImprovementIfSwapped(i, j); 48 if (maxImprove < improvedScore) { 49 maxImprove = improvedScore; 50 iMaxImprove = i; 51 jMaxImprove = j; 52 } 53 } 54 } 55 56 System.out.printf("maxImprove = %f, i = %d, j = %d\n", maxImprove, iMaxImprove, jMaxImprove); 57 58 if (iMaxImprove <= 0) 59 return false; 60 61 currentState.swap(iMaxImprove, jMaxImprove); 62 return true; 63 } 64 65 public double scoreImprovementIfSwapped(int i, int j) { 66 assert (i < j); 67 if (j == i + 1) { 68 double removedDist = currentState.distance(i-1,i) + currentState.distance(i+1,i+2); 69 double addedDist = currentState.distance(i-1, i+1) + currentState.distance(i, i+2); 70 double improvedDist = removedDist - addedDist; 71 return improvedDist; 72 } else { 73 double removedDist = currentState.distance(i-1, i) + currentState.distance(i, i+1) + currentState.distance(j-1, j) + currentState.distance(j, j+1); 74 double addedDist = currentState.distance(i-1, j) + currentState.distance(j, i+1) + currentState.distance(j-1, i) + currentState.distance(i, j+1); 75 double improvedDist = removedDist - addedDist; 76 return improvedDist; 77 } 78 } 79 80 public static void main(String[] args) { 81 82 List<Point> points = new ArrayList<Point>(); 83 84 for (int i = 0; i < 5; i++) { 85 86 //Randomクラスのインスタンス化 87 Random rnd = new Random(); 88 89 double x = rnd.nextDouble(); 90 double y = rnd.nextDouble(); 91 92 Point p = new Point(x, y); 93 94 points.add(i, p); 95 96 97 } 98 99 HillClimbing hc = new HillClimbing(points); 100 101 hc.run(); 102 hc.showFinalResult(); 103 104 } 105 106} 107 108package tsp; 109 110import java.util.List; 111 112public abstract class AbstractTSPSolver implements TSPSolver { 113 protected TSPState currentState; 114 115 protected AbstractTSPSolver(List<Point> points) { 116 this.currentState = new TSPState(points); 117 } 118 119 @Override 120 public final TSPState getBestState() { 121 return currentState; 122 } 123 124 public final void showFinalResult() { 125 System.out.println("Best found score: " + currentState.getScore()); 126 127 for (Point p : currentState.getPoints()) 128 System.out.println(p); 129 } 130 131 public abstract void run(); 132 public abstract boolean step(); 133 134} 135 136 137package tsp; 138 139import java.util.ArrayList; 140import java.util.Collections; 141import java.util.List; 142 143public class TSPState { 144 private final ArrayList<Point> points; 145 private boolean scoreCalculated = false; 146 private double score; 147 148 public TSPState(List<Point> points) { 149 this.points = new ArrayList<Point>(points); 150 this.scoreCalculated = false; 151 this.score = 0; 152 } 153 154 public TSPState(TSPState s) { 155 this.points = new ArrayList<Point>(s.getPoints()); 156 this.scoreCalculated = s.scoreCalculated; 157 this.score = s.score; 158 } 159 160 public int size() { 161 return points.size(); 162 } 163 164 public List<Point> getPoints() { 165 return Collections.unmodifiableList(points); 166 } 167 168 public List<Point> getMutablePoints() { 169 scoreCalculated = false; 170 return points; 171 } 172 173 public double getScore() { 174 if (!scoreCalculated) { 175 score = calculateScore(); 176 scoreCalculated = true; 177 } 178 179 return score; 180 } 181 182 private double calculateScore() { 183 if (points.size() <= 1) 184 return 0; 185 186 double sumDistance = 0; 187 for (int i = 1; i < points.size(); ++i) { 188 Point p1 = points.get(i - 1); 189 Point p2 = points.get(i); 190 191 sumDistance += p1.attDistance(p2); 192 } 193 194 sumDistance += 195 points.get(0).attDistance(points.get(points.size() - 1)); 196 return sumDistance; 197 198 } 199 200 // 点P_1とP_jの距離を返す 201 public double distance(int i, int j) { 202 Point p1 = points.get(i % points.size()); 203 Point p2 = points.get(j % points.size()); 204 return p1.attDistance(p2); 205 } 206 207 // 点Pi, Pjを入れ替える 208 public void swap(int i, int j) { 209 Point p = points.get(i); 210 points.set(i, points.get(j)); 211 points.set(j, p); 212 213 scoreCalculated = false; 214 } 215 216 217} 218 219 220package tsp; 221 222public interface TSPSolver { 223 // 現在の状態集合の中で最もよいものを得る。1つしかなければそれを返す。 224 public TSPState getBestState(); 225 226 // 計算を 1step 進める 227 public abstract boolean step(); 228} 229 230package tsp; 231 232public class Point { 233 public double x, y; 234 public Point(double x, double y) { 235 this.x = x; 236 this.y = y; 237 } 238 239 public double distance(Point p) { 240 double dx = x - p.x; 241 double dy = y - p.y; 242 return Math.sqrt(dx * dx + dy * dy); 243 } 244 245 public double attDistance(Point p) { 246 double dx = x - p.x; 247 double dy = y - p.y; 248 double r = Math.sqrt((dx * dx + dy * dy) / 10); 249 double t = Math.round(r); 250 if (t < r) 251 return t + 1; 252 else 253 return t; 254 } 255 256} 257

###試したこと

main文でSystem.out.println(hc.step());としても結果はfalseと出るだけでした.
あとはPointクラスのコンストラクタで乱数がちゃんと生成されているかも確認しましたが,正常に生成されていました.

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

abs123

2016/09/06 10:59

TSPStateクラスのコードを追加してください。
randmaster

2016/09/06 11:07

失礼いたしました.追加しました
guest

回答1

0

ベストアンサー

最初にPointのリストを作ってますが、Pointのx, yは0.0から1.0の範囲で使う想定なのですか?
以下で試したら、結果は変わりました。

lang

1// 試しに変更 2 double x = rnd.nextDouble() * rnd.nextInt(100); 3 double y = rnd.nextDouble() * rnd.nextInt(100);

Pointクラスですが、toString()メソッドをオーバライドしないため、意図していない表示になっているようです。Eclipseだと以下のように自動で追加するメニューがあります。

lang

1 // 追加 2 @Override 3 public String toString() { 4 return "Point [x=" + x + ", y=" + y + "]"; 5 }

上記変更をした時の結果の一例です。

maxImprove = 2.000000, i = 3, j = 4 crimb. maxImprove = 0.000000, i = -1, j = -1 Best found score: 60.0 Point [x=0.3044315899218193, y=64.43968556761287] Point [x=27.97325259991755, y=74.05875329212344] Point [x=42.865450704182685, y=15.452900591989147] Point [x=2.883819982780386, y=13.108287501315047] Point [x=1.918928403948095, y=17.61555117140871]

投稿2016/09/06 12:20

java-beginner

総合スコア452

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

randmaster

2016/09/12 12:09

感謝いたします. ありがとうございました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問