我可以根据调用它的对象在对象的字段中存储不同的值吗?
Can I store different values in an object's field depending on the object it is called from?
我研究机器人装配线平衡问题的遗传算法(将装配操作和机器人分配到工位,以最小化给定工位数量的循环时间)。该解决方案由一个 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 被分配给站 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
中更改 operation1
的 stationIndex
它也会在 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
.
列表中的位置来表示站点索引
我研究机器人装配线平衡问题的遗传算法(将装配操作和机器人分配到工位,以最小化给定工位数量的循环时间)。该解决方案由一个 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 被分配给站 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
中更改 operation1
的 stationIndex
它也会在 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
.