【问题标题】:Combinatorial optimization where several criteria must be satisfied必须满足多个标准的组合优化
【发布时间】:2013-04-18 03:46:03
【问题描述】:

我们是一群学习计算机科学的一年级学生。

我们正在做一个名为“电子饮食计划”(直译)的项目

我们想用 C# 编写一个程序,每周基本计算一个完全/满足某些标准的饮食计划:

您的每日能量摄入量不应超过计算的卡路里需求。 (例如,如果我们计算一个人每天应该摄入 2000 卡路里,那么饮食计划应该计划大约 2000 卡路里)

每天的能量(卡路里)应该分配如下:

  • 脂肪 25-35%
  • 碳水化合物 50-60%
  • 蛋白质 10-20%

我们有一个“数据库”,其中包含食物以及其中包含多少脂肪、碳水化合物和蛋白质 + 大概价格。 我们有一个“数据库”,其中包含食谱以及烹饪所需的时间。

SO:我们想要制作一个程序,每周计算一个满足日常能量需求的良好饮食计划(以及它应该如何分配(脂肪、碳水化合物、蛋白质))。该计划还应该计划一个不采取的饮食计划 花费大量时间且成本不高(用户定义了一周价格的上限)。

SO.. 我们希望帮助找到一种方法/算法,该方法/算法可以每天组合 3-6 道菜来满足这一点^^ 我们一直在研究很多组合优化算法/问题,但主要是“背包问题”。

但这些算法/问题只是满足一个标准或试图找到“最便宜”的解决方案。 -> 我们想要满足很多标准,想要找到最好的解决方案(不是最便宜的……例如脂肪必须在 25-35% 之间,而不仅仅是最低值)

我们希望你们中的一些人可以通过一个好的算法帮助我们。

【问题讨论】:

  • 嗯,你试过什么?
  • 有些东西你必须定义,它们与算法无关。您的约束的优先级是什么?例如,满足预算更重要还是满足卡路里限制更重要?你需要离边界多近?你可以过去,还是必须在下面?如果数据库中没有满足给定约束集的解决方案怎么办?您是否只返回“最佳”可能的解决方案?您如何定义一组紧密匹配中的“最佳”解决方案?
  • @mellamokb 从表面上看,成本不是约束,而是最小化的值。其他因素是约束,但不是要最小化的因素。因此,一种可能的(但诚然幼稚且可能效率低下)的算法是生成食谱的所有排列,按价格排序(升序),然后删除所有不符合给定标准的组合。对于 OP,我建议对我刚刚描述为基线的内容进行编码。这是最容易编码的。如果您不能足够快地计算(由于配方太多),那么您可以测试/比较其他算法。
  • 当您的任何脂肪/碳水化合物/蛋白质限制被违反时,您可以分配一个天文数字。这样一来,您仍然只需将一项成本降至最低。

标签: c# algorithm


【解决方案1】:

当谈到寻找“最便宜”的解决方案而不是“最好的”时,您只需要重新定义“便宜”。

在优化理论中,通常指的是要最小化的成本函数 - 在您的情况下,“成本”可能是“与 30% 的脂肪百分比差异”,即吃 30% 的脂肪没有任何成本,并且20% 和 40% 一样多。当然,为了使方法更加复杂,您可以称重,这样吃太多脂肪比吃太少更“昂贵”。

现在,如果您为每个标准创建成本,您还必须一起权衡它们,正如 mellamokb 在评论中指出的那样;为此,只需计算加权总成本。你最终会得到如下的结果:

饮食成本=(价格的重要性)*价格+(时间的重要性)*时间+(脂肪的重要性)*(与脂肪目标的偏差)+等...

如果您想避免超出预算(花费的金额),您可以添加诸如
over budget ? infinity : 0 之类的字词,以使算法在预算范围内找到解决方案。您还可以对重复进餐等进行限制 - 或多或少是您的想象力(和计算能力)设置了限制。

现在您已经有了成本函数,您可以开始着手解决问题:将饮食成本降至最低。突然间,所有那些找到“最便宜”解决方案的算法都变得有意义了……;)


请注意,制定此成本函数通常是困难的部分。根据您权衡成本的方式,您会找到非常不同的解决方案;并非所有这些都有用(事实上,它们中的大多数可能不会有用)。

【讨论】:

  • 另外,请注意某些算法可能会对您的成本函数提出要求;例如,可能要求它是连续的和/或可微的。你必须相应地调整你的体重等。
猜你喜欢
  • 2021-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-17
  • 1970-01-01
  • 1970-01-01
  • 2016-10-09
相关资源
最近更新 更多