当前位置: 首页 > 知识库问答 >
问题:

我的子集平均问题有DP解决方案吗?

晁聪
2023-03-14

我有一个我无法解决的组合问题。

给定一组向量和一个目标向量,为每个向量返回一个标量,以便集中缩放向量的平均值最接近目标。

编辑:权重w_i在范围[0,1]内。这是一个约束优化问题:

最小化d(平均(w_i*x_i),目标),条件是总和(w_i)-1=0

如果我不得不命名这个问题,它将是无界子集平均。

我已经研究过无界背包和类似的问题,但由于数字的相互依赖性,动态编程实现似乎是不可能的。

我还补充了一个遗传算法,它能够很好地近似权重,但是它需要太长时间,我最初希望使用动态规划来解决这个问题。

还有希望吗?

共有1个答案

令狐高洁
2023-03-14

正如其他人所认识到的,这是一个最佳化问题。你有线性约束和凸目标函数,它可以转换为二次规划,(阅读最小二乘会话)

如果您想要最小化< code>w[i] * x[i]的平均值,这是< code>sum(w[i] * x[i]) / N,如果您将< code>w[i]排列为< code>(1 x N_vectors)矩阵的元素,并且每个vector x[i]作为< code>(N_vectors x DIM)矩阵的第I行,则它变成< code>w @ X

要转换为该形式,您必须构造一个矩阵,以便A*x的每一行

这可以使用 cvxpy 轻松实现,您不必关心扩展所有约束。

下面的函数解决了这个问题,如果向量的维度为2,则绘制结果。


import cvxpy;
import numpy as np
import matplotlib.pyplot as plt

def place_there(X, target):
    # some linear algebra arrangements
    target = target.reshape((1, -1))
    ncols = target.shape[1]
    X = np.array(X).reshape((-1, ncols))
    N_vectors = X.shape[0]
    # variable of the problem
    w = cvxpy.Variable((1, X.shape[0]))
    # solve the problem with the objective of minimize the norm of w * X - T (@ is the matrix product)
    P = cvxpy.Problem(cvxpy.Minimize(cvxpy.norm((w @ X) / N_vectors - target)), [w >= 0, cvxpy.sum(w) == 1])
    
    # here it is solved
    print('Distance from target is: ', P.solve())
    
    # show the solution in a nice plot
    # w.value is the w that gave the optimal solution
    Y = w.value.transpose() * X / N_vectors
    path = np.zeros((X.shape[0] + 1, 2))
    path[1:, :] = np.cumsum(Y, axis=0)
    randColors=np.random.rand( 3* X.shape[0], 3).reshape((-1, 3)) * 0.7
    plt.quiver(path[:-1,0], path[:-1, 1], Y[:, 0], Y[:, 1], color=randColors, angles='xy', scale_units='xy', scale=1)
    plt.plot(target[:, 0], target[:, 1], 'or')

你可以这样运行它

target = np.array([[1.234, 0.456]]);
plt.figure(figsize=(12, 4))
for i in [1,2,3]:
    X = np.random.randn(20) * 100
    plt.subplot(1,3,i)
    place_there(X, target)
    plt.xlim([-3, 3])
    plt.ylim([-3, 3])
    plt.grid()
plt.show();

 类似资料:
  • 这是一个骇人听闻的问题:爱丽丝是一个幼儿园老师。她想给班上的孩子们一些糖果。所有的孩子坐成一行(他们的位置是固定的),每个人根据他(她)在班上的表现有一个评级分数。爱丽丝想给每个孩子至少一颗糖。如果两个孩子挨着坐,那么评分较高的那一个必须得到更多的糖果。爱丽丝想省钱,所以她需要尽量减少给孩子们的糖果总数。 测试数组:n=10,n个元素为[2 4 2 6 1 7 8 9 2 1]。我得到的答案是18

  • 下面是问题的链接:SPOJ-ACTIV 我想出了这个问题的重现如下: 其中next()查找具有开始时间的活动的索引 这是我的java解决方案,虽然它通过了SPOJ工具包的许多测试用例,但是它确实为一些提供了WA。我的概念/解决方案有什么问题?

  • 我知道在stackoverflow中已经提出了一些相关的问题。然而,这个问题更多地与3种方法之间的性能差异有关。 问题是:给定一个只包含正整数的非空数组,找出该数组是否可以分成两个子集,使得两个子集的元素之和相等。https://leetcode.com/problems/partition-equal-subset-sum/ 即[1,5,11,5] =真,[1,5,9] =假 通过解决这个问题,

  • 10.10. 公共问题的解决方案 10.10.1. 对一个特定的 DataSource 使用错误的事务管理器 开发者需要按照需求仔细地选择正确的 PlatformTransactionManager 实现。理解Spring的事务抽象如何与JTA全局事务一起工作是非常重要的。使用得当,就不会有任何冲突:Spring仅仅提供一个直观的、可移植的抽象层。 如果你使用全局事务,你 必须 为你的所有事务操作

  • 我有一个练习: 您将获得不同面额的硬币和总金额。请编写一个函数来计算您需要的最少数量的硬币,以弥补该金额。如果硬币的任何组合都无法弥补该金额,请返回-1 例1: 我还谷歌了一个这样的解决方案: 我知道它是关于DP的,但是,我对它很困惑,比如,的含义是什么,为什么要添加,为什么要添加,为什么要添加1? 有人能用简单的英语指出出路吗?

  • 本文向大家介绍Nginx tp3.2.3 404问题解决方案,包括了Nginx tp3.2.3 404问题解决方案的使用技巧和注意事项,需要的朋友参考一下 最近我把Apache给换成nginx,当我把tp项目搬过去运行的时候发现404 错误 ,原来是因为nginx不支持 pathinfo 模式,需要自己配置 下面我配置 在server配置里面 保存配置之后,重启 nginx ,配置成功 直接支持类