簡體   English   中英

VBA從列表中提取值,直到總和在一定范圍內

[英]VBA to extract values from a list until the sum is within a certain range

我有一個值列表,我需要從該列表中提取值,直到總和在1,200,000到1,300,000之間。 我最初將列表從最小到最大排序,然后對End(xlUp)進行排序,然后才開始從列表底部刪除值,直到總和小於1,300,000,但是我遇到的問題是我提取的最后一個數字相當大,所以總和將大大低於1,200,000。 最好的辦法是,我可以編寫som VB代碼來查看我的列表,提取值直到總和小於1,300,000,然后僅提取下一個等於或小於100,000的值...如果下一個值為大於100,000的就跳過並查看下一個。

這是我正在使用的數字的當前列表:

236,800
13,300
7,100
2,500
5,600
5,900
11,700
33,100
172,200
17,400
43,900
1,200
2,100
1,900
500
600
3,700
23,300
53,300
32,900
10,100
3,300
400
500
11,500
7,700
3,700
1,700
700
6,300
26,400
22,700
12,400
5,500
700
500
1,000
500
25,200
700
900
41,400
328,700
900
1,800
329,100
6,100
47,700
500
5,100
11,900
300
12,800
0
200
31,100
900
500
2,500
8,500
5,600

謝謝!

您正在處理子集總和問題的變體。 幾乎可以肯定,這是NP Complete,所以您不能期待一個簡單的解決方案。 如果數字列表較小,則可以通過求解器作為整數編程問題來解決(使用與包含該列表的列相鄰的列中的約束為0-1的變量,形成對應的sumproduct,約束其值介於1,200,000和1,300,000之間,並將第一個決策變量用作虛擬目標函數)。 如果列表太大,則內置求解器無法處理那么多的二進制變量-但是您總是可以從Front Line Systems(Solver外接程序的制造商)那里獲得高級版本。 如果您包括對規划求解加載項的引用,則可以從VBA中完成所有這些操作。

另外,您可以使用啟發式方法。 具有0和1的向量,這些向量確定要選擇的元素。 用相應的總和滿足約束的接近程度對這種向量評分。 將0更改為1或反之亦然,則總和更接近或遠離滿足約束。 從隨機向量開始。 如果有這樣的改變有幫助-盡最大努力進行這樣的改變。 進行此類更改,直到沒有進一步的更改幫助為止。 這是局部最優。 如果滿足約束-完成。 如果沒有,請重新開始。 如果這種方法(使用隨機開始的迭代爬坡方法)不起作用,則可以研究一種進化算法。 您可以自己編寫代碼,也可以查看進化優化的Solver版本是否有幫助(我在求解器的那部分沒有很多經驗,也不知道它對問題大小或問題形成有什么樣的約束)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM