有没有更优雅的方法来搜索站索引?
Is there a more elegant way to search the station index?
我研究机器人装配线平衡问题的遗传算法(将装配操作和机器人分配到工位,以最小化给定工位数量的循环时间)。该解决方案由一个 ArrayList (configuration
) 表示,它包含分配给不同站的序列中的所有操作。此外,我还有两个 ArrayLists (robotAssignment
, operationPartition
),它们指示新站点的起点以及分配给站点的机器人。例如,候选解决方案如下所示(configuration
、robotAssignment
、operationPartition
从上到下):
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);}
我研究机器人装配线平衡问题的遗传算法(将装配操作和机器人分配到工位,以最小化给定工位数量的循环时间)。该解决方案由一个 ArrayList (configuration
) 表示,它包含分配给不同站的序列中的所有操作。此外,我还有两个 ArrayLists (robotAssignment
, operationPartition
),它们指示新站点的起点以及分配给站点的机器人。例如,候选解决方案如下所示(configuration
、robotAssignment
、operationPartition
从上到下):
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);}