TSP

動的計画法によるTSPのプログラムをC#に移植。(そのまんまだ)
http://blog.livedoor.jp/logopt/archives/2005-06.html#20050604

public static double TSP(double[,] dis)
{
	int	n = dis.GetLength(0);
	System.Diagnostics.Debug.Assert(n < 32);
	int	smax = 1<<n;
	double[,] f = new double[n, smax];
	for (int s=1;s<smax;++s) for (int i=0;i<n;++i) f[i,s] = double.PositiveInfinity;
	for (int i=0;i<n-1;++i) f[i, 1<<i] = dis[n-1, i];
	for (int s=1;s<smax;++s)
	{
		for (int i=0;i<n;++i)
		{
			if (((1<<i)&s) == 0) continue;
			for (int j=0;j<n;++j)
			{
				int	k = s | (1<<j);
				if (k == s) continue;
				double tmp = f[i,s] + dis[i,j];
				if (tmp < f[j,k]) f[j,k] = tmp;
			}
		}
	}
	return f[n-1,smax-1];
}
static void Main(string[] args)
{
	double[,] dis = {{0,2,4,5}, {2,0,4,2}, {4,4,0,3}, {5,2,3,0}};
	Console.WriteLine(TSP(dis));
}

有向グラフに対応しているが、無向ならばもっと早くなるかもしれない。ルートも出せる方がいいだろう。実用的ではないが、考え方を学ぶのにいいだろう。(いまいち理解していないが)