2

注意:此代码是 Pascal Van Hentenryck 在 Coursera 上的离散优化作业的一个正在进行的解决方案。那些不想看到可能的解决方案或提示的人可能不想进一步阅读。

我对Java相当陌生,所以这可能是一个完全错误的代码。但是我在这段代码上花了一段时间没有进展。我正在单步执行 Eclipse 中的代码。

当我逐步执行下面的代码时,我正在尝试更新实例,branch[0]但是当我更新branch[0].paththisNode.path也会更新,当我更新时也会更新branch[1].path(至少如监视窗口所示)。branch[0].paththisNode.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

谢谢你的时间,维奈

4

2 回答 2

3

看看这些代码:

branch[0].path = thisNode.path;
...
branch[1].path = thisNode.path;

的类型pathint[],这意味着您正在复制引用。你实际上只有一个数组对象,在上面的代码之后,所有的branch[0].path,thisNode.pathbranch[1].path引用那个数组。

您可能希望克隆阵列以创建独立副本:

branch[0].path = thisNode.path.clone();
...
branch[1].path = thisNode.path.clone();
于 2013-07-24T07:27:10.707 回答
0

你需要考虑什么类型的元素是path. 如果它不是原始的,那么当你这样做时branch[0].path = thisNode.path,你就是在branch[0].path指出thisNode.path. 从那以后,它们实际上是对同一个对象的两个引用,并且您使用任何引用所做的任何更改都会影响您通过另一个看到的内容。

于 2013-07-24T07:31:21.023 回答