minimalspanningtree.java
来自「经典的货郎担问题解决办法」· Java 代码 · 共 764 行 · 第 1/2 页
JAVA
764 行
if (DB) { System.out.println( "detaching treeNode/codonName" + currentTreeNode + "/" + currentCodonName ); } attached[currentTreeNode] = false; nodeRepeats[currentCodonName]--; nodesLeft--; if (DB) { System.out.println( "m_minimalSpanningTree after popped codon delete of greedily main while loop:\r\n" + Debugging.dump( m_minimalSpanningTree ) ); System.out.println( "attached after popped codon delete of greedily main while loop:\r\n" + Debugging.dump( attached ) ); System.out.println( "fitnessChange after popped codon delete of greedily main while loop:\r\n" + Debugging.dump( fitnessChange ) ); System.out.println( "nodeRepeats after popped codon delete of greedily main while loop:\r\n" + Debugging.dump( nodeRepeats ) ); System.out.println( "fitnessGains heap after popped codon delete of greedily main while loop:\r\n" + fitnessGains.toString() ); }/*** Find four MST nodes we need to recompute and re-heapify fitness gains.*/ int predecessorTreeNode = currentTreeNode; while ( !attached[predecessorTreeNode] ) { predecessorTreeNode = ( predecessorTreeNode - 1 + m_treeSize ) % m_treeSize ; } int predecessorsPredecessorTreeNode = ( predecessorTreeNode - 1 + m_treeSize ) % m_treeSize ; while ( !attached[predecessorsPredecessorTreeNode] ) { predecessorsPredecessorTreeNode = ( predecessorsPredecessorTreeNode - 1 + m_treeSize ) % m_treeSize ; } int successorTreeNode = currentTreeNode; while ( !attached[successorTreeNode] ) { successorTreeNode = ( successorTreeNode + 1 + m_treeSize ) % m_treeSize ; } int successorsSuccessorTreeNode = ( successorTreeNode + 1 ) % m_treeSize ; while ( !attached[successorsSuccessorTreeNode] ) { successorsSuccessorTreeNode = ( successorsSuccessorTreeNode + 1 ) % m_treeSize ; }/*** Remove the superseded fitness gain indicators from the fitness gains** heap, for the still attached points just before and behind the node** we unattached, which had been using it to determine their fitness** gains.*/ if ( nodeRepeats[ m_minimalSpanningTree[predecessorTreeNode] ] > 1 ) { int scapegoat = fitnessGains.findByValue ( (ContentComparable) fitnessChange[ predecessorTreeNode ] ); fitnessGains.delete( scapegoat ); fitnessChange[predecessorTreeNode] = new IntDoublePairSortedOnDouble ( predecessorTreeNode, fitnessGained ( predecessorsPredecessorTreeNode, predecessorTreeNode, successorTreeNode, world ) ); if (DB) { System.out.println( "pushing " + fitnessChange[predecessorTreeNode].toString() ); } fitnessGains.push( (ContentComparable) new IntDoublePairSortedOnDouble( fitnessChange[predecessorTreeNode] ) ); if (DB) { System.out.println( "m_minimalSpanningTree after predecessor node delete and reinsert of greedily main while loop:\r\n" + Debugging.dump( m_minimalSpanningTree ) ); System.out.println( "attached after predecessor node delete and reinsert of greedily main while loop:\r\n" + Debugging.dump( attached ) ); System.out.println( "fitnessChange after predecessor node delete and reinsert of greedily main while loop:\r\n" + Debugging.dump( fitnessChange ) ); System.out.println( "nodeRepeats after predecessor node delete and reinsert of greedily main while loop:\r\n" + Debugging.dump( nodeRepeats ) ); System.out.println( "fitnessGains heap after predecessor node delete and reinsert of greedily main while loop:\r\n" + fitnessGains.toString() ); } } if ( nodeRepeats[ m_minimalSpanningTree[successorTreeNode] ] > 1 ) { int scapegoat = fitnessGains.findByValue ( (ContentComparable) fitnessChange[ successorTreeNode ] ); fitnessGains.delete( scapegoat ); fitnessChange[successorTreeNode] = new IntDoublePairSortedOnDouble ( successorTreeNode, fitnessGained ( predecessorTreeNode, successorTreeNode, successorsSuccessorTreeNode, world ) ); if (DB) { System.out.println( "pushing " + fitnessChange[successorTreeNode].toString() ); } fitnessGains.push( (ContentComparable) new IntDoublePairSortedOnDouble( fitnessChange[successorTreeNode] ) ); if (DB) { System.out.println( "m_minimalSpanningTree after successor node delete and reinsert of greedily main while loop:\r\n" + Debugging.dump( m_minimalSpanningTree ) ); System.out.println( "attached after successor node delete and reinsert of greedily main while loop:\r\n" + Debugging.dump( attached ) ); System.out.println( "fitnessChange after successor node delete and reinsert of greedily main while loop:\r\n" + Debugging.dump( fitnessChange ) ); System.out.println( "nodeRepeats after successor node delete and reinsert of greedily main while loop:\r\n" + Debugging.dump( nodeRepeats ) ); System.out.println( "fitnessGains heap after successor node delete and reinsert of greedily main while loop:\r\n" + fitnessGains.toString() ); } } } } boolean isIn[] = new boolean[m_genomeLength]; int dnl[] = new int[m_genomeLength]; for ( int i = 0; i < m_genomeLength; i++ ) { isIn[i] = false; dnl[i] = -1; } int nodeCount = 0; for ( int i = 0; i < m_treeSize; i++ ) { int codonName = m_minimalSpanningTree[i]; if ( ( attached[i] == true ) && ( isIn[ codonName ] == false ) ) { if ( nodeCount > m_genomeLength - 1 ) { kablooie( "nodeCount too big in getBestDerivedNodeList()" ); } else { isIn[ codonName ] = true; dnl[ nodeCount ] = codonName; nodeCount++; } } } if ( nodeCount != m_genomeLength ) { kablooie( "wrong nodeCount in getBestDerivedNodeList()" ); } m_mstCanvas.drawEdges ( dnl, nodeCount, world.getCityDrawAtLocations(), world.CITY_X, world.CITY_Y, TravellerColors.COLOR_ALTERNATE_ROUTES, true // closed path ); m_mstCanvas.drawEdges ( m_minimalSpanningTree, m_treeSize, world.getCityDrawAtLocations(), world.CITY_X, world.CITY_Y, TravellerColors.COLOR_SEED_ROUTE, true // closed path ); m_mstCanvas.drawNodes ( world.getCityDrawAtLocations(), ValuatorControls.getNumberOfCities(), world.CITY_X, world.CITY_Y, TravellerColors.COLOR_CITY ); m_mstCanvas.drawImage(); return dnl; } private double fitnessGained ( int previousNode, int currentNode, int nextNode, TravellerWorld world ) { return world.getDistance ( m_minimalSpanningTree[previousNode], m_minimalSpanningTree[currentNode] ) + world.getDistance ( m_minimalSpanningTree[currentNode], m_minimalSpanningTree[nextNode] ) - world.getDistance ( m_minimalSpanningTree[previousNode], m_minimalSpanningTree[nextNode] ) ; } public int [] getDerivedNodeList( TravellerWorld world ) { int dnl[] = new int[m_genomeLength]; boolean attached[] = new boolean[m_treeSize]; for (int i = 0; i < m_treeSize; i++) { attached[i] = false; } // Start at some random spot; that's how we get differing chromosomes. // int index = m_mt.nextInt(m_treeSize); for ( int i = 0; i < m_genomeLength; i++ ) { int index = m_mt.nextInt(m_treeSize); for ( int j = 0; j < m_treeSize; j++ ) { int thisIndex = ( j + index ) % m_treeSize; if ( m_minimalSpanningTree[ thisIndex ] == i ) { attached[ thisIndex ] = true; break; } } }/*** Display progress.*/ m_mstCanvas.drawEdges ( m_minimalSpanningTree, m_treeSize, world.getCityDrawAtLocations(), world.CITY_X, world.CITY_Y, TravellerColors.COLOR_SEED_ROUTE, true // closed path ); m_mstCanvas.drawNodes ( world.getCityDrawAtLocations(), ValuatorControls.getNumberOfCities(), world.CITY_X, world.CITY_Y, TravellerColors.COLOR_CITY ); m_mstCanvas.drawImage(); // m_mstCanvas.clearPlayfield(); int nodesFilled = 0; for ( int j = 0; j < m_treeSize; j++ ) { if ( attached[ j ] ) { if ( nodesFilled >= m_genomeLength ) { kablooie( "nodesFilled >= m_genomeLength" ); break; } dnl[nodesFilled] = m_minimalSpanningTree[j]; nodesFilled++;/*** Unfortunately, though drop dead gorgeous, this is unbearably slow for** big problems.** ** FIXME Put in a "show detailed progress" checkbox so user can enable** this.*//* m_mstCanvas.drawEdges ( dnl, nodesFilled, world.getCityDrawAtLocations(), world.CITY_X, world.CITY_Y, TravellerColors.COLOR_ROUTE, false // closed path ); m_mstCanvas.drawImage();*/ } } m_mstCanvas.drawEdges ( dnl, nodesFilled, world.getCityDrawAtLocations(), world.CITY_X, world.CITY_Y, TravellerColors.COLOR_ALTERNATE_ROUTES, true // closed path ); m_mstCanvas.drawEdges ( m_minimalSpanningTree, m_treeSize, world.getCityDrawAtLocations(), world.CITY_X, world.CITY_Y, TravellerColors.COLOR_SEED_ROUTE, true // closed path ); m_mstCanvas.drawNodes ( world.getCityDrawAtLocations(), ValuatorControls.getNumberOfCities(), world.CITY_X, world.CITY_Y, TravellerColors.COLOR_CITY ); m_mstCanvas.drawImage();// Debugging.snooze( VIEWING_DELAY ); return dnl; } private void kablooie(String why) { System.out.println ( "MinimalSpanningTree evoked kablooie()" + "\r\n" + "because " + why ); }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?