mylist = r"C:path\of\the\file.csv"
import pandas as pd
df = pd.read_csv(mylist)
def subset_sum(numbers, target, partial=[]):
s = sum(partial)
# check if the partial sum is equals to target
if s == target:
print ("sum(%s)=%s" % (partial, target))
for i in range(len(numbers)):
n = numbers[i]
remaining = numbers[i+1:]
subset_sum(remaining, target, partial + [n])
if _name_ == "_main_":
subset_sum(#List,#target)
min |deviation|
subject to sum(i, value[i]*x[i]) = target + deviation
x[i] ∈ {0,1}
一些代码来测试这个:
import cvxpy as cp
import random
#
# problem size
#
N = 40000
I = range(N)
#
# problem data
#
target = 100000
random.seed(12345)
p = [random.randrange(0,10000) for i in I]
#
# model
#
x = cp.Variable(N,boolean=True)
deviation = cp.Variable(1)
prob = cp.Problem(cp.Minimize(cp.abs(deviation)),[p@x==target+deviation])
#
# solve and reporting
#
prob.solve(solver=cp.CBC,verbose=True)
xsum = 0
for i in I:
if x[i].value > 0.5:
print(f"i:{i} value:{p[i]}")
xsum += p[i]
print(f"sum={xsum}")
结果:
-------------------------------------------------------------------------------
Summary
-------------------------------------------------------------------------------
(CVXPY) Dec 23 12:35:28 PM: Problem status: optimal
(CVXPY) Dec 23 12:35:28 PM: Optimal value: 1.438e-11
(CVXPY) Dec 23 12:35:28 PM: Compilation took 9.899e-02 seconds
(CVXPY) Dec 23 12:35:28 PM: Solver (including time spent in interface) took 1.156e+00 seconds
i:6 value:9273
i:9 value:6112
i:11 value:7093
i:13 value:9209
i:15 value:9063
i:3857 value:9209
i:9341 value:2035
i:12413 value:9209
i:15914 value:2035
i:15989 value:2126
i:16558 value:2035
i:16965 value:2035
i:24271 value:63
i:24290 value:7093
i:26791 value:624
i:30330 value:6752
i:32612 value:6752
i:34308 value:219
i:36798 value:9063
sum=100000
2条答案
按热度按时间mzmfm0qo1#
我是手动完成的,因为数字量太大了,但是在Python 3中,对于少量数字的答案是:
flseospp2#
这可以作为MIP(混合整数规划)问题来解决:
一些代码来测试这个:
结果: