2015-10-23 2 views
0

Так что я 100% в недоумении относительно того, что вызывает что-то подобное. Вот весь раздел кода, который я работаю сМетод hashMap get (key) возвращает только последнюю запись

public static void getBestHeuristic(int[] nextParent) { 

    int bestHeuristic = 0; 

    Random rndm = new Random(); 
    int randomIndex = 0; 
    HashMap<Integer, int[]> childHuristics = new HashMap<Integer, int[]>(); 
    int k = 0; 
    while (k < nextParent.length - 1) { 
     for (int i = 0; i < (nextParent.length) - 2; i++) { 
      randomIndex = rndm.nextInt(nextParent.length/5) + i; 
      int temp = nextParent[i]; 
      nextParent[i] = nextParent[randomIndex]; 
      nextParent[randomIndex] = temp; 
     } 
     // Assign this random set to the child 
     int[] childArray = nextParent; 

     int childDistance = 0; 

     // Calculate the heuristic of the new current child 
     for (int j = 0; j < childArray.length - 1; j++) { 
      childDistance += cities[childArray[j]][childArray[j + 1]]; 
     } 

     childHuristics.put(childDistance, childArray); 

     // Display the current values added to the HashMap 
     System.out.println("Distance: " + childDistance); 
     System.out.println(Arrays.toString(childArray)); 
     System.out.println(); 

     // Keep track of the lowest value 
     if (bestHeuristic == 0) { 
      bestHeuristic = childDistance; 
     } else if (childDistance < bestHeuristic) { 
      bestHeuristic = childDistance; 
     } 

     k++; 
    } 
    // Display the lowest distance 
    System.out.println(); 
    System.out.println("The best child was: "); 
    System.out.println("Distance: " + bestHeuristic); 
    System.out.println(Arrays.toString(childHuristics.get(bestHeuristic))); 

Вот вывод, что я получаю от этого:

Distance: 670 
[12, 5, 6, 10, 2, 3, 4, 8, 0, 9, 7, 1, 14, 11, 13] 

Distance: 680 
[6, 10, 2, 12, 4, 8, 5, 0, 9, 7, 3, 14, 13, 11, 1] 

Distance: 611 
[2, 12, 6, 4, 5, 8, 9, 7, 0, 10, 3, 13, 14, 11, 1] 

Distance: 668 
[2, 4, 5, 12, 9, 7, 6, 0, 3, 13, 10, 8, 14, 11, 1] 

Distance: 684 
[2, 5, 9, 7, 6, 12, 4, 13, 3, 8, 0, 14, 10, 11, 1] 

Distance: 634 
[2, 9, 5, 12, 6, 7, 4, 8, 3, 14, 0, 11, 13, 10, 1] 

Distance: 736 
[9, 12, 6, 7, 2, 8, 5, 4, 3, 11, 14, 13, 0, 10, 1] 

Distance: 622 
[9, 7, 6, 12, 5, 4, 3, 11, 8, 14, 0, 10, 1, 13, 2] 

Distance: 585 
[9, 7, 5, 6, 4, 11, 3, 12, 8, 0, 10, 13, 14, 1, 2] 

Distance: 554 
[9, 5, 7, 4, 6, 11, 8, 12, 3, 10, 0, 14, 13, 1, 2] 

Distance: 587 
[9, 7, 4, 6, 11, 5, 8, 3, 12, 0, 10, 1, 13, 14, 2] 

Distance: 575 
[7, 4, 6, 11, 8, 9, 5, 12, 3, 1, 0, 10, 14, 13, 2] 

Distance: 642 
[4, 6, 7, 8, 5, 12, 9, 3, 1, 0, 11, 14, 10, 13, 2] 

Distance: 634 
[4, 6, 7, 5, 9, 12, 1, 8, 0, 11, 10, 13, 14, 3, 2] 


The best child was: 
Distance: 554 
[4, 6, 7, 5, 9, 12, 1, 8, 0, 11, 10, 13, 14, 3, 2] 

Чтобы дать некоторый контекст, чтобы все это, в основном каждое число в каждом массиве имеет значение расстояния, связанное с ними. Это то, что представляет собой значение расстояния каждого из них. Массив городов - это 2D-массив, который содержит все эти значения расстояния. Это выглядит примерно так:

0 29 82 46 68 52 72 42 51 55 29 74 23 72 46 
29 0 55 46 42 43 43 23 23 31 41 51 11 52 21 
82 55 0 68 46 55 23 43 41 29 79 21 64 31 51 
46 46 68 0 82 15 72 31 62 42 21 51 51 43 64 
68 42 46 82 0 74 23 52 21 46 82 58 46 65 23 
52 43 55 15 74 0 61 23 55 31 33 37 51 29 59 
72 43 23 72 23 61 0 42 23 31 77 37 51 46 33 
42 23 43 31 52 23 42 0 33 15 37 33 33 31 37 
51 23 41 62 21 55 23 33 0 29 62 46 29 51 11 
55 31 29 42 46 31 31 15 29 0 51 21 41 23 37 
29 41 79 21 82 33 77 37 62 51 0 65 42 59 61 
74 51 21 51 58 37 37 33 46 21 65 0 61 11 55 
23 11 64 51 46 51 51 33 29 41 42 61 0 62 23 
72 52 31 43 65 29 46 31 51 23 59 11 62 0 59 
46 21 51 64 23 59 33 37 11 37 61 55 23 59 0 

Проблема Я бегу в, является то, что «получить (ключ)» метод HashMap, что у меня не возвращая массив, связанный с ключом, который я даю его ,

Это говорит Расстояние: 554 [4, 6, 7, 5, 9, 12, 1, 8, 0, 11, 10, 13, 14, 3, 2]

Когда расстояние 554 фактически накладывается на этот массив: [9, 5, 7, 4, 6, 11, 8, 12, 3, 10, 0, 14, 13, 1, 2]

Я не знаю, есть ли что-то не так с тем, как я помещаю их в HashMap или нет. Я попытался использовать TreeMap, чтобы просто заставить его сортироваться и получить первое значение, но результат был тот же.

Спасибо за ваше время.

+0

Не уверен, что именно вы делаете в первом цикле, но он плохо пахнет. Вы изменяете или заменяете содержимое nextParent в этом первом для цикла сразу в цикле while. Это может быть причиной того, что ваш выход не ожидается. – Jags

+0

Предложение: написать более короткие методы и использовать модульное тестирование при разработке вашего решения. Ваш подход потянуть всю логику в один метод ... а затем, когда весь код там, чтобы начать тестирование ... приводит именно к той проблеме, с которой вы сталкиваетесь прямо сейчас: у вас много кода и нет подсказки, с чего начать поиск проблем. – GhostCat

ответ

2

Это потому, что вы помещаете одну и ту же ссылку в карту несколько раз. Если вы

int[] childArray = nextParent.clone(); 

или

int[] childArray = Arrays.copyOf(nextParent, nextParent.length) 

вместо этого, вы будете использовать свежий массиву каждый раз.

+1

Или используйте ['Arrays.copyOf()'] (http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#copyOf%28int [],% 20int% 29) , который [может быть немного быстрее] (http://stackoverflow.com/a/15962949/905488). –

+0

Он изменяет входной массив nextParent еще до childArray .. кажется неправильным. – Jags

+0

@Jags Я согласен. Я не уверен точно, когда массив должен быть скопирован, но это основная проблема. –