C# 必须满足多个条件的组合优化

C# 必须满足多个条件的组合优化,c#,algorithm,C#,Algorithm,我们是一群学习计算机科学的一年级学生 我们正在进行一个名为“电子饮食计划”的项目(直接翻译) 我们想用C语言编制一个程序,在每周的基础上计算一个饮食计划,以满足以下标准: 你每天的能量摄入不应该超过计算出的卡路里需求量。 (例如,如果我们计算一个人每天应该摄入2000卡路里,那么饮食计划应该计划大约2000卡路里) 每日能量(卡路里)的分配如下: 肥胖25-35% 碳水化合物50-60% 蛋白质10-20% 我们有一个“数据库”,里面有食物以及食物中含有多少脂肪、碳水化合物和蛋白质+大概的价

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

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

我们想用C语言编制一个程序,在每周的基础上计算一个饮食计划,以满足以下标准:

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

每日能量(卡路里)的分配如下:

  • 肥胖25-35%
  • 碳水化合物50-60%
  • 蛋白质10-20%
我们有一个“数据库”,里面有食物以及食物中含有多少脂肪、碳水化合物和蛋白质+大概的价格。 我们有一个“数据库”,里面有食谱和烹饪时间

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

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

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


我们希望你们中的一些人能帮助我们找到一个好的算法。

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

在优化理论中,人们经常提到要最小化的成本函数——在你的例子中,“成本”可以是“脂肪百分比与30%的差异”,也就是说,吃30%的脂肪不需要任何成本,吃20%的脂肪与吃40%的脂肪同样需要成本。当然,为了使这个方法更加复杂,你可以称一下,这样吃太多的脂肪比吃太少的脂肪更“昂贵”

现在,如梅拉莫克在评论中指出的那样,如果你为你的每一个标准创造成本,你还必须将它们综合起来权衡;为此,只需计算加权总成本。您将得到如下结果:

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

如果你想让它不可能超出预算(花费的钱),你可以添加一些术语,如
超出预算?infinity:0
使算法在预算内找到解决方案。你也可以对重复吃饭等做出限制——或多或少是你的想象力(和计算能力)设定了限制

既然你有了一个成本函数,你就可以着手解决这个问题了:最小化饮食成本。突然之间,所有那些寻找“最便宜”解决方案的算法都变得有意义了……;)



请注意,制定此成本函数通常是困难的部分。根据你如何衡量你的成本,你会发现问题的解决方案非常不同;并非所有的方法都有用(事实上,大多数方法可能不会有用)。

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