r - 3组列表中最佳总和组合的算法
问题描述
我有多组数据,例如:
X <- c(2,3,5,10,15)
Y <- c(4,6,23,15,12)
Z <- c(23,34,12,1,5)
和一个目标:target = 50
我想知道最好的(例如):来自 X 的 2 个值(称为 X2),来自 Y(Y4)的 4 个值和来自 Z(Z3)的 3 个值,如果我将它们相加,我会得到sum(X2) + sum(Y4) + sum(Z3) = 50
(或最接近 50) .
这个问题有解决方案吗?
编辑:我提供的数据只是一个例子……我的最终目标是在大数据上重现它。
这是我的大数据:
target <- 362007
X <- c(1782L, 1780L, 1783L, 1784L, 1783L, 1781L, 1782L, 1781L, 1782L,
1782L, 1782L, 1784L, 1780L, 1784L, 1782L, 1779L, 1782L, 1784L,
1783L, 1782L, 1781L, 1777L, 1784L, 1782L, 1784L, 1784L, 1784L,
1782L, 1784L, 1782L, 1783L, 1783L, 1785L, 1782L, 1781L, 1782L,
1788L, 1789L, 1786L, 1787L, 1786L, 1783L, 1781L, 1781L, 1786L,
1787L, 1786L, 1786L, 1785L, 1785L, 1784L, 1786L, 1785L, 1784L,
1786L, 1785L, 1785L, 1783L, 1787L, 1787L, 1786L, 1785L, 1788L,
1786L, 1788L, 1786L, 1780L, 1788L, 1785L, 1784L, 1786L, 1784L,
1785L, 1783L, 1785L, 1785L, 1785L, 1786L, 1784L, 1784L, 1785L,
1784L, 1785L, 1787L, 1786L, 1788L, 1785L, 1785L, 1780L, 1787L,
1784L, 1785L, 1787L, 1784L, 1780L, 1785L, 1782L, 1787L, 1786L,
1781L, 1780L, 1784L, 1785L, 1785L, 1785L, 1785L, 1785L, 1782L,
1783L, 1787L, 1784L, 1783L, 1783L, 1782L, 1785L, 1783L, 1783L,
1782L, 1786L, 1783L, 1786L, 1782L, 1783L, 1786L, 1784L, 1782L,
1782L, 1785L, 1785L, 1783L, 1782L, 1781L, 1782L, 1779L, 1781L,
1781L, 1785L, 1780L, 1782L, 1781L, 1782L, 1786L, 1786L, 1787L,
1781L, 1780L, 1788L, 1781L, 1781L, 1780L, 1787L, 1787L, 1787L,
1780L, 1786L, 1786L, 1779L, 1785L, 1792L, 1788L, 1781L, 1784L,
1780L, 1784L, 1783L, 1785L, 1783L, 1783L, 1781L, 1783L, 1785L,
1783L, 1785L, 1782L, 1785L, 1782L, 1782L, 1782L, 1779L, 1787L,
1784L, 1783L, 1783L, 1786L, 1785L, 1787L, 1785L, 1783L, 1783L,
1786L, 1784L, 1778L, 1787L, 1786L, 1784L, 1784L, 1781L, 1779L,
1782L, 1786L, 1781L, 1787L, 1783L, 1781L, 1781L, 1786L, 1787L,
1780L, 1779L, 1785L, 1784L, 1781L, 1783L, 1782L, 1781L, 1781L,
1787L, 1785L, 1787L, 1784L, 1784L, 1783L, 1782L, 1785L, 1785L,
1783L, 1779L, 1786L, 1780L, 1778L, 1783L, 1785L, 1780L, 1786L,
1784L, 1779L, 1779L, 1779L, 1785L, 1780L, 1786L, 1778L, 1782L,
1779L, 1779L, 1784L, 1780L, 1780L, 1785L, 1781L, 1778L, 1787L,
1781L, 1786L, 1783L, 1784L, 1785L, 1786L, 1784L, 1782L, 1784L,
1785L, 1786L, 1786L, 1785L, 1782L, 1786L, 1783L, 1783L, 1788L,
1779L, 1786L, 1787L, 1781L, 1780L, 1780L, 1782L, 1784L, 1787L,
1780L, 1786L, 1786L, 1786L, 1784L, 1787L, 1785L, 1784L, 1784L,
1784L, 1781L, 1784L, 1784L, 1786L, 1784L, 1783L, 1784L, 1786L,
1787L, 1786L, 1786L, 1785L, 1786L, 1785L, 1785L)
Y <- c(1786L, 1786L, 1786L, 1786L, 1787L, 1784L, 1782L, 1787L, 1786L,
1786L, 1781L, 1787L, 1782L, 1785L, 1785L, 1786L, 1783L, 1781L,
1787L, 1780L, 1785L, 1783L, 1787L, 1785L, 1786L, 1789L, 1784L,
1785L, 1782L, 1780L, 1783L, 1786L, 1784L, 1782L, 1781L, 1788L,
1785L, 1779L, 1782L, 1781L, 1781L, 1785L, 1781L, 1786L, 1784L,
1782L, 1783L, 1782L, 1783L, 1784L, 1786L, 1780L, 1784L, 1782L,
1779L, 1783L, 1789L, 1783L, 1782L, 1786L, 1784L, 1783L, 1788L,
1786L, 1788L, 1783L, 1785L, 1787L, 1787L, 1784L, 1784L, 1787L,
1783L, 1782L, 1787L, 1788L, 1786L, 1786L, 1785L, 1787L, 1782L,
1787L, 1782L, 1787L, 1783L, 1787L, 1783L, 1784L, 1782L, 1782L,
1784L, 1784L, 1786L, 1782L, 1780L, 1786L, 1783L, 1787L, 1785L,
1786L, 1783L, 1783L, 1780L, 1781L, 1782L, 1788L, 1782L, 1783L,
1785L, 1785L, 1783L, 1786L, 1785L, 1786L, 1780L, 1782L, 1785L,
1784L, 1787L, 1779L, 1783L, 1782L, 1785L, 1780L, 1780L, 1786L,
1782L, 1785L, 1785L, 1779L, 1783L, 1786L, 1787L, 1789L, 1782L,
1781L, 1783L, 1780L, 1784L, 1783L, 1784L, 1784L, 1785L, 1785L,
1786L, 1782L, 1782L, 1781L, 1783L, 1787L, 1784L, 1785L, 1782L,
1781L, 1786L, 1784L, 1783L, 1784L, 1786L, 1784L, 1781L, 1783L,
1786L, 1784L, 1782L, 1782L, 1786L, 1783L, 1782L, 1784L, 1786L,
1784L, 1786L, 1783L, 1788L, 1782L, 1782L, 1787L, 1780L, 1781L,
1782L, 1787L, 1785L, 1781L, 1781L, 1783L, 1787L, 1785L, 1786L,
1783L, 1786L, 1780L, 1785L, 1786L, 1786L, 1781L, 1786L, 1786L,
1787L, 1786L, 1783L, 1789L, 1785L, 1782L, 1789L, 1788L, 1784L,
1782L, 1783L, 1781L, 1784L, 1783L, 1783L, 1787L, 1784L, 1783L,
1781L, 1783L, 1787L, 1783L, 1786L, 1791L, 1782L, 1788L, 1786L,
1785L, 1782L, 1787L, 1782L, 1784L, 1782L, 1782L, 1781L, 1782L,
1784L, 1783L, 1783L, 1784L, 1780L, 1787L, 1783L, 1785L, 1782L,
1786L, 1782L, 1787L, 1785L, 1782L, 1785L, 1784L, 1786L, 1783L,
1781L, 1782L, 1781L, 1785L, 1782L, 1783L, 1784L, 1782L, 1782L,
1784L, 1783L, 1787L, 1786L, 1786L, 1781L, 1782L, 1785L, 1787L,
1784L, 1782L, 1788L, 1782L, 1783L, 1783L, 1785L, 1781L, 1780L,
1786L, 1785L, 1780L, 1781L, 1782L, 1787L, 1784L, 1780L, 1782L,
1781L, 1781L, 1780L, 1784L, 1782L, 1792L, 1787L, 1782L, 1779L,
1784L, 1785L, 1786L, 1782L, 1786L, 1785L, 1785L, 1784L, 1785L,
1783L, 1786L, 1785L, 1783L, 1782L, 1784L, 1781L, 1782L, 1784L,
1786L, 1783L, 1783L, 1781L, 1785L, 1779L, 1783L, 1781L, 1781L,
1786L, 1783L, 1781L, 1787L, 1782L, 1787L, 1786L, 1645L, 1788L,
1783L, 1786L, 1787L, 1783L, 1780L, 1781L, 1782L, 1782L, 1786L,
1781L, 1785L, 1783L, 1784L, 1783L, 1784L, 1784L, 1781L, 1787L,
1781L, 1785L, 1782L, 1784L, 1790L, 1795L, 1793L, 1780L, 1782L,
1788L, 1787L, 1788L, 1781L, 1781L, 1788L, 1782L, 1783L, 1780L,
1785L, 1784L, 1781L, 1786L, 1781L, 1787L, 1794L, 1792L, 1791L,
1781L, 1779L, 1781L, 1781L, 1782L, 1784L, 1783L, 1785L, 1785L,
1785L, 1781L, 1778L, 1782L, 1784L, 1786L, 1786L, 1784L, 1782L,
1779L, 1781L, 1782L, 1785L, 1783L, 1782L, 1784L, 1779L, 1785L,
1784L, 1787L, 1785L, 1786L, 1789L, 1788L, 1785L, 1785L, 1785L,
1783L, 1784L, 1786L, 1784L, 1782L, 1779L, 1782L, 1787L, 1788L,
1782L, 1786L, 1784L, 1783L, 1782L, 1785L, 1785L, 1786L, 1786L,
1786L, 1785L, 1785L, 1789L, 1786L, 1781L, 1785L, 1784L, 1787L,
1781L, 1788L, 1783L, 1786L, 1786L, 1786L, 1783L, 1788L, 1788L,
1781L, 1787L, 1791L, 1784L, 1784L, 1785L, 1784L, 1784L, 1782L,
1779L, 1777L, 1780L, 1783L, 1782L, 1780L, 1781L, 1785L, 1780L,
1783L, 1786L, 1784L, 1779L, 1785L, 1784L, 1783L, 1783L, 1783L,
1783L, 1785L, 1781L, 1778L, 1781L, 1785L, 1781L, 1782L, 1788L,
1782L, 1783L, 1781L, 1786L, 1781L, 1784L, 1782L, 1783L, 1787L,
1783L, 1786L, 1783L, 1780L, 1781L, 1779L, 1781L, 1784L, 1785L,
1782L, 1785L, 1785L, 1783L, 1781L, 1780L, 1780L, 1781L, 1779L,
1780L, 1783L, 1782L, 1786L, 1780L, 1785L, 1786L, 1781L, 1783L,
1783L, 1788L, 1783L, 1786L, 1788L, 1786L, 1783L, 1784L, 1788L,
1787L, 1785L, 1785L, 1784L, 1782L, 1785L, 1785L, 1784L, 1781L,
1788L, 1785L, 1785L, 1786L, 1785L, 1786L, 1787L, 1781L, 1787L,
1782L, 1781L, 1786L, 1781L, 1783L, 1782L, 1786L, 1786L, 1788L,
1781L, 1781L, 1783L, 1784L, 1783L, 1781L, 1788L, 1785L, 1779L,
1786L, 1781L, 1781L, 1787L, 1784L, 1788L, 1782L, 1786L, 1787L,
1780L, 1785L, 1788L, 1783L, 1783L, 1785L, 1780L, 1780L, 1788L,
1784L, 1782L, 1787L, 1782L, 1783L, 1782L, 1782L, 1786L, 1784L,
1788L, 1783L, 1785L, 1786L, 1781L, 1784L, 1782L, 1792L, 1784L,
1782L, 1780L, 1784L, 1782L, 1783L, 1785L, 1783L, 1787L, 1785L,
1785L, 1781L, 1787L, 1785L, 1787L, 1783L, 1780L, 1780L, 1785L,
1783L, 1786L, 1784L, 1783L, 1782L, 1782L, 1789L, 1783L, 1786L,
1785L, 1783L, 1787L, 1788L, 1783L, 1783L, 1786L, 1783L, 1786L,
1782L, 1787L, 1782L, 1784L, 1782L, 1786L, 1787L, 1788L, 1788L,
1782L, 1786L, 1780L, 1785L, 1779L, 1779L, 1779L, 1779L, 1779L,
1783L, 1783L, 1782L, 1786L, 1785L, 1783L, 1781L, 1780L, 1784L,
1779L, 1785L, 1780L, 1779L, 1780L, 1779L, 1780L, 1782L, 1783L,
1781L, 1785L, 1783L, 1786L, 1779L, 1781L, 1781L, 1781L, 1780L,
1781L, 1780L, 1780L, 1780L, 1780L, 1781L, 1781L, 1781L, 1781L,
1781L, 1781L, 1780L, 1780L, 1781L, 1786L, 1780L, 1781L, 1780L,
1780L, 1795L, 1790L, 1793L, 1786L, 1784L, 1782L, 1784L, 1783L,
1788L, 1787L, 1786L, 1778L, 1783L, 1786L, 1784L, 1783L, 1785L,
1786L, 1780L, 1786L, 1786L, 1785L, 1782L, 1782L, 1786L, 1784L,
1787L, 1789L, 1788L, 1782L, 1783L, 1787L, 1783L, 1786L, 1782L,
1782L, 1786L, 1783L, 1785L, 1788L, 1788L, 1787L, 1783L, 1788L,
1783L, 1782L, 1782L, 1786L, 1789L, 1784L, 1785L, 1780L, 1781L,
1786L, 1786L, 1788L, 1785L, 1781L, 1786L, 1785L, 1782L, 1780L,
1784L, 1781L, 1779L, 1785L, 1786L, 1779L, 1782L, 1783L, 1783L,
1780L, 1783L, 1782L, 1786L, 1779L, 1780L, 1781L, 1786L, 1783L,
1785L, 1786L, 1782L, 1787L, 1784L, 1786L, 1786L, 1785L, 1786L,
1785L, 1784L, 1787L, 1784L, 1784L, 1788L, 1785L, 1784L, 1782L,
1783L, 1785L, 1782L, 1787L, 1781L, 1782L, 1785L, 1782L, 1786L,
1785L, 1787L, 1787L, 1786L, 1787L, 1780L, 1785L, 1784L, 1783L,
1782L, 1787L, 1779L, 1779L, 1786L, 1780L, 1787L, 1781L, 1778L,
1782L, 1779L, 1778L, 1780L, 1786L, 1779L, 1785L, 1784L, 1779L,
1784L, 1781L, 1784L, 1782L, 1785L, 1783L, 1781L, 1786L, 1780L,
1781L, 1780L, 1781L, 1784L, 1787L, 1779L, 1786L, 1781L, 1782L,
1780L, 1782L, 1786L, 1786L, 1787L, 1782L, 1788L, 1783L, 1785L,
1788L, 1785L, 1786L, 1787L, 1787L, 1785L, 1784L, 1784L, 1787L,
1788L, 1787L, 1782L, 1786L, 1784L, 1783L, 1786L, 1782L, 1782L,
1789L, 1784L, 1783L, 1793L, 1794L, 1793L, 1787L, 1783L, 1782L,
1786L, 1784L, 1787L, 1783L, 1783L, 1786L, 1789L, 1781L, 1785L,
1784L, 1788L, 1789L, 1782L, 1784L, 1784L, 1787L, 1787L, 1783L,
1784L, 1784L, 1783L, 1786L, 1783L, 1785L, 1788L, 1787L, 1788L,
1783L, 1784L, 1783L, 1783L, 1781L, 1784L, 1786L, 1782L, 1791L,
1787L, 1781L, 1787L, 1785L, 1787L, 1783L, 1785L, 1782L, 1784L,
1787L, 1784L, 1783L, 1783L, 1783L, 1784L, 1786L, 1787L, 1782L,
1789L, 1782L, 1782L, 1783L, 1782L, 1783L, 1783L, 1784L, 1783L,
1788L, 1786L, 1782L, 1784L, 1781L, 1786L, 1782L, 1779L, 1780L,
1783L, 1780L, 1786L, 1780L, 1786L, 1784L, 1784L, 1785L, 1777L,
1783L, 1780L, 1784L, 1783L, 1780L, 1784L, 1781L, 1785L, 1785L,
1781L, 1780L, 1786L, 1788L, 1787L, 1791L, 1789L, 1787L, 1787L,
1793L, 1781L, 1784L, 1781L, 1784L, 1779L, 1784L, 1784L, 1784L,
1780L, 1780L, 1784L, 1787L, 1782L, 1781L, 1784L, 1787L, 1785L,
1781L, 1785L, 1783L, 1782L, 1782L, 1785L, 1781L, 1782L, 1786L,
1788L, 1780L, 1787L, 1784L, 1788L, 1787L, 1784L, 1784L, 1785L,
1780L, 1786L, 1780L, 1780L, 1788L, 1782L, 1793L, 1783L, 1785L,
1785L, 1781L, 1783L, 1783L, 1787L, 1783L, 1784L, 1784L, 1783L,
1785L, 1787L, 1788L, 1784L, 1787L, 1787L, 1785L, 1786L, 1784L,
1786L, 1784L, 1786L, 1787L)
Z <- c(1788L, 1792L, 1787L, 1791L, 1790L, 1789L, 1791L, 1788L, 1792L,
1794L, 1793L, 1791L, 1792L, 1787L, 1792L, 1792L, 1791L, 1788L,
1792L, 1794L, 1791L, 1788L, 1794L, 1794L, 1789L, 1792L, 1788L,
1793L, 1792L, 1788L, 1786L, 1787L, 1791L, 1786L, 1788L, 1792L,
1787L, 1785L, 1786L, 1790L, 1788L, 1790L, 1792L, 1788L, 1787L,
1790L, 1786L, 1792L, 1789L, 1787L, 1786L, 1787L, 1793L, 1793L,
1792L, 1789L, 1786L, 1795L, 1793L, 1788L, 1791L, 1790L, 1792L,
1790L, 1794L, 1792L, 1789L, 1791L, 1794L, 1788L, 1788L, 1794L,
1794L, 1792L, 1790L, 1789L, 1788L, 1788L, 1789L, 1789L, 1794L,
1790L, 1787L, 1791L, 1789L, 1791L, 1790L, 1783L, 1782L, 1781L,
1781L, 1793L, 1788L, 1795L, 1793L, 1789L, 1791L, 1793L, 1792L,
1792L, 1784L, 1781L, 1782L, 1795L, 1788L, 1789L, 1793L, 1793L,
1792L, 1791L, 1791L, 1790L, 1794L, 1792L, 1796L, 1793L, 1791L,
1793L, 1790L, 1794L, 1795L, 1788L, 1789L, 1790L, 1790L, 1793L,
1790L, 1795L, 1793L, 1792L, 1778L, 1784L, 1782L, 1791L, 1793L,
1791L, 1794L, 1793L, 1793L, 1790L, 1792L, 1788L, 1786L, 1790L,
1794L, 1794L, 1791L, 1787L, 1792L, 1790L, 1791L, 1799L, 1790L,
1788L, 1795L, 1791L, 1792L, 1787L, 1788L, 1792L, 1795L, 1786L,
1785L, 1778L, 1794L, 1790L, 1794L, 1792L, 1793L, 1793L, 1793L,
1792L, 1791L, 1794L, 1791L, 1788L, 1789L, 1790L, 1794L, 1793L,
1793L, 1791L, 1791L, 1795L, 1790L, 1790L, 1788L, 1793L, 1793L,
1786L, 1788L, 1795L, 1790L, 1781L, 1781L, 1782L, 1786L, 1794L,
1787L, 1787L, 1782L, 1786L, 1783L, 1788L, 1784L)
解决方案
MixedCombnPerm
这是一个可以在这里找到的功能的解决方案。
该解决方案包括推导所有可能的组合,然后采用最佳组合。
X <- c(2,3,5,10,15)
Y <- c(4,6,23,15,12)
Z <- c(23,34,12,1,5)
set_list <- list(X, Y, Z)
k <- c(2, 4, 3)
combinations <- MixedCombnPerm(set_list, k)
total <- colSums(combinations)
deviation <- abs(total - 50)
is <- which(deviation == min(deviation))
combinations[, is]
# [1] 2 3 4 6 15 12 12 1 5
total[is]
# [1] 60
这是一个解决方案CVXR
。结果中的小值实际上是 0。
library(CVXR)
x <- Bool(5)
y <- Bool(5)
z <- Bool(5)
constraintX <- sum(x) == 2
constraintY <- sum(y) == 4
constraintZ <- sum(z) == 3
objective <- Minimize((sum(x*X+y*Y+z*Z) - 50)^2)
problem <- Problem(objective,
constraints = list(constraintX, constraintY, constraintZ))
result <- solve(problem)
result$getValue(x)
# [,1]
# [1,] 1.000000e+00
# [2,] 1.000000e+00
# [3,] 1.168141e-09
# [4,] 8.964959e-11
# [5,] 2.563038e-11
result$getValue(y)
# [,1]
# [1,] 1.000000e+00
# [2,] 1.000000e+00
# [3,] 1.841415e-10
# [4,] 1.000000e+00
# [5,] 1.000000e+00
result$getValue(z)
# [,1]
# [1,] 9.946796e-11
# [2,] 3.816320e-11
# [3,] 1.000000e+00
# [4,] 1.000000e+00
# [5,] 1.000000e+00
编辑
这是CVXR
用于大数据的解决方案。首先,安装软件包Rglpk
:
install.packages("Rglpk")
然后做:
result <- solve(problem, solver = "GLPK")
我用它测试过
objective <- Minimize( abs( sum(x*X) + sum(y*Y) + sum(z*Z) - target) )
它奏效了。
推荐阅读
- docker - 从 Azure Pipeline Task 构建 docker 映像
- list - 在 Haskell 中分离矩阵的行和列
- node.js - 使用 lerna 作为 API 版本管理器
- python - 用于确定两个系列代码之间的一致编码的算法
- c# - 如何在 ASP.NET Core 中返回存储为 byte[] 的文件?
- bootstrap-vue - 具有复选框开关大小的 BootstrapVue 输入组
- python - 熊猫如何使用分隔符将一列一分为二
- javascript - 带有异步回调的表操作
- reactjs - 使用 react js 从 fireabase 数据库中检索布尔值并显示该值
- amazon-web-services - AWS S3 - 拒绝访问;Block all 关闭,ACL 是所有人,Policy 是允许所有人