【发布时间】:2012-10-09 03:26:55
【问题描述】:
假设我有一个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;
约束只是说必须满足所有必需的资源。目标是最小化所有多余的和使用的组总数。 (即 0 过量使用 1 组优于 0 过量使用 5 组)。
【问题讨论】:
-
有多少种唯一类型的组,或者更确切地说,可以存在的唯一组的最大数量是多少?每个总体可以使用的最大元素数是多少?如果这些数字偏小,那么您可以通过迭代所有可能的唯一组组合并跟踪最小的浪费来强制解决方案。
-
正如我在问题中所说,每种类型都有数千个。此外,我需要为我的 SA 算法的每次迭代准确地解决这个问题。
标签: algorithm combinatorics mathematical-optimization