假设我有一个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 过量)。