VBA从列表中提取值,直到总和在某个范围内

时间:2015-07-06 14:24:21

标签: list excel-vba vba excel

我有一个值列表,我需要从此列表中提取值,直到总和在1,200,000和1,300,000之间。我最初将列表从最小值排序到最大值然后执行End(xlUp)并且刚开始从列表底部删除值,直到总和小于1,300,000,但问题是我提取的最后一个数字是相当大的所以总和将大大低于1,200,000。什么是最好的是如果我可以编写将查看我的列表的som VB代码,拉取值直到总和小于1,300,000然后只会拉下一个值,如果它是100,000或更少...如果下一个值是超过100,000只是跳过并查看下一个。

这是我正在使用的当前数字列表:

from Tkinter import *
import ttk

root = Tk()

def load_dropdown():
    parent = Tk()
    myvalue = StringVar()

    user_entry1 = ttk.Combobox(parent, values=['value 1', 'value2'], textvariable=myvalue)
    user_entry1.pack()
    myvalue.set('default value')
    print myvalue.get()
    parent.mainloop()

b = Button(root, text="Generate Dropdown ", command=load_dropdown)
b.pack()
root.mainloop()

谢谢!

1 个答案:

答案 0 :(得分:0)

您正在处理子集求和问题的变体。这几乎可以肯定是NP Complete,所以你不能指望一个简单的解决方案。如果数字列表很小,则可以通过求解器将其解决为整数规划问题(使用与包含列表的列相邻的列中约束为0-1的变量,形成相应的sumproduct,约束其值在1,200,000和1,300,000之间,并使用第一个决策变量作为虚拟目标函数)。如果列表太大,内置解算器无法处理那么多二进制变量 - 但您总是可以从Front Line Systems(Solver加载项的制造商)获得高级版本。如果您包含对Solver加载项的引用,则所有这些都可以在VBA中完成。

或者,您可以使用启发式方法。有一个0和1的向量,它们决定了要选择的元素。通过相应的总和如何接近满足约束来对这样的矢量进行评分。将0改为1或反之亦然使得和更接近或更远离满足约束。从随机向量开始。如果任何这样的改变有帮助 - 做出最好的改变。做出这样的改变,直到没有进一步的改变有帮这是当地的最佳选择。如果它满足约束 - 完成。如果没有,请重新开始。如果这个(随机启动的迭代爬山)不起作用,你可以研究一个进化算法。您可以自己编写代码,或者查看解算器版本的进化优化是否有帮助(我不会对求解器的那部分有很多经验,也不知道它对问题大小有什么样的约束或者问题形成)。