注意:此代码是Pascal Van Hentenryck在Coursera上进行离散优化中的作业的一项正在进行的解决方案。那些不想看到可能的解决方案或提示的人可能不想进一步阅读。
我对Java很新,所以这可能是一个完全错误的代码。但是我在这段代码上花了一些时间没有进展。我正在逐步完成eclipse中的代码。
当我单步执行下面的代码时,我正在尝试更新branch[0]
的实例但是
当我更新branch[0].path
时,thisNode.path
也会更新
当我更新branch[1].path
时,branch[0].path
和thisNode.path
也会更新(至少在监视窗口显示时)。
我在这里做错了什么?
void iterateOneStep(BnBNode thisNode, int next_path){
BnBNode [] branch;
branch = new BnBNode [2];
//item not picked
branch[0] = new BnBNode(items.size());
branch[0].availableCapacity = thisNode.availableCapacity;
branch[0].path = thisNode.path;
branch[0].path[next_path] = 0;
branch[0].val = thisNode.val;
//item picked
branch[1] = new BnBNode(items.size());
branch[1].availableCapacity = thisNode.availableCapacity - items.get(next_path).weight;
branch[1].path = thisNode.path;
branch[1].path[next_path] = 1;
branch[1].val = thisNode.val+items.get(next_path).value;
..............
班级BnBNode是
public class BnBNode {
int[] path;
int val;
int availableCapacity;
int potentialVal;
int optimum;
BnBNode(int numItems) {
path = new int[numItems];
numItems--;
while (numItems >= 0) {
path[numItems] = -1;
numItems--;
}
val = 0;
optimum = 0;
}
}
完整代码位于https://github.com/vinaysamuel/knapsack/tree/master/src
谢谢你的时间, 维奈
答案 0 :(得分:3)
看看这些代码:
branch[0].path = thisNode.path;
...
branch[1].path = thisNode.path;
path
的类型是int[]
,这意味着您正在复制引用。您实际上只有一个数组对象,在上面的代码之后,所有branch[0].path
,thisNode.path
和branch[1].path
都引用了该单个数组。
您可能希望克隆数组以创建独立副本:
branch[0].path = thisNode.path.clone();
...
branch[1].path = thisNode.path.clone();
答案 1 :(得分:0)
您需要考虑path
的元素类型。如果它不是原始的,那么当您执行branch[0].path = thisNode.path
时,您将branch[0].path
指向thisNode.path
。从那时起,它们实际上是对同一个对象的两个引用,并且您使用任何引用所做的任何更改都会影响您通过另一个引用所看到的内容。