我致力于机器人装配线平衡问题的遗传算法(将装配操作和机器人分配给工作站以最小化给定数量的工作站的循环时间)。该解决方案由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被分配给站2并且使用了机器人1,因为operationPartition
给出了configuration
中新站的起始索引。
在ArrayList operationPartition
的帮助下,我总能找出一个操作站。但是,我更希望将站索引存储在类Operation
本身的对象中。我创建了一个带有类变量Operation
的类stationIndex
。所有操作都被添加到另一个类OperationManager
,该类保存ArrayList中的所有操作。我的班级Configuration
用于创建新配置,并包含OperationManager
中的所有操作。
我的问题是我只能存储一次stationIndex
操作,而不能存储每个配置(至少我无法知道如何执行此操作)。举个例子,假设我们有两个配置:
Configuration conf1 = new Configuration();
Configuration conf2 = new Configuration();
conf1.generateIndividual();
conf2.generateIndividual();
现在,如果我更改了stationIndex
中operation1
的{{1}},它也会在conf1
中更改,因为此变量“属于”操作,并且取决于配置。
有没有办法在conf2
中存储不同的值,具体取决于配置?如果这在某种程度上可行,这将是我的首选解决方案。
stationIndex
类OperationManager:
public class Operation {
int[] predecessors;
int stationIndex;
// Construct an operation with given predecessors
public Operation(int[] predecessors){
this.predecessors = predecessors;
}
// Get operations's predecessors
public int[] getPredecessors() {
return this.predecessors;
}
// Set operations's station index
public void setStationIndex(int stationIndex){
this.stationIndex = stationIndex;
}
// Get operations's station index
public int getStationIndex(){
return this.stationIndex;
}
班级配置(不完整但包含所有相关部分):
public class OperationManager {
// Holds our operations
private static ArrayList operations = new ArrayList<Operation>();
// Adds an operation
public static void addOperation(Operation operation) {
operations.add(operation);
}
// Get an operation
public static Operation getOperation (int index){
return (Operation)operations.get(index);
}
// Get index of an operation
public static int getOperationIndex(Operation operation) {
return operations.indexOf(operation);
}
// Get the number of operations
public static int numberOfOperations() {
return operations.size();
}
答案 0 :(得分:0)
站点索引是否是Operation对象的一部分。
如果站索引是是Operation对象的一部分,那么您需要用多个Operation
对象表示相同的操作,因为您希望一个配置中的Operation对象保持不变一种配置中的另一个站索引。您可以通过克隆从Configuration.generateIndividual()
返回的对象,在OperationManager.getOperation()
中实现这一目标。
或者,您可以从Operation对象中删除工作站索引。例如,您可以通过Configuration
中列表中操作的位置来表示工作站索引。