Hier mal meine Klassen.. Funktioniert schon ganz gut. Aber ich denke es gibt noch Verbesserungspotential. Wenn ihr ne Idee habt -> her damit!
import java.util.Random; class City { public float x = 10; public float y = 1; public City() { Random generator = new Random(); this.x = generator.nextFloat(); this.y = generator.nextFloat(); } }
import java.lang.Math; import java.util.Random; public class Path { int number; //Anzahl der STädte int i = 0; int j = 1; City[] cities; //Array von Städten //Konstruktor, erstellt ein Array mit n STädten public Path(int number){ this.number = number; cities = new City[number]; while(i <= cities.length-1){ cities[i] = new City(); i++; } } private float distance(City c, City d){ float distance = (float) Math.sqrt(Math.pow(c.x - d.x, 2) + Math.pow(c.y - d.y, 2)); return distance; } //Berechnet die Kosten des Pfades private float cost(){ float pathlength = 0; int n = 1; int m = 0; while(n < cities.length){ pathlength = pathlength + distance(cities[m], cities[n]); n++; m++; } return pathlength; } /*//tauscht zwei gegebene Felder public void replace(int a, int b){ City cache1 = cities[a]; City cache2 = cities[b]; cities[a] = cache2; cities[b] = cache1; }*/ //vertauscht zwei Felder eines gegebenen Path public void replace(int a, int b, Path c){ City cache1 = c.cities[a]; City cache2 = c.cities[b]; c.cities[a] = cache2; c.cities[b] = cache1; } //hillclimbing-Algorithmus public void hillclimbing(){ Path copy = this; float cost = this.cost(); System.out.println("Die ursprüngliche Pfadlänge ist: " + cost); System.out.println("Folgende Optimierungen wurden der Reihe nach vorgenommen:"); float cost2 = 0; int length = this.cities.length; //Zufallszahlen um die FElder des Arrays anzusteuern Random gen = new Random(); int a = gen.nextInt(length - 1); int b = gen.nextInt(length - 1); int test = 0; while(test <= 10000){ copy.replace(a, b, copy); cost2 = copy.cost(); //Wenn der neue Pfad kürzer ist als der alte if(cost2 < cost) { this.cities = copy.cities; System.out.println(cost2); a = gen.nextInt(length); b = gen.nextInt(length); cost = cost2; } else { a = gen.nextInt(length); b = gen.nextInt(length); } test++; } } public static void main(String[] args) { //int i = 0; //int j = 1; Path r = new Path(5); r.hillclimbing(); } }