我可以根据调用它的对象在对象的字段中存储不同的值吗?

Can I store different values in an object's field depending on the object it is called from?

我研究机器人装配线平衡问题的遗传算法(将装配操作和机器人分配到工位,以最小化给定工位数量的循环时间)。该解决方案由一个 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 被分配给站 2 并且机器人 1 被使用,因为 operationPartition 给出了 configuration 中新站的起始索引。

在ArrayList的帮助下operationPartition我总能弄清楚一个操作的位置。但是,我更愿意将站点索引存储在 class Operation 本身的对象中。我用 class 变量 stationIndex 创建了一个 class Operation。所有操作都添加到另一个 class OperationManager 中,后者将所有操作保存在 ArrayList 中。我的 class Configuration 用于创建新配置并包括来自 OperationManager.

的所有操作

我的问题是我只能存储一次操作的 stationIndex 而不是针对每个配置(至少我想不出如何做到这一点)。举个例子,假设我们有两种配置:

    Configuration conf1 = new Configuration();
    Configuration conf2 = new Configuration();
    conf1.generateIndividual();
    conf2.generateIndividual();

现在,如果我在 conf1 中更改 operation1stationIndex 它也会在 conf2 中更改,因为这个变量 "belongs" 到操作和确实取决于配置。

有什么方法可以根据配置在 stationIndex 中存储不同的值吗?如果可能的话,这将是我的首选解决方案。

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;
}

Class运营经理:

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();
}

Class 配置(不完整但包含所有相关部分):

public class Configuration {

int initialCycleTime = RobotManager.calcLowerBound();

// Holds our array of operations
private ArrayList configuration = new ArrayList<Operation>();
private ArrayList robotAssignment = new ArrayList<Robot>();
private ArrayList operationPartition = new ArrayList<Integer>();

// Cache
private int fitness = 0;

// Constructs a blank configuration
public Configuration() {
    for (int i = 0; i < OperationManager.numberOfOperations(); i++) {
        configuration.add(null);
    }

    for (int i = 0; i < GA_RALBP.numberOfStations; i++) {
        operationPartition.add(null);
    }

    for (int i = 0; i < GA_RALBP.numberOfStations; i++) {
        robotAssignment.add(null);
    }

}

// Creates a random individual
public void generateIndividual() {
    // Loop over all operations and add them to our configuration
    for (int operationIndex = 0; operationIndex < OperationManager.numberOfOperations(); operationIndex++) {
        setOperation(operationIndex, OperationManager.getOperation(operationIndex));
    }
    // Randomly shuffle the configuration
    Collections.shuffle(configuration);
}

任一站索引是否是操作对象的一部分。

如果站点索引 是 Operation 对象的 部分,那么您需要用多个 Operation 对象来表示相同的操作,因为您需要 Operation 对象在一种配置中,在一种配置中保存与另一种配置不同的站点索引。您可以通过克隆从 OperationManager.getOperation() 返回的对象在 Configuration.generateIndividual() 中实现这一点。

或者,您可以从操作对象中删除站点索引。例如,您可以通过操作在 Configuration.

列表中的位置来表示站点索引