子集总和改善

时间:2018-09-06 16:40:19

标签: python-2.7 numpy sum subset

短版本:

是否有numpy(在python中)从两个间隔之间的float数组计算所有求和组合可能性的方法?

完整(长版):

借助Reddit的多个线程,我执行了此子集和程序以查找更接近的权重组合值。 (结果必须更高,但要尽可能接近,我需要查看所有组合)

def subset(array, num, epsilon):
result = []
def find(arr, num, path=()):
    if not arr:
        return
    if (arr[0] >= num and arr[0] <= num + epsilon):
        result.append(path + (arr[0],))
    else:
        find(arr[1:], num - arr[0], path + (arr[0],))
        find(arr[1:], num, path)
find(array, num)
return result

def sumColumn(matrix):
    return numpy.sum(matrix, axis=1)  # axis=1 says "get the sum along the columns"


target = 7.00
suppaumaxde = 0.30

#data = [  1.98, 1.93, 1.64,  2.06, 2.18, 2.12, 3.20, 1.29, 2*0.65, 1.84*2, 1.85*2]
#, 1.58*3, 1.46*3, (1.48*3+0.22), 1.12*4, 1.85*2, 2*1.84, 2*1.84, 1.18*3, 2.38+0.02, 0.65*5,

data = [  1.13, 2.26, 3.93, 2.40-0.02, 2.38, 2.27, 1.98, 1.93, 1.64,  2.06, 2.18, 2.12, 3.20, 1.29, 2*0.65, 1.84*2,
 1.85*2, 1.58*3, 1.46*3, (1.48*3+0.22), 1.12*4, 1.85*2, 2*1.84, 1.18*3, 2.38+0.02, 0.65*5,
 3.23, 1.60, 0.58, 4.01, 1.09*3]

print data
Resultat=subset(data, target, suppaumaxde)
#print subset(data, target, suppaumaxde)
#print(' '.join(map(str, Resultat)))
#print([sum(row) for row in Resultat])
couleur='\33[37m'
print('\n')
for colonne in Resultat:
    if (sum(colonne)<=target+(suppaumaxde*1/3)):couleur='\33[42m'
    elif (sum(colonne)<=target+(suppaumaxde*2/3)):couleur='\33[43m'
    elif (sum(colonne)<=target+(suppaumaxde*3/3)):couleur='\033[91m'
    print couleur,sum(colonne),'\033[0m',(colonne)


data.sort(reverse=True)
print('\n')
print data
Resultat=subset(data, target, suppaumaxde)
#print(' '.join(map(str, Resultat)))
print('\n')
for colonne in Resultat:
    if (sum(colonne)<=target+(suppaumaxde*1/3)):couleur='\33[42m'
    elif (sum(colonne)<=target+(suppaumaxde*2/3)):couleur='\33[43m'
    elif (sum(colonne)<=target+(suppaumaxde*3/3)):couleur='\033[91m'
    print couleur,sum(colonne),'\033[0m',(colonne)


data.sort()
print('\n')
print data
Resultat=subset(data, target, suppaumaxde)
#print(' '.join(map(str, Resultat)))
print('\n')
for colonne in Resultat:
    if (sum(colonne)<=target+(suppaumaxde*1/3)):couleur='\33[42m'
    elif (sum(colonne)<=target+(suppaumaxde*2/3)):couleur='\33[43m'
    elif (sum(colonne)<=target+(suppaumaxde*3/3)):couleur='\033[91m'
    print couleur,sum(colonne),'\033[0m',(colonne)

它开始起作用,但我必须改进:

  1. 如果我对数组的排序不同,则会得到不同的结果。因此,我认为缺少某些结果。 (这就是为什么我不做任何功能就重复显示代码3次以显示这一点。但是我想删除最后两个)
  2. 由于我在数组中添加了更多输入,因此执行时间变长。也许这没有经过优化,并且执行了太多操作。也许在比较之前就进行订购,一旦达到极限值就传递到下一项?
  3. 理想情况下,我喜欢对结果进行排序,但又不增加执行时间。
  4. 某些结果多次出现(第二点,我认为缺少优化)

我只是开始使用python,所以我不了解整个程序,如果您愿意,我很乐意根据您的建议进行改进:)

我今天早上也在Reddit上发布了此内容,Laserdude10642谈论numpy, 因此,在启动RTFM之后,提高效率似乎是一个不错的选择,我通过查找其他示例进行了一些尝试:

import numpy as np

def find_nearest(array, value):
array = np.asarray(array)
idx = (np.abs(array - value)).argmin()
return array[idx]


montab = [  2.95, 2.26, 3.93, 2.38*2, 1.98, 1.93, 1.64, 0.53, 1.20, 2.06, 2.18, 2.12, 3.20, 1.29, 1.20, 2*0.65, 1.84*2,
 1.85*2, 1.58*3, 1.46*3, (1.48*3+0.22), 1.12*4, 1.18*3, 2.38+0.02, 0.65*5,
 3.23, 1.60, 0.58, 4.01, 1.09*3, 0.60]

cible= 7

print(find_nearest(montab, cible))

但是我需要显示不对称间隔中的所有结果

用numpy是否有办法计算两个时间间隔之间所有可能的总和组合?

PS1:对不起,我的英语不好:/

PS2:理想情况下,我希望代码保持更容易理解,因此以后修改起来更容易

PS3:我在Geany(在Linux Mint上)中启动我的python程序,执行命令是“ python”%f“,是否有一种简单的方法可以在多个内核上使它吃得更快呢? -线程?)

PS4:无法通过“嗨”或“你好”开始提问吗?我都尝试过,但每次都消失了。

1 个答案:

答案 0 :(得分:0)

基于此#n#,我找到了其他解决方案,但仍然不是一个好的解决方案:

from numpy import *
from itertools import *

montab = [  2.95, 2.26, 3.93, 2.38*2, 1.98, 1.93, 1.64, 0.53, 1.20, 2.06, 2.18, 2.12, 3.20, 1.29, 1.20, 2*0.65, 1.84*2,
 1.85*2, 1.58*3, 1.46*3, (1.48*3+0.22), 1.12*4, 1.18*3, 2.38+0.02, 0.65*5,
 3.23, 1.60, 0.58, 4.01, 1.09*3, 0.60, 0, 0]

target=7
suppaumaxde = 0.35


print montab
montab.sort(reverse=True)
print montab
couleur='\33[37m'
print('\n')
for colonne in combinations(montab,4):
    if (sum(colonne)>=target and sum(colonne)<=target+suppaumaxde):
        if (sum(colonne)<=target+(suppaumaxde*1/3)):couleur='\33[42m'
        elif (sum(colonne)<=target+(suppaumaxde*2/3)):couleur='\33[43m'
        elif (sum(colonne)<=target+(suppaumaxde*3/3)):couleur='\033[91m'
        print couleur,sum(colonne),'\033[0m',(colonne)

但是结果不好,需要改进/找到其他解决方案:

  1. 我必须设置一些项目并在数据数组中添加零
  2. 所有组合都经过测试,时间太长了
  3. 结果未排序