<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	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/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Coder-Studio &#187; Optimisation combinatoire</title>
	<atom:link href="http://www.coder-studio.com/blog/tag/optimisation-combinatoire/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.coder-studio.com/blog</link>
	<description></description>
	<lastBuildDate>Wed, 31 Mar 2010 00:00:53 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Challenge Tower Bloxx</title>
		<link>http://www.coder-studio.com/blog/challenge-tower-bloxx/</link>
		<comments>http://www.coder-studio.com/blog/challenge-tower-bloxx/#comments</comments>
		<pubDate>Sun, 10 May 2009 02:31:42 +0000</pubDate>
		<dc:creator>nicolas66</dc:creator>
				<category><![CDATA[Optimisation combinatoire]]></category>
		<category><![CDATA[graphe]]></category>
		<category><![CDATA[programmation linéaire]]></category>
		<category><![CDATA[tower bloxx]]></category>

		<guid isPermaLink="false">http://www.coder-studio.com/blog/?p=309</guid>
		<description><![CDATA[Certains d&#8217;entre vous connaissent probablement le jeu Tower Bloxx sur téléphone portable. Pour résumer, le jeu consiste à construire une petite agglomération en plaçant des immeubles sur une grille carrée de taille n x n. Chaque immeuble est créé en empilant un à un les étages à l&#8217;aide d&#8217;une grue qui balance d&#8217;un bout à [...]]]></description>
			<content:encoded><![CDATA[<p>Certains d&#8217;entre vous connaissent probablement le jeu Tower Bloxx sur téléphone portable. Pour résumer, le jeu consiste à construire une petite agglomération en plaçant des immeubles sur une grille carrée de taille <em>n x n</em>. Chaque immeuble est créé en empilant un à un les étages à l&#8217;aide d&#8217;une grue qui balance d&#8217;un bout à l&#8217;autre de l&#8217;écran. A chaque fois qu&#8217;un étage est ajouté, des habitants viennent peupler l&#8217;immeuble. Plus les étages sont alignés, plus l&#8217;immeuble abrite d&#8217;habitants et moins l&#8217;immeuble balance pour placer de nouveaux étages. Il existe plusieurs types d&#8217;immeubles (<em>m</em>), avec un nombre de points et une population croissants : résidentiel (bleu), commercial (rouge), industriel (vert) et hôtel de luxe (jaune). Les règles de placement des immeubles sont les suivantes :</p>
<ul>
<li>Un immeuble bleu peut être placé partout.</li>
<li>Un immeuble rouge doit posséder au moins un immeuble bleu dans son voisinage.</li>
<li>Un immeuble vert doit posséder au moins un immeuble bleu et rouge dans son voisinage.</li>
<li>Un immeuble jaune doit posséder au moins un immeuble bleu, rouge et vert dans son voisinage.</li>
</ul>
<p>On considère ici un voisinage en 4-connexités. Dans le jeu original, il est possible de détruire des tours voisines afin de placer davantage de tours de plus grande importance (loophole). Dans un souci de simplicité, j&#8217;ignore ici cette possibilité. L&#8217;image ci-dessous donne un exemple d&#8217;agglomération qui respecte les règles énoncées précédemment.</p>
<div id="attachment_94" class="wp-caption aligncenter" style="width: 210px"><img class="size-medium wp-image-94" title="Exemple d'agglomération" src="http://nicolas.lerme.free.fr/city-block.png" alt="Exemple d'agglomération" width="200" height="200" /><p class="wp-caption-text">Exemple d'agglomération</p></div>
<p><span id="more-309"></span></p>
<p> Outre l&#8217;aspect divertissant du jeu, une question plus profonde a rapidement taraudé mon esprit : quelle est la configuration optimale des immeubles qui maximise le nombre d&#8217;immeubles de plus grande importance ?</p>
<p>Très vite, on devine que le problème d&#8217;optimisation combinatoire sous-jacent posé doit facilement pouvoir s&#8217;exprimer sous la forme d&#8217;un programme linéaire en nombres entiers (PLNE). Algorithmiquement, la résolution d&#8217;un PLNE est autrement plus difficile qu&#8217;un PL mais il existe des algorithmes (par exemple branch-and-bound) performants et éprouvés. Ces algorithmes se basent sur la relaxation continue du PLNE (sans les contraintes d&#8217;intégrité) et permettent d&#8217;éviter une énumération exhaustive des solutions.</p>
<p>Après avoir écrit sur papier la fonction objectif et les contraintes associées, je me suis donc mis en quête d&#8217;un solveur gratuit et disponible sous GNU/Linux. Ne connaissant pas en détail les différents solveurs, mon choix s&#8217;est porté sur le premier venu : GLPK. Etant novice, l&#8217;écriture du programme linéaire m&#8217;a demandé quelques refléxions préalables pour généraliser le problème pour un couple de paramètres (<em>n</em>, <em>m</em>) donné.</p>
<p>A partir de ce problème, on peut aussi imaginer diverses extensions :</p>
<ul>
<li>Transposer le problème sous la forme d&#8217;un graphe et généraliser.</li>
<li>Généraliser le problème en dimension <em>N</em> : cela implique notamment de définir précisément la notion de voisinage en dimension quelconque.</li>
<li>Utiliser d&#8217;autres règles de dépendances entre immeubles : on pourrait alors imaginer des graphes de dépendance beaucoup plus complexes.</li>
<li>Utiliser d&#8217;autres types de voisinages dans le cas de graphes à &laquo;&nbsp;grille&nbsp;&raquo;.</li>
</ul>
<p>Comme bien souvent, la question initiale en appelle plusieurs autres : est-ce que ce problème a déjà été traité dans la littérature (éventuellement présenté sous une autre forme) ? Si oui, quelle est sa complexité pour un <em>m</em> fixé ? Le parallèle sur la coloration de graphes vient presque spontanément. Néanmoins, le problème qui nous occupe est différent et a priori plus simple. On peut tout de même se poser la question pour <em>m=2</em>, <em>m=3</em> et <em>m>=4</em>. En particulier, il serait intéressant de savoir d&#8217;une part, s&#8217;il existe un algorithme polynomial pour <em>m=2</em> et d&#8217;autre part, savoir si le problème est NP-Difficile pour <em>m>=4</em>.</p>
<p>D&#8217;un point de vue plus technique, cela consiste simplement en un programme linéaire écrit en GMPL pour le solveur GLPK. Les contraintes entre immeubles sont générées à l&#8217;aide d&#8217;un simple script. Le script écrit le programme linéaire dans un fichier, lance le solveur, affiche les résultats sous la forme d&#8217;un tableau et donne le score correspondant.</p>
<p>Finalement, j&#8217;ai pu résoudre mon problème initial pour l&#8217;instance (<em>n=5</em>, <em>m=4</em>) en une à deux heures de calcul. Il est sûrement possible de diminuer le temps de calcul au niveau de l&#8217;algorithme de branch-and-bound, en passant les options adéquates au solveur. Lorsque j&#8217;aurai davantage de temps, j&#8217;aimerai aussi pouvoir résoudre le même problème avec loophole. Have fun <img src='http://www.coder-studio.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.coder-studio.com/blog/challenge-tower-bloxx/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
