2

假设我有一个Group包含Element对象列表的数据结构,这样每个组都有一组唯一的元素。:

public class Group
{
  public List<Element> Elements;
}

假设我有一个需要某些元素的人口列表,每个人口都有一组独特的所需元素:

public class Population
{
  public List<Element> RequiredElements;
}

我有无限数量的每个定义的组,即它们不被人群消费

假设我正在查看一个特定的Population. 我想找到组的最佳匹配,以使多余的元素最少,并且没有不匹配的元素

例如:我的人口需要木材、钢铁、谷物和煤炭。唯一可用的组是 {wood, herbs}, {steel, coal, oil}, {grain, steel} 和 {herbs, meat}。

最后一组 - {herbs,meat} 我的人群根本不需要,所以没有使用。所有其他的都是需要的,但不需要草药和油,所以它被浪费了。此外,钢在最小集合中存在两次,因此也浪费了一批钢。此示例中的最佳匹配浪费了 3。

所以对于几百个Population对象,我需要找到最小浪费的最佳匹配并计算浪费了多少元素。

我什至如何开始解决这个问题?一旦我找到了一个匹配,计算浪费是微不足道的。一开始就很难找到匹配项。我可以列举所有的可能性,但有几千个人口和数百个群体,这是一项艰巨的任务。特别是考虑到整个事情都在模拟退火算法的每次迭代中。

我想知道我是否可以将整个事情制定为一个混合整数程序并在每次迭代时调用像 GLPK 这样的求解器。

我希望我已经正确解释了这个问题。我可以澄清任何不清楚的地方。


这是我的二进制程序,对于那些感兴趣的人...

x是决策向量,是 {0,1} 的一个元素,表示有问题的总体是否从组 i 接收。每个组都有一个条目。

b是列向量,是 {0,1} 的一个元素,它表示所讨论的人口需要/不需要哪些资源。每个资源都有一个条目。

A是一个矩阵,是 {0,1} 的一个元素,表示哪些资源属于哪些组。

该程序是:

最小化:((Ax - b)' * 1-vector) + (x' * 1-vector);

服从:Ax >= b;

约束只是说必须满足所有必需的资源。目标是最小化所有多余的和使用的组总数。(即使用 1 组 0 过量优于使用 5 组 0 过量)。

4

3 回答 3

0

你的意思是最大匹配问题吗?

您需要构建一个二分图,其中一侧是您的人口,另一侧是组,如果组 A 和人口 B 在其集合中,则边缘存在于组 A 和人口 B 之间。

要找到最大边缘匹配,您可以轻松使用 Kuhn 算法,TopCoder 上有详细描述。
但是,如果你想找到最小边支配集(覆盖所有顶点的最小边集),问题就变成了 NP-hard 并且不能在多项式时间内解决。

于 2012-10-09T03:40:56.210 回答
0

您可以为每个总体制定一个整数规划,P如下所示。使用二元变量 x j来表示是否选择了组 j。令 A 为二元矩阵,当且仅当项目 i 存在于组 j中时 A ij为 1。那么整数程序是:

最小E i,j (x j A ij )

st E j x j A ij >= 1 对于所有 i in P

x j = 0,对于所有 j 为 1。

请注意,您可以通过|P|从上述 IP 的最佳解决方案中减去来获得最小的浪费。

于 2012-10-09T04:29:30.813 回答
0

看看加权集覆盖问题,我认为这正是你上面描述的。可以在此处找到(未加权)问题的基本描述。

找到上面定义的最小浪费等效于找到一个集合覆盖,使得覆盖集的基数之和最小。因此,每个集合(=一组元素)的权重必须定义为等于其基数。

Since even the unweighted the set cover problem is NP-complete, it is not likely that an efficient algorithm for your problem instances exist. Maybe a good greedy approximation algorithm will be sufficient or your purpose? Googling weighted set cover provides several promising results, e.g. this script.

于 2012-10-10T06:34:40.833 回答