我正在尝试并行化组合优化问题。基本上,我想通过大小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解决方案非常错误。谁知道为什么?
答案 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时,它可能不是您认为的组合(其他线程可能已经更改了数据的值)。