我致力于机器人装配线平衡问题的遗传算法(将装配操作和机器人分配给工作站以最小化给定数量的工作站的循环时间)。该解决方案由ArrayList(configuration
)表示,该ListList保存分配给不同站的序列中的所有操作。此外,我还有两个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被分配给第二个sation并且使用了机器人1.
我需要跟踪分配操作的电台。我尝试了很多将它存储在Object 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)如果我必须为大量操作执行此操作,则运行时可能会成为问题。有没有想过如何更有效地解决这个问题?
答案 0 :(得分:0)
为什么不明确分区(替换你的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);}