<?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/">
	<channel>
		<title><![CDATA[انجمن های تخصصی علوم رایانه و هنرهای دیجیتال - حل تمرین و مسئله های هوش مصنوعی]]></title>
		<link>https://www.forum.cgaria.com/</link>
		<description><![CDATA[انجمن های تخصصی علوم رایانه و هنرهای دیجیتال - https://www.forum.cgaria.com]]></description>
		<pubDate>Tue, 26 May 2026 22:02:32 +0000</pubDate>
		<generator>MyBB</generator>
		<item>
			<title><![CDATA[کد معمای 8 با الگوریتم ژنتیک در سی شارپ]]></title>
			<link>https://www.forum.cgaria.com/thread-691.html</link>
			<pubDate>Fri, 23 Jan 2015 02:06:57 +0330</pubDate>
			<dc:creator><![CDATA[<a href="https://www.forum.cgaria.com/member.php?action=profile&uid=5">Mohsen Omidvar</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.forum.cgaria.com/thread-691.html</guid>
			<description><![CDATA[<span style="color: #000000;" class="mycode_color"><span style="font-size: x-small;" class="mycode_size"><span style="font-family: Tahoma, Geneva, sans-serif;" class="mycode_font"><span style="font-size: small;" class="mycode_size">[font=tahoma, geneva, sans-serif]<span style="font-weight: bold;" class="mycode_b">معمای 8  یا  پازل 8-puzzle</span></span></span>[/font]</span></span><br />
<br />
<span style="color: #000000;" class="mycode_color"><span style="font-size: x-small;" class="mycode_size"><span style="font-family: Tahoma, Geneva, sans-serif;" class="mycode_font"><span style="font-size: small;" class="mycode_size">[font=tahoma, geneva, sans-serif]دوستانی که در  رشته های کامپیوتر، فناوری اطلاعات و هوش مصنوعی تحصیل می کنند حتما با <span style="font-weight: bold;" class="mycode_b">بازی پازل 8</span> آشنایی  دارند. این بازی  تقریبا پای ثابت اکثر معماها در آموزش ابتدایی  هوش مصنوعی است.</span></span>[/font]</span></span><br />
<span style="color: #000000;" class="mycode_color"><span style="font-size: x-small;" class="mycode_size"><span style="font-family: Tahoma, Geneva, sans-serif;" class="mycode_font"><span style="font-size: small;" class="mycode_size">[font=tahoma, geneva, sans-serif]این معما از یک جدول 3 در 3 تشکیل شده است که می شود 9 خانه.</span></span>[/font]</span></span><br />
<span style="color: #000000;" class="mycode_color"><span style="font-size: x-small;" class="mycode_size"><span style="font-family: Tahoma, Geneva, sans-serif;" class="mycode_font"><span style="font-size: small;" class="mycode_size">[font=tahoma, geneva, sans-serif]حالا در این جدول اعداد یک تا هشت قرار می گیرند و همچنین یکی از خانه ها خالی است.این معما شامل حالت اولیه و حالت نهایی است که باید به آن برسیم.</span></span>[/font]</span></span><br />
<span style="color: #000000;" class="mycode_color"><span style="font-size: x-small;" class="mycode_size"><span style="font-family: Tahoma, Geneva, sans-serif;" class="mycode_font"><span style="font-size: small;" class="mycode_size">[font=tahoma, geneva, sans-serif]<span style="font-weight: bold;" class="mycode_b">حالت اولیه :</span></span></span>[/font]</span></span><br />
<span style="color: #000000;" class="mycode_color"><span style="font-size: x-small;" class="mycode_size"><span style="font-family: Tahoma, Geneva, sans-serif;" class="mycode_font"><span style="font-size: small;" class="mycode_size">[font=tahoma, geneva, sans-serif]در این حالت اعداد می توانند به هر ترتیبی در جدول قرار گیرند.</span></span>[/font]</span></span><br />
<span style="color: #000000;" class="mycode_color"><span style="font-size: x-small;" class="mycode_size"><span style="font-family: Tahoma, Geneva, sans-serif;" class="mycode_font"><span style="font-size: small;" class="mycode_size">[font=tahoma, geneva, sans-serif]<span style="font-weight: bold;" class="mycode_b">حالت نهایی :</span></span></span>[/font]</span></span><br />
<span style="color: #000000;" class="mycode_color"><span style="font-size: x-small;" class="mycode_size"><span style="font-family: Tahoma, Geneva, sans-serif;" class="mycode_font"><span style="font-size: small;" class="mycode_size">[font=tahoma, geneva, sans-serif]حالتی است که از ما می خواهند به آن برسیم و این کار با حرکت خانه خالی میسر می شود. و باید از طریق قوانین زیر به آن رسید:</span></span>[/font]</span></span><br />
<span style="color: #000000;" class="mycode_color"><span style="font-size: x-small;" class="mycode_size"><span style="font-family: Tahoma, Geneva, sans-serif;" class="mycode_font"><span style="font-size: x-small;" class="mycode_size">[font=tahoma, geneva, sans-serif]1- اگر سمت چپ خانه خالي ، عدد باشد حرکت خانه خالي به سمت چپ</span></span>[/font]</span></span><br />
<span style="color: #000000;" class="mycode_color"><span style="font-size: x-small;" class="mycode_size"><span style="font-family: Tahoma, Geneva, sans-serif;" class="mycode_font"><span style="font-size: x-small;" class="mycode_size">[font=tahoma, geneva, sans-serif]2- اگر سمت راست خانه خالي ، عدد باشد حرکت خانه خالي به سمت راست</span></span>[/font]</span></span><br />
<span style="color: #000000;" class="mycode_color"><span style="font-size: x-small;" class="mycode_size"><span style="font-family: Tahoma, Geneva, sans-serif;" class="mycode_font"><span style="font-size: x-small;" class="mycode_size">[font=tahoma, geneva, sans-serif]3- اگر سمت بالا خانه خالي ، عدد باشد حرکت خانه خالي به سمت بالا</span></span>[/font]</span></span><br />
<span style="color: #000000;" class="mycode_color"><span style="font-size: x-small;" class="mycode_size"><span style="font-family: Tahoma, Geneva, sans-serif;" class="mycode_font"><span style="font-size: x-small;" class="mycode_size">[font=tahoma, geneva, sans-serif]4- اگر سمت پايين خانه خالي ، عدد باشد حرکت خانه خالي به سمت پايين</span></span>[/font]</span></span><br />
<span style="color: #000000;" class="mycode_color"><span style="font-size: x-small;" class="mycode_size"><span style="font-family: Tahoma, Geneva, sans-serif;" class="mycode_font"> </span></span></span><br />
<span style="color: #000000;" class="mycode_color"><span style="font-size: x-small;" class="mycode_size"><span style="font-family: Tahoma, Geneva, sans-serif;" class="mycode_font">[font=tahoma, geneva, sans-serif]<span style="font-size: small;" class="mycode_size">الگوریتم های متعددی برای این کار وجود دارد که یکی از آنها <span style="font-weight: bold;" class="mycode_b">الگوریتم ژنتیک </span>است.که در واقع این برنامه توسط این الگوریتم هوش مصنوعی و زبان برنامه نویسی سی شارپ پیاده سازی شده است.</span></span>[/font]</span></span><br />
<span style="color: #000000;" class="mycode_color"><span style="font-size: x-small;" class="mycode_size"><span style="font-family: Tahoma, Geneva, sans-serif;" class="mycode_font"> </span></span></span><br />
<div class="codeblock"><div class="title">کد: </div><div class="body" dir="ltr"><code>using System;<br />
using System.Collections.Generic;<br />
using System.ComponentModel;<br />
using System.Data;<br />
using System.Drawing;<br />
using System.Linq;<br />
using System.Text;<br />
using System.Windows.Forms;<br />
using System.Collections;<br />
namespace _8<br />
{<br />
   public partial class Form1 : Form<br />
   {<br />
       public Form1()<br />
       {<br />
           InitializeComponent();<br />
       }<br />
       int[,] first = new int[3, 3];<br />
       int[,] final = new int[3, 3];<br />
       int[, ,] temp = new int[3, 3, 10000];<br />
       string[] tempstaus = new string[10000];<br />
       int[,] realtemp = new int[3, 3];<br />
       int[,] qu = new int[3, 10000];<br />
<br />
       private void showtemp(int qun)        <br />
       {<br />
           string s = "";<br />
           listBox2.Items.Clear();<br />
           for (int i = 0; i &lt;= qun; i++)<br />
           {<br />
               for (int j = 0; j &lt; 3; j++)<br />
               {<br />
                   for (int k = 0; k &lt; 3; k++)<br />
                   {                        <br />
                       s += temp[j, k, i].ToString() + "  ";                        <br />
                   }<br />
                   listBox2.Items.Add(s);<br />
                   s = "";<br />
               }<br />
               listBox2.Items.Add(tempstaus[i]);<br />
               listBox2.Items.Add("=====================");    <br />
               <br />
           }<br />
<br />
       <br />
       }<br />
       private void insertff()<br />
       {<br />
           first[0, 0] = Convert.ToInt32(textBox1.Text);<br />
           first[0, 1] = Convert.ToInt32(textBox2.Text);<br />
           first[0, 2] = Convert.ToInt32(textBox3.Text);<br />
           first[1, 0] = Convert.ToInt32(textBox4.Text);<br />
           first[1, 1] = Convert.ToInt32(textBox5.Text);<br />
           first[1, 2] = Convert.ToInt32(textBox6.Text);<br />
           first[2, 0] = Convert.ToInt32(textBox7.Text);<br />
           first[2, 1] = Convert.ToInt32(textBox8.Text);<br />
           first[2, 2] = Convert.ToInt32(textBox9.Text);<br />
           final[0, 0] = Convert.ToInt32(textBox18.Text);<br />
           final[0, 1] = Convert.ToInt32(textBox17.Text);<br />
           final[0, 2] = Convert.ToInt32(textBox16.Text);<br />
           final[1, 0] = Convert.ToInt32(textBox15.Text);<br />
           final[1, 1] = Convert.ToInt32(textBox14.Text);<br />
           final[1, 2] = Convert.ToInt32(textBox13.Text);<br />
           final[2, 0] = Convert.ToInt32(textBox12.Text);<br />
           final[2, 1] = Convert.ToInt32(textBox11.Text);<br />
           final[2, 2] = Convert.ToInt32(textBox10.Text);<br />
       }<br />
       private int h1(int n)<br />
       {<br />
           int h = 0;<br />
           for (int i = 0; i &lt; 3; i++)<br />
               for (int j = 0; j &lt; 3; j++)<br />
                   if (temp[i, j, n] != final[i, j])<br />
                   {<br />
                       if(temp[i, j, n] !=0)<br />
                       h++;<br />
                   }<br />
           int x=0;<br />
           foreach(char  s in tempstaus[n])<br />
                if (s == '/')<br />
                   x++;<br />
<br />
    <br />
               return h+x ;<br />
       }<br />
       private void run()<br />
       {<br />
           #region first node<br />
           for (int i = 0; i &lt; 3; i++)<br />
               for (int j = 0; j &lt; 3; j++)<br />
                   temp[i, j, 0] = first[i, j];<br />
           tempstaus[0] = "0";<br />
           int qun = 0;<br />
           qu[0, qun] = qun ;<br />
           qu[1, qun] = h1(qun);<br />
           qu[2, qun] = 0;<br />
           listBox1.Items.Add(qu[0, qun].ToString() + "         h1= " + qu[1, qun].ToString() + "       " + tempstaus[qun]);<br />
           Application.DoEvents();<br />
#endregion<br />
           while (true)<br />
           {<br />
                   int min=0;<br />
                   int minmain = 0;<br />
               for (int i = 0; i &lt;= qun ; i++)// peyda kardane avvalin onsore peymude nashode<br />
               {<br />
                   if(qu[2,i]==0)<br />
                   {<br />
                       min = qu[1, i];<br />
                       minmain = i;<br />
                       break;<br />
                   }<br />
               }<br />
            for (int i = 0; i &lt;= qun; i++)// peyda kardane kuchiktarin onsor<br />
               {<br />
                   if (qu[1, i] &lt; min &amp;&amp; qu[2, i]==0)<br />
                   {<br />
                       min = qu[1, i];<br />
                       minmain = i;<br />
                   }<br />
               }<br />
              // MessageBox.Show("min= " + min.ToString() + "  minmain =  " + minmain.ToString() + "  qun=" + qun.ToString());<br />
<br />
               int r=0, c=0;<br />
               for (int i = 0; i &lt; 3; i++)//peyda kardane khune khali<br />
                   for (int j = 0; j &lt; 3; j++)<br />
                       if (temp[i, j, minmain] == 0)<br />
                       {<br />
                           r = i;<br />
                           c = j;<br />
                           break;                       <br />
                       }<br />
               for (int i = 0; i &lt; 3; i++) // enteghal tempe morede nazar be tempreal<br />
                   for (int j = 0; j &lt; 3; j++)<br />
                       realtemp[i, j] = temp[i, j, minmain];<br />
             // MessageBox.Show(minmain.ToString());<br />
               qu[2, minmain] = 1;<br />
               /////////////////////////////////////////////tolide farzandan////////////////////////////////////////////////<br />
               showtemp(qun);<br />
               int x = 0;<br />
               foreach (char s in tempstaus[minmain ])<br />
                   if (s == '/')<br />
                       x++;<br />
               if (h1(minmain)-x  == 0)<br />
               {<br />
                   MessageBox.Show("found !!!     masir  = "+tempstaus[minmain].ToString());<br />
                   break;<br />
               }<br />
               #region  tolide farzand<br />
               //===================================check resltemp != jadd===================================<br />
<br />
               //-----------------l<br />
               if (c &gt; 0)<br />
               {<br />
                   qun++;<br />
                   realtemp[r, c] = realtemp[r, c - 1];<br />
                   realtemp[r, c - 1]=0;<br />
                   tempstaus[qun] =tempstaus[minmain]+ "/left";<br />
                   for (int i = 0; i &lt; 3; i++)<br />
                       for (int j = 0; j &lt; 3; j++)<br />
                           temp[i, j, qun] = realtemp[i, j];<br />
                   qu[0, qun] = qun;<br />
                   qu[1, qun] = h1(qun);<br />
                   qu[2, qun] = 0;<br />
                   listBox1.Items.Add(qu[0, qun].ToString() + "         h1= " + qu[1, qun].ToString() + "       " + tempstaus[qun]);<br />
                   Application.DoEvents();<br />
               }<br />
               //-----------------r<br />
               if (c &lt; 2)<br />
               {<br />
                   for (int i = 0; i &lt; 3; i++) // enteghal tempe morede nazar be tempreal<br />
                       for (int j = 0; j &lt; 3; j++)<br />
                           realtemp[i, j] = temp[i, j, minmain];<br />
                   qun++;<br />
                   realtemp[r, c] = realtemp[r, c+1];<br />
                   realtemp[r, c+ 1] = 0;<br />
                   for (int i = 0; i &lt; 3; i++)<br />
                       for (int j = 0; j &lt; 3; j++)<br />
                           temp[i, j, qun] = realtemp[i, j];<br />
                   tempstaus[qun] = tempstaus[minmain] + "/right";<br />
                   qu[0, qun] = qun;<br />
                   qu[1, qun] = h1(qun);<br />
                   qu[2, qun] = 0;<br />
                   listBox1.Items.Add(qu[0, qun].ToString() + "         h1= " + qu[1, qun].ToString() + "       " + tempstaus[qun]);<br />
                   Application.DoEvents();<br />
               }<br />
               //-----------------up<br />
               if (r&gt;0)<br />
               {<br />
                   for (int i = 0; i &lt; 3; i++) // enteghal tempe morede nazar be tempreal<br />
                       for (int j = 0; j &lt; 3; j++)<br />
                           realtemp[i, j] = temp[i, j, minmain];<br />
                   qun++;<br />
                   realtemp[r, c] = realtemp[r-1, c ];<br />
                   realtemp[r-1, c ] = 0;<br />
                   for (int i = 0; i &lt; 3; i++)<br />
                       for (int j = 0; j &lt; 3; j++)<br />
                           temp[i, j, qun] = realtemp[i, j];<br />
                   tempstaus[qun] = tempstaus[minmain] + "/up";<br />
                   qu[0, qun] = qun;<br />
                   qu[1, qun] = h1(qun);<br />
                   qu[2, qun] = 0;<br />
                   listBox1.Items.Add(qu[0, qun].ToString() + "         h1= " + qu[1, qun].ToString() + "       " + tempstaus[qun]);<br />
                   Application.DoEvents();<br />
               }<br />
               //-----------------down<br />
               if (r &lt; 2)<br />
               {<br />
                   for (int i = 0; i &lt; 3; i++) // enteghal tempe morede nazar be tempreal<br />
                       for (int j = 0; j &lt; 3; j++)<br />
                           realtemp[i, j] = temp[i, j, minmain];<br />
                   qun++;<br />
                   realtemp[r, c] = realtemp[r + 1, c];<br />
                   realtemp[r + 1, c] = 0;<br />
                   for (int i = 0; i &lt; 3; i++)<br />
                       for (int j = 0; j &lt; 3; j++)<br />
                           temp[i, j, qun] = realtemp[i, j];<br />
                   tempstaus[qun] = tempstaus[minmain] + "/down";<br />
                   qu[0, qun] = qun;<br />
                   qu[1, qun] = h1(qun);<br />
                   qu[2, qun] = 0;<br />
                   listBox1.Items.Add(qu[0, qun].ToString() + "         h1= " + qu[1, qun].ToString() + "       " + tempstaus[qun]);<br />
                   Application.DoEvents();<br />
               }<br />
#endregion<br />
           }<br />
       }<br />
       private void button1_Click(object sender, EventArgs e)<br />
       {<br />
           listBox1.Items.Clear();<br />
           listBox2.Items.Clear();<br />
           insertff();<br />
           run();<br />
       }<br />
       private void button2_Click(object sender, EventArgs e)<br />
       {<br />
           System.Diagnostics.Process.Start("http://www.sourcecodes.ir");<br />
       }<br />
<br />
   }<br />
}</code></div></div>]]></description>
			<content:encoded><![CDATA[<span style="color: #000000;" class="mycode_color"><span style="font-size: x-small;" class="mycode_size"><span style="font-family: Tahoma, Geneva, sans-serif;" class="mycode_font"><span style="font-size: small;" class="mycode_size">[font=tahoma, geneva, sans-serif]<span style="font-weight: bold;" class="mycode_b">معمای 8  یا  پازل 8-puzzle</span></span></span>[/font]</span></span><br />
<br />
<span style="color: #000000;" class="mycode_color"><span style="font-size: x-small;" class="mycode_size"><span style="font-family: Tahoma, Geneva, sans-serif;" class="mycode_font"><span style="font-size: small;" class="mycode_size">[font=tahoma, geneva, sans-serif]دوستانی که در  رشته های کامپیوتر، فناوری اطلاعات و هوش مصنوعی تحصیل می کنند حتما با <span style="font-weight: bold;" class="mycode_b">بازی پازل 8</span> آشنایی  دارند. این بازی  تقریبا پای ثابت اکثر معماها در آموزش ابتدایی  هوش مصنوعی است.</span></span>[/font]</span></span><br />
<span style="color: #000000;" class="mycode_color"><span style="font-size: x-small;" class="mycode_size"><span style="font-family: Tahoma, Geneva, sans-serif;" class="mycode_font"><span style="font-size: small;" class="mycode_size">[font=tahoma, geneva, sans-serif]این معما از یک جدول 3 در 3 تشکیل شده است که می شود 9 خانه.</span></span>[/font]</span></span><br />
<span style="color: #000000;" class="mycode_color"><span style="font-size: x-small;" class="mycode_size"><span style="font-family: Tahoma, Geneva, sans-serif;" class="mycode_font"><span style="font-size: small;" class="mycode_size">[font=tahoma, geneva, sans-serif]حالا در این جدول اعداد یک تا هشت قرار می گیرند و همچنین یکی از خانه ها خالی است.این معما شامل حالت اولیه و حالت نهایی است که باید به آن برسیم.</span></span>[/font]</span></span><br />
<span style="color: #000000;" class="mycode_color"><span style="font-size: x-small;" class="mycode_size"><span style="font-family: Tahoma, Geneva, sans-serif;" class="mycode_font"><span style="font-size: small;" class="mycode_size">[font=tahoma, geneva, sans-serif]<span style="font-weight: bold;" class="mycode_b">حالت اولیه :</span></span></span>[/font]</span></span><br />
<span style="color: #000000;" class="mycode_color"><span style="font-size: x-small;" class="mycode_size"><span style="font-family: Tahoma, Geneva, sans-serif;" class="mycode_font"><span style="font-size: small;" class="mycode_size">[font=tahoma, geneva, sans-serif]در این حالت اعداد می توانند به هر ترتیبی در جدول قرار گیرند.</span></span>[/font]</span></span><br />
<span style="color: #000000;" class="mycode_color"><span style="font-size: x-small;" class="mycode_size"><span style="font-family: Tahoma, Geneva, sans-serif;" class="mycode_font"><span style="font-size: small;" class="mycode_size">[font=tahoma, geneva, sans-serif]<span style="font-weight: bold;" class="mycode_b">حالت نهایی :</span></span></span>[/font]</span></span><br />
<span style="color: #000000;" class="mycode_color"><span style="font-size: x-small;" class="mycode_size"><span style="font-family: Tahoma, Geneva, sans-serif;" class="mycode_font"><span style="font-size: small;" class="mycode_size">[font=tahoma, geneva, sans-serif]حالتی است که از ما می خواهند به آن برسیم و این کار با حرکت خانه خالی میسر می شود. و باید از طریق قوانین زیر به آن رسید:</span></span>[/font]</span></span><br />
<span style="color: #000000;" class="mycode_color"><span style="font-size: x-small;" class="mycode_size"><span style="font-family: Tahoma, Geneva, sans-serif;" class="mycode_font"><span style="font-size: x-small;" class="mycode_size">[font=tahoma, geneva, sans-serif]1- اگر سمت چپ خانه خالي ، عدد باشد حرکت خانه خالي به سمت چپ</span></span>[/font]</span></span><br />
<span style="color: #000000;" class="mycode_color"><span style="font-size: x-small;" class="mycode_size"><span style="font-family: Tahoma, Geneva, sans-serif;" class="mycode_font"><span style="font-size: x-small;" class="mycode_size">[font=tahoma, geneva, sans-serif]2- اگر سمت راست خانه خالي ، عدد باشد حرکت خانه خالي به سمت راست</span></span>[/font]</span></span><br />
<span style="color: #000000;" class="mycode_color"><span style="font-size: x-small;" class="mycode_size"><span style="font-family: Tahoma, Geneva, sans-serif;" class="mycode_font"><span style="font-size: x-small;" class="mycode_size">[font=tahoma, geneva, sans-serif]3- اگر سمت بالا خانه خالي ، عدد باشد حرکت خانه خالي به سمت بالا</span></span>[/font]</span></span><br />
<span style="color: #000000;" class="mycode_color"><span style="font-size: x-small;" class="mycode_size"><span style="font-family: Tahoma, Geneva, sans-serif;" class="mycode_font"><span style="font-size: x-small;" class="mycode_size">[font=tahoma, geneva, sans-serif]4- اگر سمت پايين خانه خالي ، عدد باشد حرکت خانه خالي به سمت پايين</span></span>[/font]</span></span><br />
<span style="color: #000000;" class="mycode_color"><span style="font-size: x-small;" class="mycode_size"><span style="font-family: Tahoma, Geneva, sans-serif;" class="mycode_font"> </span></span></span><br />
<span style="color: #000000;" class="mycode_color"><span style="font-size: x-small;" class="mycode_size"><span style="font-family: Tahoma, Geneva, sans-serif;" class="mycode_font">[font=tahoma, geneva, sans-serif]<span style="font-size: small;" class="mycode_size">الگوریتم های متعددی برای این کار وجود دارد که یکی از آنها <span style="font-weight: bold;" class="mycode_b">الگوریتم ژنتیک </span>است.که در واقع این برنامه توسط این الگوریتم هوش مصنوعی و زبان برنامه نویسی سی شارپ پیاده سازی شده است.</span></span>[/font]</span></span><br />
<span style="color: #000000;" class="mycode_color"><span style="font-size: x-small;" class="mycode_size"><span style="font-family: Tahoma, Geneva, sans-serif;" class="mycode_font"> </span></span></span><br />
<div class="codeblock"><div class="title">کد: </div><div class="body" dir="ltr"><code>using System;<br />
using System.Collections.Generic;<br />
using System.ComponentModel;<br />
using System.Data;<br />
using System.Drawing;<br />
using System.Linq;<br />
using System.Text;<br />
using System.Windows.Forms;<br />
using System.Collections;<br />
namespace _8<br />
{<br />
   public partial class Form1 : Form<br />
   {<br />
       public Form1()<br />
       {<br />
           InitializeComponent();<br />
       }<br />
       int[,] first = new int[3, 3];<br />
       int[,] final = new int[3, 3];<br />
       int[, ,] temp = new int[3, 3, 10000];<br />
       string[] tempstaus = new string[10000];<br />
       int[,] realtemp = new int[3, 3];<br />
       int[,] qu = new int[3, 10000];<br />
<br />
       private void showtemp(int qun)        <br />
       {<br />
           string s = "";<br />
           listBox2.Items.Clear();<br />
           for (int i = 0; i &lt;= qun; i++)<br />
           {<br />
               for (int j = 0; j &lt; 3; j++)<br />
               {<br />
                   for (int k = 0; k &lt; 3; k++)<br />
                   {                        <br />
                       s += temp[j, k, i].ToString() + "  ";                        <br />
                   }<br />
                   listBox2.Items.Add(s);<br />
                   s = "";<br />
               }<br />
               listBox2.Items.Add(tempstaus[i]);<br />
               listBox2.Items.Add("=====================");    <br />
               <br />
           }<br />
<br />
       <br />
       }<br />
       private void insertff()<br />
       {<br />
           first[0, 0] = Convert.ToInt32(textBox1.Text);<br />
           first[0, 1] = Convert.ToInt32(textBox2.Text);<br />
           first[0, 2] = Convert.ToInt32(textBox3.Text);<br />
           first[1, 0] = Convert.ToInt32(textBox4.Text);<br />
           first[1, 1] = Convert.ToInt32(textBox5.Text);<br />
           first[1, 2] = Convert.ToInt32(textBox6.Text);<br />
           first[2, 0] = Convert.ToInt32(textBox7.Text);<br />
           first[2, 1] = Convert.ToInt32(textBox8.Text);<br />
           first[2, 2] = Convert.ToInt32(textBox9.Text);<br />
           final[0, 0] = Convert.ToInt32(textBox18.Text);<br />
           final[0, 1] = Convert.ToInt32(textBox17.Text);<br />
           final[0, 2] = Convert.ToInt32(textBox16.Text);<br />
           final[1, 0] = Convert.ToInt32(textBox15.Text);<br />
           final[1, 1] = Convert.ToInt32(textBox14.Text);<br />
           final[1, 2] = Convert.ToInt32(textBox13.Text);<br />
           final[2, 0] = Convert.ToInt32(textBox12.Text);<br />
           final[2, 1] = Convert.ToInt32(textBox11.Text);<br />
           final[2, 2] = Convert.ToInt32(textBox10.Text);<br />
       }<br />
       private int h1(int n)<br />
       {<br />
           int h = 0;<br />
           for (int i = 0; i &lt; 3; i++)<br />
               for (int j = 0; j &lt; 3; j++)<br />
                   if (temp[i, j, n] != final[i, j])<br />
                   {<br />
                       if(temp[i, j, n] !=0)<br />
                       h++;<br />
                   }<br />
           int x=0;<br />
           foreach(char  s in tempstaus[n])<br />
                if (s == '/')<br />
                   x++;<br />
<br />
    <br />
               return h+x ;<br />
       }<br />
       private void run()<br />
       {<br />
           #region first node<br />
           for (int i = 0; i &lt; 3; i++)<br />
               for (int j = 0; j &lt; 3; j++)<br />
                   temp[i, j, 0] = first[i, j];<br />
           tempstaus[0] = "0";<br />
           int qun = 0;<br />
           qu[0, qun] = qun ;<br />
           qu[1, qun] = h1(qun);<br />
           qu[2, qun] = 0;<br />
           listBox1.Items.Add(qu[0, qun].ToString() + "         h1= " + qu[1, qun].ToString() + "       " + tempstaus[qun]);<br />
           Application.DoEvents();<br />
#endregion<br />
           while (true)<br />
           {<br />
                   int min=0;<br />
                   int minmain = 0;<br />
               for (int i = 0; i &lt;= qun ; i++)// peyda kardane avvalin onsore peymude nashode<br />
               {<br />
                   if(qu[2,i]==0)<br />
                   {<br />
                       min = qu[1, i];<br />
                       minmain = i;<br />
                       break;<br />
                   }<br />
               }<br />
            for (int i = 0; i &lt;= qun; i++)// peyda kardane kuchiktarin onsor<br />
               {<br />
                   if (qu[1, i] &lt; min &amp;&amp; qu[2, i]==0)<br />
                   {<br />
                       min = qu[1, i];<br />
                       minmain = i;<br />
                   }<br />
               }<br />
              // MessageBox.Show("min= " + min.ToString() + "  minmain =  " + minmain.ToString() + "  qun=" + qun.ToString());<br />
<br />
               int r=0, c=0;<br />
               for (int i = 0; i &lt; 3; i++)//peyda kardane khune khali<br />
                   for (int j = 0; j &lt; 3; j++)<br />
                       if (temp[i, j, minmain] == 0)<br />
                       {<br />
                           r = i;<br />
                           c = j;<br />
                           break;                       <br />
                       }<br />
               for (int i = 0; i &lt; 3; i++) // enteghal tempe morede nazar be tempreal<br />
                   for (int j = 0; j &lt; 3; j++)<br />
                       realtemp[i, j] = temp[i, j, minmain];<br />
             // MessageBox.Show(minmain.ToString());<br />
               qu[2, minmain] = 1;<br />
               /////////////////////////////////////////////tolide farzandan////////////////////////////////////////////////<br />
               showtemp(qun);<br />
               int x = 0;<br />
               foreach (char s in tempstaus[minmain ])<br />
                   if (s == '/')<br />
                       x++;<br />
               if (h1(minmain)-x  == 0)<br />
               {<br />
                   MessageBox.Show("found !!!     masir  = "+tempstaus[minmain].ToString());<br />
                   break;<br />
               }<br />
               #region  tolide farzand<br />
               //===================================check resltemp != jadd===================================<br />
<br />
               //-----------------l<br />
               if (c &gt; 0)<br />
               {<br />
                   qun++;<br />
                   realtemp[r, c] = realtemp[r, c - 1];<br />
                   realtemp[r, c - 1]=0;<br />
                   tempstaus[qun] =tempstaus[minmain]+ "/left";<br />
                   for (int i = 0; i &lt; 3; i++)<br />
                       for (int j = 0; j &lt; 3; j++)<br />
                           temp[i, j, qun] = realtemp[i, j];<br />
                   qu[0, qun] = qun;<br />
                   qu[1, qun] = h1(qun);<br />
                   qu[2, qun] = 0;<br />
                   listBox1.Items.Add(qu[0, qun].ToString() + "         h1= " + qu[1, qun].ToString() + "       " + tempstaus[qun]);<br />
                   Application.DoEvents();<br />
               }<br />
               //-----------------r<br />
               if (c &lt; 2)<br />
               {<br />
                   for (int i = 0; i &lt; 3; i++) // enteghal tempe morede nazar be tempreal<br />
                       for (int j = 0; j &lt; 3; j++)<br />
                           realtemp[i, j] = temp[i, j, minmain];<br />
                   qun++;<br />
                   realtemp[r, c] = realtemp[r, c+1];<br />
                   realtemp[r, c+ 1] = 0;<br />
                   for (int i = 0; i &lt; 3; i++)<br />
                       for (int j = 0; j &lt; 3; j++)<br />
                           temp[i, j, qun] = realtemp[i, j];<br />
                   tempstaus[qun] = tempstaus[minmain] + "/right";<br />
                   qu[0, qun] = qun;<br />
                   qu[1, qun] = h1(qun);<br />
                   qu[2, qun] = 0;<br />
                   listBox1.Items.Add(qu[0, qun].ToString() + "         h1= " + qu[1, qun].ToString() + "       " + tempstaus[qun]);<br />
                   Application.DoEvents();<br />
               }<br />
               //-----------------up<br />
               if (r&gt;0)<br />
               {<br />
                   for (int i = 0; i &lt; 3; i++) // enteghal tempe morede nazar be tempreal<br />
                       for (int j = 0; j &lt; 3; j++)<br />
                           realtemp[i, j] = temp[i, j, minmain];<br />
                   qun++;<br />
                   realtemp[r, c] = realtemp[r-1, c ];<br />
                   realtemp[r-1, c ] = 0;<br />
                   for (int i = 0; i &lt; 3; i++)<br />
                       for (int j = 0; j &lt; 3; j++)<br />
                           temp[i, j, qun] = realtemp[i, j];<br />
                   tempstaus[qun] = tempstaus[minmain] + "/up";<br />
                   qu[0, qun] = qun;<br />
                   qu[1, qun] = h1(qun);<br />
                   qu[2, qun] = 0;<br />
                   listBox1.Items.Add(qu[0, qun].ToString() + "         h1= " + qu[1, qun].ToString() + "       " + tempstaus[qun]);<br />
                   Application.DoEvents();<br />
               }<br />
               //-----------------down<br />
               if (r &lt; 2)<br />
               {<br />
                   for (int i = 0; i &lt; 3; i++) // enteghal tempe morede nazar be tempreal<br />
                       for (int j = 0; j &lt; 3; j++)<br />
                           realtemp[i, j] = temp[i, j, minmain];<br />
                   qun++;<br />
                   realtemp[r, c] = realtemp[r + 1, c];<br />
                   realtemp[r + 1, c] = 0;<br />
                   for (int i = 0; i &lt; 3; i++)<br />
                       for (int j = 0; j &lt; 3; j++)<br />
                           temp[i, j, qun] = realtemp[i, j];<br />
                   tempstaus[qun] = tempstaus[minmain] + "/down";<br />
                   qu[0, qun] = qun;<br />
                   qu[1, qun] = h1(qun);<br />
                   qu[2, qun] = 0;<br />
                   listBox1.Items.Add(qu[0, qun].ToString() + "         h1= " + qu[1, qun].ToString() + "       " + tempstaus[qun]);<br />
                   Application.DoEvents();<br />
               }<br />
#endregion<br />
           }<br />
       }<br />
       private void button1_Click(object sender, EventArgs e)<br />
       {<br />
           listBox1.Items.Clear();<br />
           listBox2.Items.Clear();<br />
           insertff();<br />
           run();<br />
       }<br />
       private void button2_Click(object sender, EventArgs e)<br />
       {<br />
           System.Diagnostics.Process.Start("http://www.sourcecodes.ir");<br />
       }<br />
<br />
   }<br />
}</code></div></div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[مسئله فروشنده دوره‌گرد (Travelling salesman problem : TSP )]]></title>
			<link>https://www.forum.cgaria.com/thread-666.html</link>
			<pubDate>Fri, 12 Dec 2014 19:39:12 +0330</pubDate>
			<dc:creator><![CDATA[<a href="https://www.forum.cgaria.com/member.php?action=profile&uid=5">Mohsen Omidvar</a>]]></dc:creator>
			<guid isPermaLink="false">https://www.forum.cgaria.com/thread-666.html</guid>
			<description><![CDATA[در این تاپیک مسئله فروشنده دوره گرد را به روش های مختلف حل می کنیم<br />
<br />
<div style="text-align: center;" class="mycode_align"><img src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/ca/Salesman.PNG/290px-Salesman.PNG" loading="lazy"  alt="[تصویر:  290px-Salesman.PNG]" class="mycode_img" /></div>
طرح مسئله<br />
<br />
تعدادی شهر داریم و هزینه (مسافت) مسافرت به هر یک از آنها مشخص است به دنبال کم هزینه ترین مسیر هستیم بطوریکه از همه شهرها فقط یکبار عیور کنیم و مجددا به محل شروع بازگردیم<br />
اگر فروشنده دوره‌گرد از نقطه A شروع کند و فواصل بین نقاط مشخص باشد، کوتاه‌تربن مسیر که از تمام نقاط یکبار بازدید می‌کند و به A بازمی‌گردد کدام است؟<br />
<br />
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<br />
مسئله فروشنده دوره گرد TSP یکی از مسائل مهم در زمره تئوری پیچیدگی محاسباتی الگوریتم ها می باشد که در گروه NP-Hard قرار می گیرد این مسئله اولین بار توسط دو دانشمند به نام های 1- هامیلتون ایرلندی و 2- کیرکمن بریتانیایی مطرح شد . معمولا بحث در خصوص این تئوری در مطالب اولیه دروس ریاضیات دانشجویان ریاضی ارائه می شود و در دروسی نظیر تئوری گراف می توانید مطالب مشابه را نیز بدست آورید .<br />
<br />
پیچیدگی محاسباتی الگوریتم فروشنده دوره گرد<br />
<br />
این الگوریتم بطور مستقیم در مرتبه زمانی(!O(n حل می شود اما اگر به روش برنامه نویسی پویا برای حل آن استفاده کنیم مرتبه زمانی آن (O(n^2*2^n خواهد شد که جز مرتبه های نمایی است. باید توجه داشت علی رغم آنکه مرتبه نمایی مذکور زمان بسیار بدی است اما همچنان بسیار بهتر از مرتبه فاکتوریل می باشد .<br />
<br />
شبه کد الگوریتم فوق بصورت زیر است که در آن تعداد زیر مجموعه های یک مجموعه n عضوی 2 به توان n می باشد<br />
<br />
و for اول یک ضریب n را نیز حاصل می شود که به ازای تمام شهرهای غیر مبدا می باشد و حاصل (n*(2^n را پدید می آورد<br />
بنابراین برای جستجوی کمترین مقدار نیاز به یک عملیات خطی از مرتبه n داریم که در زمان فوق نیز ضرب می شود و در نهایت زمان (n^2)*(2^n) را برای این الگوریتم حاصل می کند<br />
<br />
<br />
<br />
<div class="codeblock"><div class="title">کد: </div><div class="body" dir="ltr"><code>C({1},1) = 0<br />
for (S=2 to n )<br />
for All Subsets S subset of {1,2,3,...} of size S and containing 1<br />
C(S,1) = &amp;<br />
for All J member of S , J&lt;&gt;1<br />
C ( S , J ) = min { C ( S - { J } , i ) + D i,J : i member of S , i &lt;&gt; J }<br />
return min j C ( {1 . . . n}, J ) + D J,1</code></div></div><br />
<br />
سايتهايي که کدهاي حل اين مسئله را از روش هاي متفاوت و زبانهاي مختلف ارائه کرده اند:<br />
<br />
<br />
<br />
<div style="text-align: center;" class="mycode_align"><strong><font color= red>*شما قادر به دیدن لینک ها نیستید <a href="https://www.forum.cgaria.com/member.php?action=register">ثبت نام کنید</a> یا <a href="https://www.forum.cgaria.com/member.php?action=login">وارد حساب خود شوید</a> تا بتوانید لینک ها را ببینید*</strong></font></div>
<br />
<br />
<br />
<strong><font color= red>*شما قادر به دیدن لینک ها نیستید <a href="https://www.forum.cgaria.com/member.php?action=register">ثبت نام کنید</a> یا <a href="https://www.forum.cgaria.com/member.php?action=login">وارد حساب خود شوید</a> تا بتوانید لینک ها را ببینید*</strong></font><br />
<br />
<br />
<br />
<strong><font color= red>*شما قادر به دیدن لینک ها نیستید <a href="https://www.forum.cgaria.com/member.php?action=register">ثبت نام کنید</a> یا <a href="https://www.forum.cgaria.com/member.php?action=login">وارد حساب خود شوید</a> تا بتوانید لینک ها را ببینید*</strong></font><br />
<br />
<br />
<strong><font color= red>*شما قادر به دیدن لینک ها نیستید <a href="https://www.forum.cgaria.com/member.php?action=register">ثبت نام کنید</a> یا <a href="https://www.forum.cgaria.com/member.php?action=login">وارد حساب خود شوید</a> تا بتوانید لینک ها را ببینید*</strong></font><br />
<br />
اين مسئله ، مسئله‌ای مشهور است که ابتدا در سده ۱۸ مسائل مربوط به آن توسط ویلیام همیلتون و توماس کرکمن مطرح شد و سپس در دهه ۱۹۳۰ شکل عمومی آن به وسیله ریاضیدانانی مثل کارل منگر از دانشگاه هاروارد و هاسلر ویتنی از دانشگاه پرینستون مورد مطالعه قرار گرفت.<br />
<br />
شرح مسئله بدین شکل است:<br />
<br />
تعدادی شهر داریم و هزینه رفتن مستقیم از یکی به دیگری را می‌دانیم. مطلوب است کم‌هزینه‌ترین مسیری که از یک شهر شروع شود و از تمامی شهرها دقیقاٌ یکبار عبور کند و به شهر شروع بازگردد.<br />
<br />
تعداد کل راه‌حل‌ها برابر است با برای n&gt;۲ که n تعداد شهرها است. در واقع این عدد برابر است با تعداد دورهای همیلتونی در یک گراف کامل با n رأس.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">مسئله‌های مرتبط</span><br />
مسئله معادل در نظریه گراف به این صورت است که یک گراف وزن‌دار کامل داریم که می‌خواهیم کم‌وزن‌ترین دور همیلتونی را پیدا کنیم.<br />
مسئله تنگراه فروشنده دوره‌گرد (به انگلیسی: Bottleneck traveling salesman problem، به‌اختصار: bottleneck TSP ) مسئله‌ای بسیار کاربردی است که در یک گراف وزن‌دار کم‌وزن‌ترین دور همیلتونی را می‌خواهد که شامل سنگین‌ترین یال باشد.<br />
تعمیم‌یافته مسئله فروشنده دوره‌گرد دارای ایالت‌هایی است که هر کدام حداقل یک شهر دارند و فروشنده باید از هر ایالت دقیقاٌ از یک شهر عبور کند. این مسئله به « مسئله سیاست‌مدار مسافر» نیز شهرت دارد.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">الگوریتم‌ها</span><br />
<br />
مسئله فروشنده دوره‌گرد جزء مسائل NP-hard است. راه‌های معمول مقابله با چنین مسائلی عبارتند از:<br />
<br />
طراحی الگوریتم‌هایی برای پیدا کردن جواب‌های دقیق که استفاده از آنها فقط برای مسائل با اندازه کوچک صورت می‌گیرد.<br />
<br />
استفاده از الگوریتم‌های مکاشفه‌ای که جواب‌هایی به‌دست می‌دهد که احتمالاٌ درست هستند.<br />
<br />
پیدا کردن زیرمسئله‌هایی از مسئله یعنی تقسیم مسئله به مسئله‌های کوچکتر تا بشود از الگوریتم‌های مکاشفه‌ای بهتر و دقیق‌تری ارائه کرد.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">الگوریتم‌های دقیق</span><br />
سرراست ترین راه حل امتحان کردن تمامی جایگشت‌های ممکن برای پیدا کردن ارزان‌ترین مسیر است که چون تعداد جایگشت‌ها !n است، این راه حل غیرعملی می‌شود. با استفاده از برنامه‌نویسی پویا مسئله می‌تواند با مرتبه زمانی n22n حل شود. راه‌های دیگر استفاده از الگوریتم‌های انشعاب و تحدید برای ۴۰ تا ۶۰ شهر، استفاده از برنامه‌نویسی خطی برای کوچکتر از ۲۰۰ شهر و استفاده از روش برش-صفحه برای اندازه‌های بزرگ است.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">الگوریتم‌های مکاشفه‌ای</span><br />
الگوریتم‌های تقریبی متنوعی وجود دارند که خیلی سریع جواب‌های درست را با احتمال بالا به‌دست می‌دهند که می‌توان آنها را به صورت زیر دسته‌بندی کرد:<br />
<br />
مکاشفه‌ای سازنده<br />
بهبود تکراری<br />
مبادله دوبه‌دو<br />
مکاشفه‌ای k-opt<br />
مکاشفه‌ای V-opt<br />
بهبود تصادفی<br />
----------------------------------------------<br />
<strong><font color= red>*شما قادر به دیدن لینک ها نیستید <a href="https://www.forum.cgaria.com/member.php?action=register">ثبت نام کنید</a> یا <a href="https://www.forum.cgaria.com/member.php?action=login">وارد حساب خود شوید</a> تا بتوانید لینک ها را ببینید*</strong></font> ]]></description>
			<content:encoded><![CDATA[در این تاپیک مسئله فروشنده دوره گرد را به روش های مختلف حل می کنیم<br />
<br />
<div style="text-align: center;" class="mycode_align"><img src="http://upload.wikimedia.org/wikipedia/commons/thumb/c/ca/Salesman.PNG/290px-Salesman.PNG" loading="lazy"  alt="[تصویر:  290px-Salesman.PNG]" class="mycode_img" /></div>
طرح مسئله<br />
<br />
تعدادی شهر داریم و هزینه (مسافت) مسافرت به هر یک از آنها مشخص است به دنبال کم هزینه ترین مسیر هستیم بطوریکه از همه شهرها فقط یکبار عیور کنیم و مجددا به محل شروع بازگردیم<br />
اگر فروشنده دوره‌گرد از نقطه A شروع کند و فواصل بین نقاط مشخص باشد، کوتاه‌تربن مسیر که از تمام نقاط یکبار بازدید می‌کند و به A بازمی‌گردد کدام است؟<br />
<br />
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<br />
مسئله فروشنده دوره گرد TSP یکی از مسائل مهم در زمره تئوری پیچیدگی محاسباتی الگوریتم ها می باشد که در گروه NP-Hard قرار می گیرد این مسئله اولین بار توسط دو دانشمند به نام های 1- هامیلتون ایرلندی و 2- کیرکمن بریتانیایی مطرح شد . معمولا بحث در خصوص این تئوری در مطالب اولیه دروس ریاضیات دانشجویان ریاضی ارائه می شود و در دروسی نظیر تئوری گراف می توانید مطالب مشابه را نیز بدست آورید .<br />
<br />
پیچیدگی محاسباتی الگوریتم فروشنده دوره گرد<br />
<br />
این الگوریتم بطور مستقیم در مرتبه زمانی(!O(n حل می شود اما اگر به روش برنامه نویسی پویا برای حل آن استفاده کنیم مرتبه زمانی آن (O(n^2*2^n خواهد شد که جز مرتبه های نمایی است. باید توجه داشت علی رغم آنکه مرتبه نمایی مذکور زمان بسیار بدی است اما همچنان بسیار بهتر از مرتبه فاکتوریل می باشد .<br />
<br />
شبه کد الگوریتم فوق بصورت زیر است که در آن تعداد زیر مجموعه های یک مجموعه n عضوی 2 به توان n می باشد<br />
<br />
و for اول یک ضریب n را نیز حاصل می شود که به ازای تمام شهرهای غیر مبدا می باشد و حاصل (n*(2^n را پدید می آورد<br />
بنابراین برای جستجوی کمترین مقدار نیاز به یک عملیات خطی از مرتبه n داریم که در زمان فوق نیز ضرب می شود و در نهایت زمان (n^2)*(2^n) را برای این الگوریتم حاصل می کند<br />
<br />
<br />
<br />
<div class="codeblock"><div class="title">کد: </div><div class="body" dir="ltr"><code>C({1},1) = 0<br />
for (S=2 to n )<br />
for All Subsets S subset of {1,2,3,...} of size S and containing 1<br />
C(S,1) = &amp;<br />
for All J member of S , J&lt;&gt;1<br />
C ( S , J ) = min { C ( S - { J } , i ) + D i,J : i member of S , i &lt;&gt; J }<br />
return min j C ( {1 . . . n}, J ) + D J,1</code></div></div><br />
<br />
سايتهايي که کدهاي حل اين مسئله را از روش هاي متفاوت و زبانهاي مختلف ارائه کرده اند:<br />
<br />
<br />
<br />
<div style="text-align: center;" class="mycode_align"><strong><font color= red>*شما قادر به دیدن لینک ها نیستید <a href="https://www.forum.cgaria.com/member.php?action=register">ثبت نام کنید</a> یا <a href="https://www.forum.cgaria.com/member.php?action=login">وارد حساب خود شوید</a> تا بتوانید لینک ها را ببینید*</strong></font></div>
<br />
<br />
<br />
<strong><font color= red>*شما قادر به دیدن لینک ها نیستید <a href="https://www.forum.cgaria.com/member.php?action=register">ثبت نام کنید</a> یا <a href="https://www.forum.cgaria.com/member.php?action=login">وارد حساب خود شوید</a> تا بتوانید لینک ها را ببینید*</strong></font><br />
<br />
<br />
<br />
<strong><font color= red>*شما قادر به دیدن لینک ها نیستید <a href="https://www.forum.cgaria.com/member.php?action=register">ثبت نام کنید</a> یا <a href="https://www.forum.cgaria.com/member.php?action=login">وارد حساب خود شوید</a> تا بتوانید لینک ها را ببینید*</strong></font><br />
<br />
<br />
<strong><font color= red>*شما قادر به دیدن لینک ها نیستید <a href="https://www.forum.cgaria.com/member.php?action=register">ثبت نام کنید</a> یا <a href="https://www.forum.cgaria.com/member.php?action=login">وارد حساب خود شوید</a> تا بتوانید لینک ها را ببینید*</strong></font><br />
<br />
اين مسئله ، مسئله‌ای مشهور است که ابتدا در سده ۱۸ مسائل مربوط به آن توسط ویلیام همیلتون و توماس کرکمن مطرح شد و سپس در دهه ۱۹۳۰ شکل عمومی آن به وسیله ریاضیدانانی مثل کارل منگر از دانشگاه هاروارد و هاسلر ویتنی از دانشگاه پرینستون مورد مطالعه قرار گرفت.<br />
<br />
شرح مسئله بدین شکل است:<br />
<br />
تعدادی شهر داریم و هزینه رفتن مستقیم از یکی به دیگری را می‌دانیم. مطلوب است کم‌هزینه‌ترین مسیری که از یک شهر شروع شود و از تمامی شهرها دقیقاٌ یکبار عبور کند و به شهر شروع بازگردد.<br />
<br />
تعداد کل راه‌حل‌ها برابر است با برای n&gt;۲ که n تعداد شهرها است. در واقع این عدد برابر است با تعداد دورهای همیلتونی در یک گراف کامل با n رأس.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">مسئله‌های مرتبط</span><br />
مسئله معادل در نظریه گراف به این صورت است که یک گراف وزن‌دار کامل داریم که می‌خواهیم کم‌وزن‌ترین دور همیلتونی را پیدا کنیم.<br />
مسئله تنگراه فروشنده دوره‌گرد (به انگلیسی: Bottleneck traveling salesman problem، به‌اختصار: bottleneck TSP ) مسئله‌ای بسیار کاربردی است که در یک گراف وزن‌دار کم‌وزن‌ترین دور همیلتونی را می‌خواهد که شامل سنگین‌ترین یال باشد.<br />
تعمیم‌یافته مسئله فروشنده دوره‌گرد دارای ایالت‌هایی است که هر کدام حداقل یک شهر دارند و فروشنده باید از هر ایالت دقیقاٌ از یک شهر عبور کند. این مسئله به « مسئله سیاست‌مدار مسافر» نیز شهرت دارد.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">الگوریتم‌ها</span><br />
<br />
مسئله فروشنده دوره‌گرد جزء مسائل NP-hard است. راه‌های معمول مقابله با چنین مسائلی عبارتند از:<br />
<br />
طراحی الگوریتم‌هایی برای پیدا کردن جواب‌های دقیق که استفاده از آنها فقط برای مسائل با اندازه کوچک صورت می‌گیرد.<br />
<br />
استفاده از الگوریتم‌های مکاشفه‌ای که جواب‌هایی به‌دست می‌دهد که احتمالاٌ درست هستند.<br />
<br />
پیدا کردن زیرمسئله‌هایی از مسئله یعنی تقسیم مسئله به مسئله‌های کوچکتر تا بشود از الگوریتم‌های مکاشفه‌ای بهتر و دقیق‌تری ارائه کرد.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">الگوریتم‌های دقیق</span><br />
سرراست ترین راه حل امتحان کردن تمامی جایگشت‌های ممکن برای پیدا کردن ارزان‌ترین مسیر است که چون تعداد جایگشت‌ها !n است، این راه حل غیرعملی می‌شود. با استفاده از برنامه‌نویسی پویا مسئله می‌تواند با مرتبه زمانی n22n حل شود. راه‌های دیگر استفاده از الگوریتم‌های انشعاب و تحدید برای ۴۰ تا ۶۰ شهر، استفاده از برنامه‌نویسی خطی برای کوچکتر از ۲۰۰ شهر و استفاده از روش برش-صفحه برای اندازه‌های بزرگ است.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">الگوریتم‌های مکاشفه‌ای</span><br />
الگوریتم‌های تقریبی متنوعی وجود دارند که خیلی سریع جواب‌های درست را با احتمال بالا به‌دست می‌دهند که می‌توان آنها را به صورت زیر دسته‌بندی کرد:<br />
<br />
مکاشفه‌ای سازنده<br />
بهبود تکراری<br />
مبادله دوبه‌دو<br />
مکاشفه‌ای k-opt<br />
مکاشفه‌ای V-opt<br />
بهبود تصادفی<br />
----------------------------------------------<br />
<strong><font color= red>*شما قادر به دیدن لینک ها نیستید <a href="https://www.forum.cgaria.com/member.php?action=register">ثبت نام کنید</a> یا <a href="https://www.forum.cgaria.com/member.php?action=login">وارد حساب خود شوید</a> تا بتوانید لینک ها را ببینید*</strong></font> ]]></content:encoded>
		</item>
	</channel>
</rss>