合并2个数组,使结果总和尽可能接近

问题描述

我希望有人可以帮助我解决这个问题或为我指明正确的方向。我想做的是,当仅从数组2中获取1个值并将它们加在一起时,使数组1中的所有值尽可能彼此相等。数组1比数组2短得多。下面将举一个示例,说明我使用的一些实数。


例如:

array1 = [458.6,458.5,458.4,457.1,455]array2=[5.6,5.6,5.7,5.8,5.9,6,6.1,6.2,6.2]

如果我将array1[0]array2[0]加在一起等于464.2。

如果我继续通过array1array2进行操作,则结果数组将为[464.2,464.1,462.9,460.9]

您可以看到数组中的前3个数字彼此非常接近,仅相差0.1,而后几个相差更多。


如果它知道使用'array2'末尾的数字,那么结果数组中的最后两个值将更接近前三个值。

这是我陷入困境的地方,不确定如何继续。我知道这很困难,因为每次运行代码时,值都可能不同,并且没有要查找的设置值。它只是开始以一种模式出现。

感谢您的宝贵时间,非常感谢您提供的帮助。

解决方法

我的第一个想法是贪婪算法,但是对于某些随机优化算法(例如遗传算法,进化策略或简单的爬坡。这是Python中的非常简单示例:

import random

def score(a1,a2):
    # sum of squared error from average
    a3 = [a+b for a,b in zip(a1,a2)]
    s = sum(a3)/len(a3)
    return sum(abs(s - x)**2 for x in a3)

def opt(a1,a2):
    cur = list(a2)
    for i in range(1000):
        new = list(cur)
        # random mutation
        a,b = random.randrange(len(cur)),random.randrange(len(cur))
        new[a],new[b] = new[b],new[a]
        # better than current -> keep
        if score(a1,new) < score(a1,cur):
            cur = new
    return cur[:len(a1)]

在这里,cur是当前的解决方案,它只是array2中的元素(包括不需要的元素)的排列,这些元素被随机交换,如果“得分”,结果将保留更好。

对于您的样本数据,这将始终产生此结果,虽然看起来不太好,但实际上似乎与它获得的结果差不多。

result: [5.6,5.6,5.7,6.2,6.2]
sums:   [464.2 464.1,464.1 463.3,461.2]

如果这似乎可行,则可以进一步改进算法,例如保留一个以上的父母身份,或每个世代创造更多的后代,确保交换中至少有一个元素确实相关,缓存当前的最佳分数,或连续允许多个变异。