我无法解决一个问题,包括从集合中选择项目。
我有一个项目集合,每个项目有三个功能,比如说X,Y和Z都有双重值
我有一些目标:
1)达到所选项目所有X值之和的特定下限。
2)达到所选项目所有Y值之和的特定下限。
3)达到所选项目所有Z值平均值的特定下限。
4)尽量减少仍然符合上述要求的项目数量。
我不确定要尝试什么类型的优化算法,任何正确方向的指针都会受到赞赏。如果可能的话,我想以某种方式优先考虑我的目标并使我的界限“柔和”,即使它们不能一致地完成仍然会返回“近距离”选择。
答案 0 :(得分:1)
听起来像是模拟退火
http://en.wikipedia.org/wiki/Simulated_annealing
在这个问题上可以很好地工作。
只需使用合适的软化目标函数(即惩罚你拥有的4个目标中的每一个),然后开始退火。
一些术语:这绝对不是线性编程,因为你的变量是二进制的(即包括这个项目)。
如果您的目标函数足够好,您可以使用贪心算法来快速获得合理的结果
答案 1 :(得分:1)
您所描述的问题类似于背包问题。在背包问题中,你有一定大小的特定包和一定大小且具有一定价值的物品。然后,您希望在不超过大小的同时最大化该值。
但是,您的问题有点不同。我会将其表示为最小化X,Y和Z值的总和以及最小化项目数量,并对表示下限的X,Y和Z设置约束。通过这个定义,您可以看到您的问题实际上是多目标的(我假设这些目标中的一些是冲突的,例如具有可行空间的项目的最小化)。您必须编写的函数称为适应度函数,用于计算特定选择的质量。要处理约束,您可以使用您返回的惩罚作为适应度,或者如果您可以处理算法中的约束,则指定约束违规程度。
我会使用启发式方法来解决这个问题。为此,我们需要选择问题解决方案的表示(数据结构)。
在背包中你可以选择二进制表示。这意味着对于每个项目,您在二进制向量中都有一个维度,如果包含它则为1,否则为0。向量的长度等于项目数。
对于求解器,存在许多用于这种表示的元启发式。但最接近的选择可能是遗传算法,它是在考虑二进制编码的情况下开发的。如果您想以多目标方式解决问题,我会选择NSGA-II或SPEA2作为算法。如果您将目标采用加权和方法或其他方法组合成单个值,John Holland定义的标准遗传算法就足够了。多目标算法具有以下优点:它们探索所有非支配解决方案的帕累托前沿,例如导致X更大的解决方案,但Y和Z不如其他解决方案,例如, X,Y和Z最小,但项目数较多。
已经提到的模拟退火算法是另一种解决此类问题的元启发式算法。但先验的是,目前还不能确定哪种方法会更好。但是,如果您事先不知道适合度值的范围,则模拟退火有点难以配置,因为您需要初始温度和适合此范围的冷却计划。
您还可以选择更简单的构造启发式方法,例如:以贪婪的方式工作(例如,总是把具有最大X,Y和Z的项目放在正下方或达到界限。但我认为元启发式会找到更好的解决方案。
答案 2 :(得分:1)
您的问题可以使用混合整数问题进行建模。如果您的集合不是太大(比如几百个值),我会使用这个模型,因为在标准的lp文件中编写它比编写和参数化启发式更容易。
您可以将此问题提供给混合整数问题解算器:
我在下面用伪数学语言编写了两个模型(注意这不是LP格式)。
设N是对象的集合,X_min和Y_min是你需要到达的下界,ZZ是Z值的平均下界。 我使用二进制变量s_i,如果选择了对象i,则其值为1,否则为0。确切的问题可以写成:
Minimize sum_{i in N} s_i
Subject to:
sum_{i in N} X_i s_i >= X_min
sum_{i in N} Y_i s_i >= Y_min
sum_{i in N} (Z_i - ZZ) s_i >= 0
foreach i in N, s_i in {0, 1}
请注意,正如Andreas的回答所述,还有其他方法可以做到这一点。 这个方法更容易(在我看来)优先考虑你的目标并“放松”问题,你可以使用上面的线性求解器。
添加三个松弛变量dX,dY,dZ和三个(正)权重系数wX,wY,wZ。 变量dX,dY和dZ将表示约束违规,“权重”表示您对约束违规的重要性。
然后你可以把问题写成:
Minimize sum_{i in N} s_i + wX dX + wY dY + wZ dZ
Subject to:
dX >= sum_{i in N} X_i s_i - X_min
dY >= sum_{i in N} Y_i s_i - Y_min
dZ >= sum_{i in N} (Z_i - ZZ) s_i
foreach i in N, s_i in {0, 1}
dX, dY, dZ >= 0
然后,您可以参数化wX,wY和wZ以优先考虑您的目标:例如,对于较大的权重值,模型将返回“硬边界”解决方案(如果存在);然后,具有较高权重的约束“不太可能”被违反(当然不是那么简单,只是为了给出一个想法)。