basicneighbormanager.java

来自「用于求解TSP(Traveling salesman problem」· Java 代码 · 共 111 行

JAVA
111
字号
/**
 * Description: provide the information for the graph problem
 *
 * @ Author        Create/Modi     Note
 * Xiaofeng Xie    Apr 7, 2005     Inside PheromoneHolder
 * Xiaofeng Xie    Apr 15, 2005    neighborhood manager for nearest
 * Xiaofeng Xie    May 22, 2005    general neighborhood manager
 * Xiaofeng Xie    Apr 28, 2006    MAOS-TSP Beta 1.1.002
 *
 */

package maosKernel.knowledge;

import java.util.*;

import Global.basic.*;
import Global.basic.data.matrix.*;
import Global.methods.*;
import maosKernel.represent.space.*;

public class BasicNeighborManager extends AbsNeighborManager {
  protected int norm_nn_nodes = 0;            /* number of predefined nearest neighbours in tour construction */
  protected int[][] norm_DistSortedIDMatrix;  // the primate IDs of N_neighbor nodes sorted by distance

  public String getSummary() {
    String str = this.getClass().getName()+" norm_nn_nodes="+norm_nn_nodes;
    return str;
  }

  public BasicNeighborManager(ISquareIMatrixEngine costMatrix, int norm_nn_nodes) {
    setNeighborManager(costMatrix, norm_nn_nodes);
  }

  public void setNeighborManager(ISquareIMatrixEngine costMatrix, int norm_nn_nodes) {
    int nodeNumber = costMatrix.getNodeNumber();
    norm_DistSortedIDMatrix = new int[nodeNumber][];
    setNN_NodeNumber(norm_nn_nodes);
    init_Norm_DistMatrix(costMatrix);
  }


  public BasicNeighborManager(ISquareIMatrixEngine costMatrix) {
    this(costMatrix, 5);
  }

  public void setNN_NodeNumber(int nn_Nodes) {
    norm_nn_nodes = Math.min(nn_Nodes, getNodeNumber()-1);
  }

  private void init_Norm_DistMatrix(ISquareIMatrixEngine dataMatrix) {
    int nodeNumber = dataMatrix.getNodeNumber();
    norm_DistSortedIDMatrix = new int[nodeNumber][];
    IndexedIValue[] idValueSet = new IndexedIValue[nodeNumber];
    for (int j=0; j<nodeNumber; j++) {
      idValueSet[j] = new IndexedIValue();
    }
    int elemNumber = dataMatrix.getNodeNumber();
    for (int i=0; i<nodeNumber; i++) {
      idValueSet[i].value = -Integer.MAX_VALUE;
      for (int j=0; j<nodeNumber; j++) {
        idValueSet[j].index = j;
        idValueSet[j].value = dataMatrix.getValueAt(i, j);
      }
      idValueSet[i].value = -Integer.MAX_VALUE;
      Arrays.sort(idValueSet);
      norm_DistSortedIDMatrix[i] = new int[elemNumber-1];
      for (int j=0; j<norm_DistSortedIDMatrix[i].length; j++) {
        norm_DistSortedIDMatrix[i][j] = idValueSet[j+1].index;
      }
    }
  }

  public int getNodeNumber() {
    return norm_DistSortedIDMatrix.length;
  }

  public int getNNNumberUpLimit() {
    return norm_nn_nodes;
  }

  public int[] getNNArrayAt(int index) {
    return norm_DistSortedIDMatrix[index];
  }

  public int getElementNumberAt(int index) {
    return norm_nn_nodes;
  }

  //For debug
  public int[] getOrder(AISearchState point, boolean isForward) {
    int[] nodes = point.getIArray();
    int[] orderIDs = new int[nodes.length];
    if (isForward) {
      for (int i=0; i<nodes.length; i++) {
        orderIDs[i] = getOrder(nodes[i], nodes[(i+1)%nodes.length]);
      }
    } else {
      for (int i=0; i<nodes.length; i++) {
        orderIDs[i] = getOrder(nodes[(i+1)%nodes.length], nodes[i]);
      }
    }
    return orderIDs;
  }

  private int getOrder(int startNode, int endNode) {
    return BasicArray.getExactIndex(norm_DistSortedIDMatrix[startNode], endNode);
  }

}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?