1 K中心问题(K-centers Problem)
k-centers problem: 寻找k个半径越小越好的center以覆盖所有的点。
比如:给定n个城市和每对城市之间的距离,选择k个城市放置仓库(或ATM或云服务器),以使城市到仓库(或ATM或云服务器)的最大距离最小化。
再如:考虑以下四个城市,0、1、2和3,以及它们之间的距离,如何在这四个城市中放置两台ATM,以使城市到ATM的最大距离最小化。
2 源程序
using System;
using System.Collections.Generic;
namespace Legalsoft.Truffer.Algorithm
{
public class K_Centers
{
private static int MaxIndex(int[] dist, int n)
{
int mi = 0;
for (int i = 0; i < n; i++)
{
if (dist[i] > dist[mi])
{
mi = i;
}
}
return mi;
}
public static List<int> Select_K_Cities(int[,] weights, int k)
{
int n = weights.GetLength(0);
int[] dist = new int[n];
List<int> centers = new List<int>();
for (int i = 0; i < n; i++)
{
dist[i] = Int32.MaxValue;
}
int max = 0;
for (int i = 0; i < k; i++)
{
centers.Add(max);
for (int j = 0; j < n; j++)
{
dist[j] = Math.Min(dist[j], weights[max, j]);
}
max = MaxIndex(dist, n);
}
List<int> list = new List<int>();
list.Add(dist[max]);
for (int i = 0; i < centers.Count; i++)
{
list.Add(centers[i]);
}
return list;
}
}
}
3 源代码
using System;
using System.Collections.Generic;
namespace Legalsoft.Truffer.Algorithm
{
public class K_Centers
{
private static int MaxIndex(int[] dist, int n)
{
int mi = 0;
for (int i = 0; i < n; i++)
{
if (dist[i] > dist[mi])
{
mi = i;
}
}
return mi;
}
public static List<int> Select_K_Cities(int[,] weights, int k)
{
int n = weights.GetLength(0);
int[] dist = new int[n];
List<int> centers = new List<int>();
for (int i = 0; i < n; i++)
{
dist[i] = Int32.MaxValue;
}
int max = 0;
for (int i = 0; i < k; i++)
{
centers.Add(max);
for (int j = 0; j < n; j++)
{
dist[j] = Math.Min(dist[j], weights[max, j]);
}
max = MaxIndex(dist, n);
}
List<int> list = new List<int>();
list.Add(dist[max]);
for (int i = 0; i < centers.Count; i++)
{
list.Add(centers[i]);
}
return list;
}
}
}