<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	
	>
<channel>
	<title>Comments on: </title>
	<atom:link href="https://mm.soldat.pl/development-log/969/feed" rel="self" type="application/rss+xml" />
	<link>https://mm.soldat.pl/development-log/969</link>
	<description>Michał Marcinkowski&#039;s: Gamedev Log &#38; Articles</description>
	<lastBuildDate>Tue, 24 Mar 2026 04:51:11 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.2.39</generator>
	<item>
		<title>By: nint22</title>
		<link>https://mm.soldat.pl/development-log/969/comment-page-1#comment-131690</link>
		<dc:creator><![CDATA[nint22]]></dc:creator>
		<pubDate>Tue, 09 Feb 2010 23:13:48 +0000</pubDate>
		<guid isPermaLink="false">http://mm.soldat.pl/development-log/969#comment-131690</guid>
		<description><![CDATA[D* is &quot;reverse-Dijkstra&quot; in the sense that you apply Dijkstra&#039;s single-source shortest-path algorithm to a standard graph (vertices and edges, horah!); the only *real* difference is that the &quot;source&quot; vertex now becomes a &quot;goal/sink&quot; vertex. You then use the generated edge-table to find the &quot;cheapest&quot; adjacent edges, which are all globally correct for finding the &quot;best&quot; path. What&#039;s very cool about this is that no matter *where* you start, once you apply the algorithm, *all* &quot;best&quot; paths are already found for you from any starting location!

When an edge cost is updated, as we have to when we discover obstacles in the before mentioned robotics competition, the algorithm only propagates the new changes through the table in such a way that only related paths (paths that contain the updated edge) are changed, generating new paths with as little work as possible (hence the power of D*).]]></description>
		<content:encoded><![CDATA[<p>D* is &#8220;reverse-Dijkstra&#8221; in the sense that you apply Dijkstra&#8217;s single-source shortest-path algorithm to a standard graph (vertices and edges, horah!); the only *real* difference is that the &#8220;source&#8221; vertex now becomes a &#8220;goal/sink&#8221; vertex. You then use the generated edge-table to find the &#8220;cheapest&#8221; adjacent edges, which are all globally correct for finding the &#8220;best&#8221; path. What&#8217;s very cool about this is that no matter *where* you start, once you apply the algorithm, *all* &#8220;best&#8221; paths are already found for you from any starting location!</p>
<p>When an edge cost is updated, as we have to when we discover obstacles in the before mentioned robotics competition, the algorithm only propagates the new changes through the table in such a way that only related paths (paths that contain the updated edge) are changed, generating new paths with as little work as possible (hence the power of D*).</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: MM</title>
		<link>https://mm.soldat.pl/development-log/969/comment-page-1#comment-131573</link>
		<dc:creator><![CDATA[MM]]></dc:creator>
		<pubDate>Tue, 09 Feb 2010 11:28:00 +0000</pubDate>
		<guid isPermaLink="false">http://mm.soldat.pl/development-log/969#comment-131573</guid>
		<description><![CDATA[I think that settles it. Link-Dead has a static map so I go with A*. I&#039;m still curious about reverse-dijikstra, can you tell more about it?
I thought of using it in situations where the goal is not known. Such as the bot trying to find a place to take cover or find the best camping spot.

I also use A* for the bot combat decisions. There we have a dynamic situation where D* would be good. But I don&#039;t know if it would be a performance gain since the decisions aren&#039;t so long.]]></description>
		<content:encoded><![CDATA[<p>I think that settles it. Link-Dead has a static map so I go with A*. I&#8217;m still curious about reverse-dijikstra, can you tell more about it?<br />
I thought of using it in situations where the goal is not known. Such as the bot trying to find a place to take cover or find the best camping spot.</p>
<p>I also use A* for the bot combat decisions. There we have a dynamic situation where D* would be good. But I don&#8217;t know if it would be a performance gain since the decisions aren&#8217;t so long.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: nint22</title>
		<link>https://mm.soldat.pl/development-log/969/comment-page-1#comment-131409</link>
		<dc:creator><![CDATA[nint22]]></dc:creator>
		<pubDate>Mon, 08 Feb 2010 12:17:54 +0000</pubDate>
		<guid isPermaLink="false">http://mm.soldat.pl/development-log/969#comment-131409</guid>
		<description><![CDATA[Nope, my robots don&#039;t have guns. We only do innocent navigation competitions. I think we all learned from Terminator that, though it may be awesome, robots &amp; guns don&#039;t end well for humanity..

A* vs. D* topic: I poorly defined why I like D* over A*. The reason is simply because of my project&#039;s needs: In my robotics application, the search space is not only HUGE (hundreds of square meters the robot has to drive around) but the arena is unknown at run-time. The robot fills in its &quot;known world&quot; over time, as it discovers obstacles, while driving to a goal.

During each &quot;known world&quot; update (we queued up sensor readings into burst-writes for performance), we actually only update the node/edge values within our D* map. For added performance (this code was never deployed) we removed nodes that were surrounded by obstacles as well as only added new nodes if the robot *really* thinks there is an obstacle. From there, the algorithm doesn&#039;t need to run through all possible paths like A* does (hence the dynamic programming aspect!), but only updates the paths associated with the node/edges that have been changed.

This is a very subtle difference, and frankly the performance gain from our own D* implementation wasn&#039;t huge, but when we ran simulations of worlds that had overly complex obstacles (fences, clustered poles, etc..), D* outperformed by far! Simply: A* is great for well-defined static worlds, D* is great for dynamic changing worlds. That&#039;s it! I think A* seems to best fit your needs since maps are very well defined; any needed path planning data could just be pre-calculated.

Oh, and maybe I&#039;m dumb, but aren&#039;t the heuristic function for A* and D* still equivalent (constant)? If you want a total mind-fuck in terms of powerful path planners, look into V* from Penn State (http://bit.ly/9pXsTi) which uses language theory and has a theoretical lower constant than A* and D*, assuming you live in the future with dozen-core processors! I programmed a proof-of-concept, but couldn&#039;t understand 90% of the paper.

tl;dr - I like path planning.]]></description>
		<content:encoded><![CDATA[<p>Nope, my robots don&#8217;t have guns. We only do innocent navigation competitions. I think we all learned from Terminator that, though it may be awesome, robots &amp; guns don&#8217;t end well for humanity..</p>
<p>A* vs. D* topic: I poorly defined why I like D* over A*. The reason is simply because of my project&#8217;s needs: In my robotics application, the search space is not only HUGE (hundreds of square meters the robot has to drive around) but the arena is unknown at run-time. The robot fills in its &#8220;known world&#8221; over time, as it discovers obstacles, while driving to a goal.</p>
<p>During each &#8220;known world&#8221; update (we queued up sensor readings into burst-writes for performance), we actually only update the node/edge values within our D* map. For added performance (this code was never deployed) we removed nodes that were surrounded by obstacles as well as only added new nodes if the robot *really* thinks there is an obstacle. From there, the algorithm doesn&#8217;t need to run through all possible paths like A* does (hence the dynamic programming aspect!), but only updates the paths associated with the node/edges that have been changed.</p>
<p>This is a very subtle difference, and frankly the performance gain from our own D* implementation wasn&#8217;t huge, but when we ran simulations of worlds that had overly complex obstacles (fences, clustered poles, etc..), D* outperformed by far! Simply: A* is great for well-defined static worlds, D* is great for dynamic changing worlds. That&#8217;s it! I think A* seems to best fit your needs since maps are very well defined; any needed path planning data could just be pre-calculated.</p>
<p>Oh, and maybe I&#8217;m dumb, but aren&#8217;t the heuristic function for A* and D* still equivalent (constant)? If you want a total mind-fuck in terms of powerful path planners, look into V* from Penn State (<a href="http://bit.ly/9pXsTi" rel="nofollow">http://bit.ly/9pXsTi</a>) which uses language theory and has a theoretical lower constant than A* and D*, assuming you live in the future with dozen-core processors! I programmed a proof-of-concept, but couldn&#8217;t understand 90% of the paper.</p>
<p>tl;dr &#8211; I like path planning.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Chutem</title>
		<link>https://mm.soldat.pl/development-log/969/comment-page-1#comment-131365</link>
		<dc:creator><![CDATA[Chutem]]></dc:creator>
		<pubDate>Mon, 08 Feb 2010 02:49:19 +0000</pubDate>
		<guid isPermaLink="false">http://mm.soldat.pl/development-log/969#comment-131365</guid>
		<description><![CDATA[MM is no longer the main developer of Soldat.]]></description>
		<content:encoded><![CDATA[<p>MM is no longer the main developer of Soldat.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: whitdemon</title>
		<link>https://mm.soldat.pl/development-log/969/comment-page-1#comment-131341</link>
		<dc:creator><![CDATA[whitdemon]]></dc:creator>
		<pubDate>Sun, 07 Feb 2010 23:40:01 +0000</pubDate>
		<guid isPermaLink="false">http://mm.soldat.pl/development-log/969#comment-131341</guid>
		<description><![CDATA[sorry to offtopic and knowing that maybe you dont give a&#039;fuck, can you check soldat development... like right now...?!]]></description>
		<content:encoded><![CDATA[<p>sorry to offtopic and knowing that maybe you dont give a&#8217;fuck, can you check soldat development&#8230; like right now&#8230;?!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: MM</title>
		<link>https://mm.soldat.pl/development-log/969/comment-page-1#comment-131312</link>
		<dc:creator><![CDATA[MM]]></dc:creator>
		<pubDate>Sun, 07 Feb 2010 20:16:43 +0000</pubDate>
		<guid isPermaLink="false">http://mm.soldat.pl/development-log/969#comment-131312</guid>
		<description><![CDATA[Now that&#039;s a Soldat clone. The gameplay seems a bit slow and I didnt notice any gore. Which by itself disqualifies it from even looking at it. BLOOOOD!!! That&#039;s what players want.

nint22: D* seemed complicated, I&#039;ll have a look a second time. 
“reverse dijkstra algorithm” - isn&#039;t that just A* with a constant heuristic? Why would it be faster?
I would like to talk some day if you want?]]></description>
		<content:encoded><![CDATA[<p>Now that&#8217;s a Soldat clone. The gameplay seems a bit slow and I didnt notice any gore. Which by itself disqualifies it from even looking at it. BLOOOOD!!! That&#8217;s what players want.</p>
<p>nint22: D* seemed complicated, I&#8217;ll have a look a second time.<br />
“reverse dijkstra algorithm” &#8211; isn&#8217;t that just A* with a constant heuristic? Why would it be faster?<br />
I would like to talk some day if you want?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: curious</title>
		<link>https://mm.soldat.pl/development-log/969/comment-page-1#comment-131309</link>
		<dc:creator><![CDATA[curious]]></dc:creator>
		<pubDate>Sun, 07 Feb 2010 19:53:26 +0000</pubDate>
		<guid isPermaLink="false">http://mm.soldat.pl/development-log/969#comment-131309</guid>
		<description><![CDATA[@nint22
Do those robots have guns?]]></description>
		<content:encoded><![CDATA[<p>@nint22<br />
Do those robots have guns?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Kosa</title>
		<link>https://mm.soldat.pl/development-log/969/comment-page-1#comment-131305</link>
		<dc:creator><![CDATA[Kosa]]></dc:creator>
		<pubDate>Sun, 07 Feb 2010 19:20:40 +0000</pubDate>
		<guid isPermaLink="false">http://mm.soldat.pl/development-log/969#comment-131305</guid>
		<description><![CDATA[Gosu.]]></description>
		<content:encoded><![CDATA[<p>Gosu.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: nint22</title>
		<link>https://mm.soldat.pl/development-log/969/comment-page-1#comment-131268</link>
		<dc:creator><![CDATA[nint22]]></dc:creator>
		<pubDate>Sun, 07 Feb 2010 08:47:49 +0000</pubDate>
		<guid isPermaLink="false">http://mm.soldat.pl/development-log/969#comment-131268</guid>
		<description><![CDATA[Hey MM,

On a serious technical note: A* is not a bad approach to your path planning needs, but it&#039;s far from a &quot;fast&quot; approach. Look into D*, or simply &quot;reverse dijkstra algorithm&quot;. It&#039;s a dynamic programming approach to the shortest/cheapest path problem - it performs in O(n^2), which a lower constant than A*&#039;s run-time.

Just wanting to help :^) I do path planning day and night for robotics.]]></description>
		<content:encoded><![CDATA[<p>Hey MM,</p>
<p>On a serious technical note: A* is not a bad approach to your path planning needs, but it&#8217;s far from a &#8220;fast&#8221; approach. Look into D*, or simply &#8220;reverse dijkstra algorithm&#8221;. It&#8217;s a dynamic programming approach to the shortest/cheapest path problem &#8211; it performs in O(n^2), which a lower constant than A*&#8217;s run-time.</p>
<p>Just wanting to help :^) I do path planning day and night for robotics.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: facepalm</title>
		<link>https://mm.soldat.pl/development-log/969/comment-page-1#comment-131229</link>
		<dc:creator><![CDATA[facepalm]]></dc:creator>
		<pubDate>Sat, 06 Feb 2010 17:58:54 +0000</pubDate>
		<guid isPermaLink="false">http://mm.soldat.pl/development-log/969#comment-131229</guid>
		<description><![CDATA[(side-scrolling &amp;&amp; platform shooter &amp;&amp; mouse control) != soldat clone != abuse clone]]></description>
		<content:encoded><![CDATA[<p>(side-scrolling &amp;&amp; platform shooter &amp;&amp; mouse control) != soldat clone != abuse clone</p>
]]></content:encoded>
	</item>
</channel>
</rss>
