吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1164|回复: 18
收起左侧

[求助] excel問題/算法/python/求和(帶懸賞)

[复制链接]
QingYi. 发表于 2024-2-20 10:42
我還有兩個懸賞未完結(240幣,不夠可加),解決問題之後懸賞全部給你.

問題描述:現在有n行的數據,其中m列的值是數字,要湊成指定數字,例如是100,可以是99.99和0.01 也可以是99和0.5和1.4和0.1,組成的數字個數不限制,但數實際上千萬級別的,可能是幾千個數字組成幾千萬,如果有多種組合也只要一種.
例如有10行的數據的n列加和為100,只需要把那10行單獨拎出來放入一個新的excel表中.

要求:我會提供一個測試的excel表給你,只需要篩選出b列(第一個數字是70579.44)的加和為指定數字之和的python程序,或者可以在excel上面直接操作的也行,不過规划求解我試過了不行.

表中的數據可隨意更改測試,因為數據量太小程序可能找不到剛剛好等於指定數值的數據.

文件地址:https://wwk.lanpv.com/ikzCn1oskw4f

免费评分

参与人数 1吾爱币 +1 收起 理由
MakiseSatsuki + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

shaokui123 发表于 2024-2-20 11:10
凑数问题,小白可以使用现成的工具,比如方方格子之类的直接解决
shaokui123 发表于 2024-2-20 11:10
tanglikecuan 发表于 2024-2-20 11:20
要解決這個問題,我們可以使用Python的Pandas庫來處理Excel文件,並使用組合優化的方法來找到接近指定數值的組合。以下是一個基本的思路來實現這個程序:
讀取Excel文件並提取需要處理的數據。
定義一個函數來生成所有可能的組合,並計算它們的和。
遍歷所有可能的組合,找到最接近指定數值的組合。
將找到的組合對應的行數據提取出來,並保存到一個新的Excel文件中。
下面是基於上述思路的Python代碼示例:

python
import pandas as pd  
from itertools import combinations  
  
def find_combination(data, target_sum):  
    # 提取B列的數據  
    column_b = data['B']  
      
    # 初始化最接近的組合和最小值差  
    best_combination = []  
    best_diff = float('inf')  
      
    # 生成所有可能的組合  
    for r in range(1, len(column_b) + 1):  
        for comb in combinations(column_b, r):  
            current_sum = sum(comb)  
            diff = abs(current_sum - target_sum)  
              
            # 如果當前組合的和更接近目標值,則更新最佳組合  
            if diff < best_diff:  
                best_combination = list(comb)  
                best_diff = diff  
      
    return best_combination  
  
# 讀取Excel文件  
file_path = 'test_data.xlsx'  # 替換為你的Excel文件路徑  
df = pd.read_excel(file_path)  
  
# 指定目標和  
target_sum = 100  
  
# 找到最接近目標和的組合  
best_combination = find_combination(df, target_sum)  
  
# 打印結果  
print("Closest combination to target sum:", best_combination)  
  
# 將找到的組合對應的行數據保存到一個新的Excel文件中  
output_file_path = 'output_data.xlsx'  
output_df = df[df['B'].isin(best_combination)]  
output_df.to_excel(output_file_path, index=False)
注意:上述代碼是一個基本的實現,可能對於非常大的數據集來說效率較低。因為它使用了暴力搜索來生成所有可能的組合,這可能會導致時間復雜度很高。如果數據量非常大,可能需要考慮使用更高效的算法或優化方法來解決這個問題。
此外,你還可以在Excel中使用規劃求解功能來解決這個問題,但根據你的描述,你已經試過並且發現它不起作用。這可能是因為規劃求解功能在某些情況下可能無法找到解決方案,或者需要適當的設置和約束條件才能有效工作。
希望這個解答能夠帮助你解決問題!如果有任何進一步的問題或需要進一步的優化,請隨時告訴我。
gwwzzf 发表于 2024-2-20 11:28
本帖最后由 gwwzzf 于 2024-2-20 11:44 编辑

不知道你说的是不是这种,凑数求和问题。刚好我最近再研究这个,但是算法还不完善,当原始数据太大了,计算会非常卡,还在优化中。
这里没法发动图,可以去这个这里看看动图,目前插件还未更新这个函数,等待优化中。
https://www.52pojie.cn/thread-1830801-1-1.html
image.png
丨肆丨 发表于 2024-2-20 11:34
这个问题可以通过编程来解决,但是需要注意的是,这是一个NP完全问题,也就是说,当数据量非常大的时候,可能需要花费很长的时间来找到解决方案。下面是一个使用Python的解决方案:
import pandas as pd
import numpy as np
from itertools import combinations

# 读取数据
df = pd.read_excel('data.xlsx')

# 指定的数字
target = 100

# 找到所有可能的组合
for r in range(1, len(df) + 1):
    for cols in combinations(df.columns, r):
        if np.isclose(df[list(cols)].sum().sum(), target):
            # 如果找到了一个组合,将其保存到新的Excel文件中
            df[list(cols)].to_excel('result.xlsx')
            break

这个脚本会读取名为"data.xlsx"的Excel文件,然后找到所有列的可能组合,如果某个组合的和接近100(由于浮点数的精度问题,我们使用np.isclose函数来判断两个数是否接近),就将这个组合保存到新的Excel文件"result.xlsx"中。
请注意,这个脚本可能需要很长时间来运行,特别是当数据量非常大的时候。如果你的数据量非常大,可能需要使用更复杂的算法或者工具来解决这个问题。
 楼主| QingYi. 发表于 2024-2-20 12:12
shaokui123 发表于 2024-2-20 11:10
凑数问题,小白可以使用现成的工具,比如方方格子之类的直接解决

正確,裡面確實有一個求和.現在在測試中,算數很慢,卡住了.
 楼主| QingYi. 发表于 2024-2-20 12:14
gwwzzf 发表于 2024-2-20 11:28
不知道你说的是不是这种,凑数求和问题。刚好我最近再研究这个,但是算法还不完善,当原始数据太大了,计算 ...

是的 是湊數求和,當其中有n列的數據滿足某個和,把滿足的那幾行全部單獨摘錄出來.現在在用他人的工具非常之卡,感覺是暴力枚舉的.就3000多行數據
ilpj 发表于 2024-2-20 13:29
没试过,看描述好像规划求解可以,是我没有理解到吗?
sai609 发表于 2024-2-20 13:34
python随机数生成,设定加总公式,确定加总计算结果,print函数,done
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 20:01

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表