使用fork / join的Java并行化组合

时间:2015-09-21 16:12:25

标签: java multithreading parallel-processing combinatorics fork-join

我正在尝试并行化组合优化问题。基本上,我想通过大小k的每个组合(n选择k),看看组合是否是最好的。我写了一个有效的顺序版本(这里是java代码):

<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.5/css/bootstrap.css" rel="stylesheet" />
<nav class="navbar navbar-fixed-top navbar-inverse">
  <div class="container-fluid no-padding">
    <div class="navbar-header">
      <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar" style="line-height: 30px;">
        <span class="sr-only">Toggle navigation</span>
        <span class="glyphicon glyphicon-menu-hamburger" style="color:#fff;"></span>
      </button>
      <a class="navbar-brand" href="#" style="line-height: 30px;">brand</a> 

    </div>
    <div id="navbar" class="collapse navbar-collapse">
      <ul class="nav navbar-nav">
        <!-- <li><a href="#contact">Button</a></li> -->
      </ul>
    </div>
    <!-- /.nav-collapse -->

    <!-- this is the second navbar element that never takes up the full width available-->
    <div class="nav navbar-default" style="background-color: #66CCFF;">
      <ul class="nav navbar-nav">
        <li>
          <a href="#" class="glyphicon glyphicon-search"></a>
        </li>
        <li class="divider-vertical"></li>
        <li>
          <a href="#" class="glyphicon glyphicon-cloud"></a>
        </li>
        <li class="divider-vertical"></li>
        <li>
          <a href="#" class="glyphicon glyphicon-th"></a>
        </li>
      </ul>
    </div>
  </div>
  <!-- /.container -->
</nav>
<!-- /.navbar -->

所以我的代码在递归树的叶子上进行计算,在叶子处,我将有一个大小为k的唯一组合,非常简单。现在我将它转换为fork / join代码,我没有得到正确的解决方案。这是我在java代码中的fork / join代码:

public int bestCombo(int[] al, int[] data, int start, int end, int index, int k) {
    if (index == k) {
        // you have unique combination
        return calculateBestCombination(data);
    } else {
        int best = 0;
        for (int i = start; i <= end && end-i+1 >= k-index; i ++){
            data[index] = al[i];
            int temp = bestCombo(al, data, i+1, end, index+1, k);
            if (best < temp) {
              best = temp
            }
        }
        return best;
    }
}

我很困惑,因为代码基本相同。唯一的区别是在fork / join中的for循环中,我在多线程中运行它。但是,我得到的解决方案完全不同,fork / join解决方案非常错误。谁知道为什么?

1 个答案:

答案 0 :(得分:0)

好的,我明白了。我是个白痴......问题如下:

public ParallelizeCombo(int[] arr, int[] data, int start, int end, int index, int k) {
    super();
    this.array = arr;
    this.data = data;
    this.start = start;
    this.end = end;
    this.index = index;
    this.k = k;
}

这里,this.data不是创建新数据而只是指向数据(通过引用)。因此,当您在特定时间对数据计算BestCombination时,它可能不是您认为的组合(其他线程可能已经更改了数据的值)。