<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>https://discopal.ispras.ru/index.php?action=history&amp;feed=atom&amp;title=Reviews%2FVasilyKorchagin%2FTSP</id>
		<title>Reviews/VasilyKorchagin/TSP - История изменений</title>
		<link rel="self" type="application/atom+xml" href="https://discopal.ispras.ru/index.php?action=history&amp;feed=atom&amp;title=Reviews%2FVasilyKorchagin%2FTSP"/>
		<link rel="alternate" type="text/html" href="https://discopal.ispras.ru/index.php?title=Reviews/VasilyKorchagin/TSP&amp;action=history"/>
		<updated>2026-04-20T18:25:30Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.26.4</generator>

	<entry>
		<id>https://discopal.ispras.ru/index.php?title=Reviews/VasilyKorchagin/TSP&amp;diff=838&amp;oldid=prev</id>
		<title>StasFomin в 21:24, 13 июня 2011</title>
		<link rel="alternate" type="text/html" href="https://discopal.ispras.ru/index.php?title=Reviews/VasilyKorchagin/TSP&amp;diff=838&amp;oldid=prev"/>
				<updated>2011-06-13T21:24:50Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;code-python&amp;gt;&lt;br /&gt;
#!/usr/bin/python2&lt;br /&gt;
# -*- coding: utf8 -*-&lt;br /&gt;
&lt;br /&gt;
from itertools import permutations&lt;br /&gt;
&lt;br /&gt;
def TSP_bool(n, D, B):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Верно ли, что минимально возможное значение суммы меньше B?&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    for p in permutations(xrange(1, n)): # Перебор всех перестановок&lt;br /&gt;
        length = D[0][p[0]] # Прибавляем путь из первой вершины&lt;br /&gt;
        if length  &amp;gt; 0 and D[p[-1]][0] &amp;gt; 0: # Путь p связен с v0&lt;br /&gt;
            found = True&lt;br /&gt;
            for i in xrange(len(p) - 1):&lt;br /&gt;
                if D[p[i]][p[i + 1]] == -1: # Нет такого ребра&lt;br /&gt;
                    found = False # Путь не найден&lt;br /&gt;
                    break&lt;br /&gt;
                length += D[p[i]][p[i + 1]]&lt;br /&gt;
                if length &amp;gt; B: # Если сумма больше B, то путь не найден&lt;br /&gt;
                    found = False&lt;br /&gt;
                    break&lt;br /&gt;
            #print found&lt;br /&gt;
            if found:&lt;br /&gt;
                # Прибавляем путь из последней вершины в первую&lt;br /&gt;
                if length + D[p[-1]][0] &amp;lt; B:&lt;br /&gt;
                    return True, p&lt;br /&gt;
    return False, ()&lt;br /&gt;
&lt;br /&gt;
def TSP(n, D):&lt;br /&gt;
    B_min = 0&lt;br /&gt;
    # n умножить на максимальный вес&lt;br /&gt;
    B_max = n * max([inner for outer in D for inner in outer])&lt;br /&gt;
    true_path = ()&lt;br /&gt;
    while B_max - B_min &amp;gt; 1:&lt;br /&gt;
        B = (B_min + B_max) / 2&lt;br /&gt;
        tsp_bool, path = TSP_bool(n, D, B)&lt;br /&gt;
        if tsp_bool:&lt;br /&gt;
            true_path = path&lt;br /&gt;
            B_max = B&lt;br /&gt;
        else:&lt;br /&gt;
            B_min = B&lt;br /&gt;
    if TSP_bool(n, D, B_min)[0]:&lt;br /&gt;
        return B_min, true_path&lt;br /&gt;
    return B_max, true_path&lt;br /&gt;
&lt;br /&gt;
D = [&lt;br /&gt;
 [0 , 15, 20, 15, -1],&lt;br /&gt;
 [15, 0 , 50, 10, 60],&lt;br /&gt;
 [20, 50, 0 , 30, 50],&lt;br /&gt;
 [15, 10, 30, 0 , 80],&lt;br /&gt;
 [-1, 60, 50, 80, 0 ]&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
print TSP(5, D)&lt;br /&gt;
&amp;lt;/code-python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Замечания ==&lt;br /&gt;
* От лишней пунктуации надо избавляться — это же питон, максимум простоты и читаемости.&lt;br /&gt;
** &amp;lt;tt&amp;gt;;&amp;lt;/tt&amp;gt; не нужны.&lt;br /&gt;
** лишние скобки вокруг возвращаемых tuples не нужны.&lt;br /&gt;
** «продления строк» &amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt; внутри скобочных конструкций не нужны.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;sum&amp;lt;/tt&amp;gt; — встроенная функция, переменную надо именовать по-другому.&lt;br /&gt;
* &amp;lt;tt&amp;gt;continue&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;break&amp;lt;/tt&amp;gt; — это почти что «goto», их желательно избегать, тут это возможно.&lt;br /&gt;
* Все лишнее нужно выкидывать. Например «else-ветвь» в конце.&lt;br /&gt;
* n — это свойство «матрицы» D, гонять его отдельным параметром — отстой.&lt;br /&gt;
&lt;br /&gt;
== Главное ==&lt;br /&gt;
* Программа неверна.&lt;br /&gt;
* Возвращает:&lt;br /&gt;
 (156, (2, 4, 1, 3))&lt;br /&gt;
— по матрице стоимостей сразу видно, что ни один путь не может стоить 156 (должен делится на 5).&lt;/div&gt;</summary>
		<author><name>StasFomin</name></author>	</entry>

	</feed>