<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=421287&amp;view=findpost&amp;p=3850933</guid>
        <pubDate>Sun, 15 Aug 2021 03:09:21 +0000</pubDate>
        <title>Задача коммивояжера методом Монте-Карло</title>
        <link>https://forum.sources.ru/index.php?showtopic=421287&amp;view=findpost&amp;p=3850933</link>
        <description><![CDATA[mkudritsky: Эх, жалко, что я эту тему так поздно обнаружил (надо почаще на форум заходить).<br>
Наверное, тема уже не актуальна, но я отвечу тем не менее.<br>
<br>
1. Написать программу решения задачи коммивояжера (ЗК) методом Монте-Карло очень просто.<br>
Задаем для разомкнутой ЗК массив из N элементов по числу городов:<br>
short Gor[N], PromG, indG;<br>
В ячейки массива заносим номера городов:<br>
for (int i = 0; i &lt; N; i++)<br>
    Gor[i] = i;<br>
<br>
2. Генерируем индекс первого города:<br>
indG = rand() mod N;<br>
Меняем местами города с индексами 0 и indG:<br>
PromG = Gor[0]; Gor[0] = Gor[indG]; Gor[indG] = PromG;<br>
<br>
3. Работаем со i-м городом (по аналогии с первым):<br>
indG = (rand() mod (N - i)) + i;<br>
Меняем местами города с индексами i и indG:<br>
PromG = Gor[i]; Gor[i] = Gor[indG]; Gor[indG] = PromG;<br>
<br>
4. Ну и так далее. По пунктам 1 и 2 уже цикл просматривается.<br>
Таких маршрутов генерируется столько, сколько нужно и сколько не жалко - чем больше, тем лучше.<br>
Запоминается маршрут с минимальной суммарной длиной пути коммивояжера.<br>
<br>
P.S. Общие замечания по труднорешаемой комбинаторной задаче коммивояжера.<br>
А. Если число городов N достаточно большое, то о повторении маршрутов при генерации можно не беспокоиться - вероятность такого события чудовищно низка.<br>
Например, при N=100 общее число маршрутов примерно равно 10^158, что несравнимо больше, скажем, миллиарда генерируемых маршрутов (10^9) в методе Монте-Карло.<br>
Б. А судьи кто? С чем сравнивать найденный &quot;оптимум&quot; методом Монте-Карло?<br>
ЗК методом полного перебора (МПП) решается для числа городов N=13..14 не более.<br>
ЗК методом динамического программирования (МДП) точно решается для числа городов порядка N=30. При этом потребуется ПК с памятью 32-64Гб и информацию надо хранить не в байтах, а в отдельных битах&#33;<br>
Ну и для числа городов более 30 задача коммивояжера точно может быть решена только методом ветвей и границ (МВГ). При этом вероятность нахождения точного решения меньше единицы - а иначе ЗК не была бы труднорешаемой.<br>
В любом случае оценить среднюю точность метода Монте-Карло можно только путем сравнения его решения с решением МПП, МДП и МВГ. Разумеется, программы МПП, МДП и МВГ писать существенно сложнее, чем программу метода Монте-Карло.]]></description>
        <author>mkudritsky</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=421287&amp;view=findpost&amp;p=3845782</guid>
        <pubDate>Mon, 29 Mar 2021 05:20:49 +0000</pubDate>
        <title>Задача коммивояжера методом Монте-Карло</title>
        <link>https://forum.sources.ru/index.php?showtopic=421287&amp;view=findpost&amp;p=3845782</link>
        <description><![CDATA[Akina: А где Ваши наработки-то? в чём именно проблема, в какой точке затык?<br><br>А тому, кто сам ничего не делает, можно только помочь ничего не делать, знаете ли...]]></description>
        <author>Akina</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=421287&amp;view=findpost&amp;p=3845738</guid>
        <pubDate>Sat, 27 Mar 2021 15:30:45 +0000</pubDate>
        <title>Задача коммивояжера методом Монте-Карло</title>
        <link>https://forum.sources.ru/index.php?showtopic=421287&amp;view=findpost&amp;p=3845738</link>
        <description><![CDATA[Forever_smile: Помогите пожалуйста, написать программу на C++. Решить задачу коммивояжера методом Монте-Карло<br><br>Для решения задачи коммивояжера используются генераторы случайных чисел ЭВМ. Вместо ЭВМ используют урну с жетонами. Город &quot;1&quot; является начальным, и поэтому &quot;закладывают в урну&quot; жетоны с номерами 2 ... N. Вместо этого в ЭВМ можно рассматривать номера 1 ... (N-1). &quot;Тщательно перемешав жетоны&quot;, вытаскивают их по одному и записывают номера жетонов, которые считаются за полученный маршрут. Для этого маршрута рассчитывают функцию цели и запоминают как маршрут, так и функцию цели.<br>После этого процедуру повторяют. Если функция цели не изменилась или имеет худшее значение, то результат не учитывают. Если функция цели имеет лучшее значение, то новые лучшие результаты запоминают, а старые вычеркивают.<br>С помощью ЭВМ эта процедура позволяет за короткий срок осмотреть большое количество маршрутов и выбрать среди них если не лучший, то хотя бы не плохой.<br><br>N 1     2   3   4  5<br>1 –     6  60   48 12<br>2 5     –  10   80 100<br>3 140  150 –    12 70<br>4 96   120 70   –   6<br>5 18    9  24   90  –]]></description>
        <author>Forever_smile</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	