use*_*515 2 algorithm optimization combinations
我在解决一个看似简单的问题时遇到了麻烦.我的女朋友和我正在努力制定每周的膳食计划,我有这个绝妙的想法,我可以优化我们购买的东西,以便最大化我们可以用它做的事情.问题是,问题并不像看起来那么容易.简而言之,这是问题陈述:
问题:给出100种成分的清单以及由100种成分中的一种或多种组成的50种菜肴的清单,找到可以产生最大数量的菜肴的32种成分的列表.
这个问题看似简单,但我发现计算答案并非易事.我采用的方法是,我计算了32种成分的组合,作为100位字符串,其中32位设置.然后我检查一下这些配料编号可以制作什么菜.如果菜肴数量大于当前最大值,我将保存清单.然后我计算下一个有效成分组合并重复,重复和重复.
32种成分的组合数量惊人!我看到它的方式,用我的方法计算需要大约300万亿年.我已经优化了代码,因此每个组合只花了75微秒才能搞清楚.假设我可以优化代码,我可以将运行时间缩短到仅仅几万亿年.
我认为一种全新的方法是有序的.我目前正在XOJO(REALbasic)中对此进行编码,但我认为真正的问题在于方法而不是具体实现.有人想知道本世纪有可能完成的方法吗?
谢谢,
罗恩
mcdowella的分支和绑定解决方案将比详尽的枚举有很大的改进,但它可能仍需要几千年.这是ILP解算器最好解决的问题.
假设用餐i的成分组由R [i] = {R [i] [1],R [i] [2],...,R [i] [| R [i] |]给出.你可以按如下方式编码问题:
解决这个问题将产生所有变量的赋值x [i]:1表示应该包含成分,0表示不应该包含.
我的感觉是像CPLEX或Gurobi这样的商业ILP求解器可能会在几毫秒内解决这个150变量的ILP问题.像甚至免费提供的求解器lp_solve,这通常是多慢,应该没有问题.在不太可能的情况下,它似乎永远需要,你仍然可以解决LP放松,这将非常快(毫秒),并将给你(a)可以准备的最大膳食数量的上限( b)变量值中的"提示":虽然x [i]通常不会精确地为0或1,但是接近1的值表示应包括的成分,而接近0的值表示无用的成分.