有没有更优雅的方法来搜索站索引?

Is there a more elegant way to search the station index?

我研究机器人装配线平衡问题的遗传算法(将装配操作和机器人分配到工位,以最小化给定工位数量的循环时间)。该解决方案由一个 ArrayList (configuration) 表示,它包含分配给不同站的序列中的所有操作。此外,我还有两个 ArrayLists (robotAssignment, operationPartition),它们指示新站点的起点以及分配给站点的机器人。例如,候选解决方案如下所示(configurationrobotAssignmentoperationPartition 从上到下):

Initial cycle time: 50.0
|2|7|3|9|1|5|4|6|8|10|
|2|1|3|2|
|0|2|5|7|

从这个解决方案表示我们知道操作 3、9 和 1 被分配给第二个工位并且使用了机器人 1。

我需要跟踪分配给操作的站点。我尝试了很多次将其存储在对象 Operation 本身中,但我总是遇到问题,因此我想编写一个方法来为我提供操作的站点索引。

这是我目前编写的代码:

// Get the station of an operation
public int getStation(Operation operation) {
    int stationIndex = 0;
    int position = configuration.indexOf(operation);

    for (int i = 0; i < GA_RALBP.numberOfStations ; i++ ) {
        if (i < GA_RALBP.numberOfStations - 1 &&    operationPartition.get(i) != null) {
            if (isBetween(position, (int) operationPartition.get(i), (int) operationPartition.get(i + 1))) {
                return stationIndex + 1;
            } else {
                stationIndex++;
            }
        }
        else if (i >= GA_RALBP.numberOfStations - 1 && operationPartition.get(i) != null) {
            if (isBetween(position, (int) operationPartition.get(i), configurationSize())) {
                return stationIndex + 1;
            }
        }
    }
    return -1;
}

// Check if value x is between values left and right including left
public static boolean isBetween(int x, int left, int right) {
    if (left <= x && x < right ) {
        return true;
    }
    else {
        return false;
    }
}

但是,这似乎 (a) 不是很优雅,并且 (b) 如果我必须为大量操作执行此操作,运行时可能会成为问题。有人知道如何更有效地解决这个问题吗?

为什么不显式分区(替换你的 operationPartition)——类似于:

    Map<Integer, Integer> operationToStationMapping = new HashMap<>();
    operationToStationMapping.put(2,0);
    operationToStationMapping.put(7,0);
    operationToStationMapping.put(3,2);
    operationToStationMapping.put(9,2);
    operationToStationMapping.put(1,2);
    operationToStationMapping.put(5,5);
    operationToStationMapping.put(6,7);
    operationToStationMapping.put(8,-1);
    operationToStationMapping.put(10,-1);

然后 getStation() 变成:

getStation(int operation) {return operationToStationMapping.get(operation);}