【问题标题】:Subset sum improvement子集和改进
【发布时间】:2018-09-06 16:40:18
【问题描述】:

短版:

有没有办法使用 numpy(在 python 中)从两个区间之间的浮点数组计算所有和组合的可能性?

完整(长)版本:

在 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 中启动我的 python 程序(在 Linux Mint 上),执行命令是“python”%f”,有没有一种简单的方法可以在多个内核上午餐以更快地运行?(没有调整程序的多核-线程?)

PS4:不能以“Hi”或“Hello”开始提问吗?我都试过了,但每次都消失了。

【问题讨论】:

  • 这太宽泛了。你问的具体是什么?
  • 抱歉:/ 很短:有没有办法用 numpy(在 python 中)从两个区间之间的浮点数组中计算所有总和组合的可能性?

标签: python-2.7 numpy sum subset


【解决方案1】:

基于other stackoverflow question,我找到了另一个解决方案,但仍然不是一个好的解决方案:

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. 结果未排序

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    相关资源
    最近更新 更多