<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[parallelisierter Backtracking-Algorithmus]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich suche eine Implementation eines parallelisierten Backtracking-Algorithmus in C++11/14, finde aber mit google &quot;backtracking c++ parallel&quot; nichts passendes. Kann mir jemand etwas in die Richtung verlinken? Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/338854/parallelisierter-backtracking-algorithmus</link><generator>RSS for Node</generator><lastBuildDate>Mon, 13 Apr 2026 01:16:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/338854.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 15 Jul 2016 07:38:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to parallelisierter Backtracking-Algorithmus on Fri, 15 Jul 2016 07:38:29 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich suche eine Implementation eines parallelisierten Backtracking-Algorithmus in C++11/14, finde aber mit google &quot;backtracking c++ parallel&quot; nichts passendes. Kann mir jemand etwas in die Richtung verlinken? Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502420</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502420</guid><dc:creator><![CDATA[dsfsdffd]]></dc:creator><pubDate>Fri, 15 Jul 2016 07:38:29 GMT</pubDate></item><item><title><![CDATA[Reply to parallelisierter Backtracking-Algorithmus on Fri, 15 Jul 2016 08:37:44 GMT]]></title><description><![CDATA[<p><a href="https://www.google.de/search?&amp;q=backtracking%20c%2B%2B%20multithreaded" rel="nofollow">Google: backtracking c++ multithreaded</a> liefert bessere Ergebnisse, aber immer noch <strong>keinen konkreten Code</strong>!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502428</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502428</guid><dc:creator><![CDATA[dsfsdffd]]></dc:creator><pubDate>Fri, 15 Jul 2016 08:37:44 GMT</pubDate></item><item><title><![CDATA[Reply to parallelisierter Backtracking-Algorithmus on Fri, 15 Jul 2016 08:49:41 GMT]]></title><description><![CDATA[<p><a href="https://www.google.de/search?&amp;q=threadpool%20c%2B%2B11" rel="nofollow">Google: threadpool c++11</a> liefert auch etwas ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502429</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502429</guid><dc:creator><![CDATA[dsfsdffd]]></dc:creator><pubDate>Fri, 15 Jul 2016 08:49:41 GMT</pubDate></item><item><title><![CDATA[Reply to parallelisierter Backtracking-Algorithmus on Fri, 15 Jul 2016 14:48:06 GMT]]></title><description><![CDATA[<p>Reicht nicht sowas <a href="http://www.drdobbs.com/architecture-and-design/three-parallel-backtracking-designs/232300302" rel="nofollow">http://www.drdobbs.com/architecture-and-design/three-parallel-backtracking-designs/232300302</a> ? Oder muss es ein enterprise framework sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502466</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502466</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 15 Jul 2016 14:48:06 GMT</pubDate></item><item><title><![CDATA[Reply to parallelisierter Backtracking-Algorithmus on Fri, 15 Jul 2016 15:01:06 GMT]]></title><description><![CDATA[<p>Ich suche etwas, das die Thread-Funktionalität von C++11 verwendet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502467</guid><dc:creator><![CDATA[dsfsdffd]]></dc:creator><pubDate>Fri, 15 Jul 2016 15:01:06 GMT</pubDate></item><item><title><![CDATA[Reply to parallelisierter Backtracking-Algorithmus on Fri, 15 Jul 2016 15:04:11 GMT]]></title><description><![CDATA[<p>Oder kannst du mir ein Buch empfehlen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502469</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502469</guid><dc:creator><![CDATA[dsfsdffd]]></dc:creator><pubDate>Fri, 15 Jul 2016 15:04:11 GMT</pubDate></item><item><title><![CDATA[Reply to parallelisierter Backtracking-Algorithmus on Fri, 15 Jul 2016 15:19:08 GMT]]></title><description><![CDATA[<p>TBB wäre auch OK.</p>
<p>Kann man vielleicht <a href="http://codereview.stackexchange.com/questions/7870/parallel-quicksort" rel="nofollow">codereview.stackexchange.com/questions/7870/parallel-quicksort</a> anpassen? Der wesentliche Unterschied ist wohl, dass beim Backtracking der Branching-Faktor größer als 2 sein kann:</p>
<pre><code>tbb::parallel_invoke([&amp;] { quick_sort_parallel(b, m); }, 
                                 [&amp;] { quick_sort_parallel(m + 1, e); });
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2502471</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502471</guid><dc:creator><![CDATA[dsfsdffd]]></dc:creator><pubDate>Fri, 15 Jul 2016 15:19:08 GMT</pubDate></item><item><title><![CDATA[Reply to parallelisierter Backtracking-Algorithmus on Fri, 15 Jul 2016 15:23:36 GMT]]></title><description><![CDATA[<p>dsfsdffd schrieb:</p>
<blockquote>
<p>TBB wäre auch OK.</p>
</blockquote>
<p>Doch nicht. Ist nicht free.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502472</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502472</guid><dc:creator><![CDATA[dsfsdffd]]></dc:creator><pubDate>Fri, 15 Jul 2016 15:23:36 GMT</pubDate></item><item><title><![CDATA[Reply to parallelisierter Backtracking-Algorithmus on Fri, 15 Jul 2016 16:02:35 GMT]]></title><description><![CDATA[<p>Ich habe mal etwas entworfen:</p>
<pre><code>#include &quot;stdafx.h&quot;
#include &lt;thread&gt;
#include &lt;mutex&gt;
#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;queue&gt;

using namespace std;

mutex m;

queue&lt;thread&gt; thread_pool;
const size_t max_thread_num = 6;

const size_t max_len = 10;
void backtracking(vector&lt;int&gt;&amp; data)
{
	if (data.size() == max_len)
	{
		unique_lock&lt;mutex&gt; lck{ m };
		for (auto i : data)
			cout &lt;&lt; i &lt;&lt; ' ';
		cout &lt;&lt; endl;
		return;
	}

	vector&lt;int&gt; possible_continuations;
	for (auto cont : { 0,1,2,3,4,5,6,7,8,9 })
	{
		if (cont % 5 == 0)
			possible_continuations.push_back(cont);
	}

	for (auto cont : possible_continuations)
	{
		vector&lt;int&gt; new_data(data);
		new_data.push_back(cont);
		if (thread_pool.size() &lt; max_thread_num)
		{
			thread_pool.emplace(backtracking, new_data);
			thread_pool.back().join();
			thread_pool.pop();
		}
		else
		{
			backtracking(new_data);
		}
	}
}

int main()
{
	vector&lt;int&gt; data;
	backtracking(data);

	char c;
	cin &gt;&gt; c;
    return 0;
}
</code></pre>
<p>Crasht aber, vermutlich, weil in</p>
<pre><code>thread_pool.emplace(backtracking, new_data);
			thread_pool.back().join();
			thread_pool.pop();
</code></pre>
<p>.back() und .pop() nicht mehr auf den emplace-ten Thread zugreifen. Man müsste einen Iterator haben, der auf diesen Thread zeigt.</p>
<p>Weitere Kommentare?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502474</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502474</guid><dc:creator><![CDATA[dsfsdffd]]></dc:creator><pubDate>Fri, 15 Jul 2016 16:02:35 GMT</pubDate></item><item><title><![CDATA[Reply to parallelisierter Backtracking-Algorithmus on Sat, 16 Jul 2016 07:17:54 GMT]]></title><description><![CDATA[<p><a href="https://www.google.de/search?&amp;q=work%20stealing%20c%2B%2B" rel="nofollow">Google: work stealing c++</a> liefert auch Ergebnisse ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502524</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502524</guid><dc:creator><![CDATA[dsfsdffd]]></dc:creator><pubDate>Sat, 16 Jul 2016 07:17:54 GMT</pubDate></item><item><title><![CDATA[Reply to parallelisierter Backtracking-Algorithmus on Mon, 18 Jul 2016 08:12:09 GMT]]></title><description><![CDATA[<p>*push*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502668</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502668</guid><dc:creator><![CDATA[dsfsdffd]]></dc:creator><pubDate>Mon, 18 Jul 2016 08:12:09 GMT</pubDate></item><item><title><![CDATA[Reply to parallelisierter Backtracking-Algorithmus on Mon, 18 Jul 2016 12:59:21 GMT]]></title><description><![CDATA[<p>Ich stelle mir das in etwa so vor: <a href="http://stackoverflow.com/questions/850866/multi-threaded-algorithm-for-solving-sudoku" rel="nofollow">http://stackoverflow.com/questions/850866/multi-threaded-algorithm-for-solving-sudoku</a> Leider ist dort kein Code.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502682</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502682</guid><dc:creator><![CDATA[dsfsdffd]]></dc:creator><pubDate>Mon, 18 Jul 2016 12:59:21 GMT</pubDate></item><item><title><![CDATA[Reply to parallelisierter Backtracking-Algorithmus on Mon, 18 Jul 2016 13:27:13 GMT]]></title><description><![CDATA[<p>Würde folgendes funktionieren:</p>
<pre><code>Initialisiere WorkQueue mit der Wurzel des Suchbaumes.
Starte N Threads mit der Funktion backtracking.

void backtracking()
{
  Wenn WorkQueue leer, return;
  Sonst nimm ein Element aus der WorkQueue, 
    expandiere dort den Suchbaum und
    pushe alle möglichen Fortführungen auf die WorkQueue,
    bis auf die erste, auf diese wende Backtracking an.
}
</code></pre>
<p>Das &quot;pushe alle möglichen Fortführungen auf die WorkQueue, bis auf die erste, auf diese wende Backtracking an.&quot; scheint mir noch nicht so ganz zu stimmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502686</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502686</guid><dc:creator><![CDATA[dsfsdffd]]></dc:creator><pubDate>Mon, 18 Jul 2016 13:27:13 GMT</pubDate></item><item><title><![CDATA[Reply to parallelisierter Backtracking-Algorithmus on Mon, 18 Jul 2016 14:06:23 GMT]]></title><description><![CDATA[<p>Kann man vielleicht <a href="http://www.boost.org/doc/libs/1_61_0/libs/graph_parallel/doc/html/index.html" rel="nofollow">http://www.boost.org/doc/libs/1_61_0/libs/graph_parallel/doc/html/index.html</a> (Parallel Boost Graph Library) nutzen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502691</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502691</guid><dc:creator><![CDATA[dsfsdffd]]></dc:creator><pubDate>Mon, 18 Jul 2016 14:06:23 GMT</pubDate></item><item><title><![CDATA[Reply to parallelisierter Backtracking-Algorithmus on Mon, 18 Jul 2016 15:41:26 GMT]]></title><description><![CDATA[<p>Auf <a href="http://www.boost.org/doc/libs/1_61_0/libs/graph_parallel/doc/html/tsin_depth_first_visit.html" rel="nofollow">http://www.boost.org/doc/libs/1_61_0/libs/graph_parallel/doc/html/tsin_depth_first_visit.html</a> steht:</p>
<blockquote>
<p>Depth-first search is inherently sequential, so parallel speedup is very poor. Regardless of the number of processors, the algorithm will not be faster than O(V); see [Tsin02] for more details.</p>
</blockquote>
<p>Also macht es vielleicht gar keinen Sinn, einen Backtracking/CSP-Algorithmus zu parallelisieren? Oder unter welchen Umständen würde es Sinn machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502694</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502694</guid><dc:creator><![CDATA[dsfsdffd]]></dc:creator><pubDate>Mon, 18 Jul 2016 15:41:26 GMT</pubDate></item><item><title><![CDATA[Reply to parallelisierter Backtracking-Algorithmus on Mon, 18 Jul 2016 17:31:15 GMT]]></title><description><![CDATA[<p>dsfsdffd schrieb:</p>
<blockquote>
<p>Auf <a href="http://www.boost.org/doc/libs/1_61_0/libs/graph_parallel/doc/html/tsin_depth_first_visit.html" rel="nofollow">http://www.boost.org/doc/libs/1_61_0/libs/graph_parallel/doc/html/tsin_depth_first_visit.html</a> steht:</p>
<blockquote>
<p>Depth-first search is inherently sequential, so parallel speedup is very poor. Regardless of the number of processors, the algorithm will not be faster than O(V); see [Tsin02] for more details.</p>
</blockquote>
<p>Also macht es vielleicht gar keinen Sinn, einen Backtracking/CSP-Algorithmus zu parallelisieren? Oder unter welchen Umständen würde es Sinn machen?</p>
</blockquote>
<p>Du hast doch einen Baum da liegen, durch den Du rennst, oder? Dann haste durchs Parallelisieren soviel speedup, wie Du Kerne hast (und pro HT-&quot;Kern&quot; nochmal 30%). Abzüglich <a href="http://superslang.de/eintrag/ebbes" rel="nofollow">Ebbes</a>+<a href="https://de.wikipedia.org/wiki/Epsilontik" rel="nofollow">Epsilon</a> Promille für Verwaltung, wobei ε beliebig groß werden kann, wenn man für jedes <a href="https://de.wikipedia.org/wiki/Epsilontik" rel="nofollow">Epsilon</a> einen Thread startet. Also auch 10000 oder so. Aber das macht man ja nicht. Im Allgemeinen sind Ebbes+Epsilon vollkommen unspürbar bei Bäumen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502705</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502705</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 18 Jul 2016 17:31:15 GMT</pubDate></item><item><title><![CDATA[Reply to parallelisierter Backtracking-Algorithmus on Mon, 18 Jul 2016 19:32:19 GMT]]></title><description><![CDATA[<p>Ja, ich habe einen Baum (kein beliebiger Graph). Es sieht so aus, als müsste ich mir selbst etwas schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502719</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502719</guid><dc:creator><![CDATA[dsfsdffd]]></dc:creator><pubDate>Mon, 18 Jul 2016 19:32:19 GMT</pubDate></item><item><title><![CDATA[Reply to parallelisierter Backtracking-Algorithmus on Tue, 19 Jul 2016 15:10:06 GMT]]></title><description><![CDATA[<p>Vielleicht so:</p>
<pre><code>Initialisiere WorkQueue mit der Wurzel des Suchbaumes.
Starte N Threads mit der Funktion backtracking.

void backtracking()
{
  while (WorkQueue nicht leer)
  {
    Nimm ein Element aus der WorkQueue, 
    wenn das Element ein Blatt ist: return;
    sonst: pushe alle dessen Kinder auf die WorkQueue
  }
}
</code></pre>
<p>Hierbei müssen die Zugriffe auf die <code>WorkQueue</code> durch einen Mutex geschützt werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502783</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502783</guid><dc:creator><![CDATA[dsfsdffd]]></dc:creator><pubDate>Tue, 19 Jul 2016 15:10:06 GMT</pubDate></item><item><title><![CDATA[Reply to parallelisierter Backtracking-Algorithmus on Tue, 19 Jul 2016 15:19:56 GMT]]></title><description><![CDATA[<p>Besser so:</p>
<pre><code>Initialisiere WorkQueue mit der Wurzel des Suchbaumes.
finished = false;
Starte N Threads mit der Funktion backtracking.

void backtracking()
{
  while (!finished)
  {
    Nimm ein Element aus der WorkQueue, 
    wenn das Element ein Blatt ist: finished = true; return;
    sonst: pushe alle dessen Kinder auf die WorkQueue
  }
}
</code></pre>
<p>Hierbei müssen die Zugriffe auf die <code>WorkQueue</code> durch einen Mutex geschützt werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2502784</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2502784</guid><dc:creator><![CDATA[dsfsdffd]]></dc:creator><pubDate>Tue, 19 Jul 2016 15:19:56 GMT</pubDate></item></channel></rss>