分配不同价值对象的算法建议

2024-04-23

我有以下问题:

给定 N 个对象(N

编辑:通过最公平的分配,我的意思是任何两个玩家获得的物体的价值之间的差异是最小的。 另一个类似的情况是:我有N个不同价值的硬币,我需要将它们平均分配给M个玩家;有时他们并没有完全分开,我需要找到下一个最佳的分配情况(没有玩家因为另一个玩家得到太多钱而生气)。

我不需要(伪)代码来解决这个问题(而且,这不是家庭作业:)),但我将不胜感激任何可以解决这个问题的想法或算法链接。

Thanks!


该问题是强 NP 完全问题。这意味着无法确保在合理的时间内得到正确的解决方案。 (看3-分区问题 http://en.wikipedia.org/wiki/3-partition_problem,谢谢保罗)。

相反,您会想要一个好的近似解生成器。这些往往可以在很短的时间内非常接近最佳答案。我可以推荐模拟退火 http://en.wikipedia.org/wiki/Simulated_annealing技术,您还可以将其用于解决大量其他 NP 完全问题。

想法是这样的:

  1. 随机分配物品。
  2. 不断在两个随机玩家之间进行随机交换,只要它使系统更加公平,或者只是稍微不那么公平(有关详细信息,请参阅 wiki)。
  3. 当你有足够公平的东西,或者你已经没有时间了,就停下来。

这个解决方案比许多人建议的“贪婪”算法要强大得多。贪婪算法是一种不断向“最穷”玩家添加最大物品的算法。贪婪失败的测试用例的一个例子是[10,9,8,7,7,5,5].


我为你实现了SA。出于教育目的,它严格遵循 wiki 文章。如果你对其进行优化,我会说 100 倍的改进并不是不现实的。

from __future__ import division
import random, math

values = [10,9,8,7,7,5,5]
M = 3
kmax = 1000
emax = 0

def s0():
    s = [[] for i in xrange(M)]
    for v in values:
        random.choice(s).append(v)
    return s

def E(s):
    avg = sum(values)/M
    return sum(abs(avg-sum(p))**2 for p in s)

def neighbour(s):
    snew = [p[:] for p in s]
    while True:
        p1, p2 = random.sample(xrange(M),2)
        if s[p1]: break
    item = random.randrange(len(s[p1]))
    snew[p2].append(snew[p1].pop(item))
    return snew

def P(e, enew, T):
    if enew < e: return 1
    return math.exp((e - enew) / T)

def temp(r):
    return (1-r)*100

s = s0()
e = E(s)
sbest = s
ebest = e
k = 0
while k < kmax and e > emax:
    snew = neighbour(s)
    enew = E(snew)
    if enew < ebest:
        sbest = snew; ebest = enew
    if P(e, enew, temp(k/kmax)) > random.random():
        s = snew; e = enew
    k += 1

print sbest

Update:在尝试了 Branch'n'Bound 之后,我现在相信这种方法更优越,因为它在一秒钟内为 N=30、M=6 的情况提供了完美的结果。不过我想你也可以尝试模拟退火方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

分配不同价值对象的算法建议 的相关文章

  • 如何使用哈希表在最小堆上实现 O(1) 删除

    在某处阅读以下声明 可以使用附加的哈希表来快速删除 最小堆 问题 gt 如何组合priority queue and unordered map这样我就可以实现上面的想法了 include
  • 在 Python 中删除表达式树及其每个子表达式树中第一个元素周围的括号

    目标是实现简化操作 删除表达式树及其每个子表达式树中第一个元素周围的括号 其中表达式作为括在各个括号中的字符串输入给出 这必须适用于任意数量的括号 例如 12 3 45 6 gt 123 45 6 删除 12 周围的括号 然后删除 45 周
  • 优雅的折线“左移”测试

    Given X Y 坐标 即车辆的位置 X Y 数组 它们是折线中的顶点 请注意 折线仅由直线段组成 没有圆弧 我想要的是 计算车辆是在折线的左侧还是右侧 当然还是在顶部 我的做法 迭代所有线段 并计算到每个线段的距离 然后 对于最近的段
  • Java:使用indexOf方法根据另一个数组对数组进行排序

    我想根据另一个数组 索引 的排序顺序迭代两个数组 A B 在本例中为 10 34 32 21 String A a b c d String B e f g h int indexes 10 34 32 21 为这里的坏例子道歉 我已经更新
  • 给定两个(大)点集,我如何有效地找到彼此最接近的点对?

    我需要解决一个计算问题 该问题归结为搜索两个集合之间最接近的点对 问题是这样的 给定欧几里德空间中的一组点 A 和一组点 B 找到所有对 a b 使得 b 是 B 中与 a 最近的点 a 是 A 中与 b 最近的点 集合 A 和 B 的大小
  • 为无向无权图实现推重标签算法 s-t 最小割边

    我正在寻找一个好的解决方案来在无向和未加权图中找到 s t 最小切割边 我想使用推送重新标记算法 但我不确定如何实现它以在无向和未加权图上找到最小割 在每对顶点之间有两条反向边 并在所有边上赋予相同的权重 并应用推送重新标记算法 我可以用这
  • 交换两个向量之间的值,使两个向量的 max_element 之和最小

    这是 Codechef 的问题 但请耐心等待 https www codechef com ZCOPRAC problems ZCO16001 https www codechef com ZCOPRAC problems ZCO16001
  • 在无向图中查找强连通分量

    我想在无向图中找到强连接的组件 即如果我从节点开始A然后我会回到节点A并且每条边都被恰好访问一次 对于有向图可以使用Tarjan算法来寻找强连通分量 但是对于无向图怎么办 我认为您错过了强连通分量的含义 强连接组件 如果所有顶点对之间都存在
  • 如何计算两个ip之间的主机数量? C#

    我有两个ip 1 1 1 1 1 2 4 4 4 4 显然这只是一个例子 这是一个动态计算器 如果子网掩码不相关 我如何计算所述 ip 之间的主机数量 要计算 理论 IP 地址的数量 您需要将每个 IP 地址转换为其 32 位整数格式 这实
  • 合并字符数组中的最小重复次数

    假设我有两个数组 我想合并它们 以便合并后的数组具有最小重复次数 例如 x x 是重复 arr1 x d d m f m arr2 d d x f f m 唯一的条件是在合并数组中 元素来自arr1 and arr2必须出现在各自的订单中a
  • 反转二进制网络

    如何反转二元方程 以便找到哪些输入将产生给定的输出 Example Inputs i0 through i8 Outputs o0 through o8 Operators XOR AND 二元方程 1 i0 1 i1 0 i2 1 i3
  • 使用FFT算法计算

    给定在平面上的点 1 0 2 0 n 0 上发现的一组 n 个粒子电荷载流子 在 i 0 点发现的粒子电荷记为 Qi 作用在粒子上的力由以下公式给出 C is a Coulomb s constant 给出一个算法来计算 Fi 对于总复杂度
  • 从日志文件中获取前 100 个 URL

    我的一位朋友在接受采访时被问到以下问题 谁能告诉我如何解决它 我们有一个相当大的日志文件 大约 5GB 日志文件的每一行都包含一个用户在我们网站上访问过的 URL 我们想要找出用户访问最多的 100 个 URL 怎么做 如果我们有超过 10
  • 如何查找给定字符串中仅出现一次的第一个字符[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何求解:T(n) = T(n - 1) + n

    我已经解决了以下问题 T n T n 1 n O n 2 现在 当我解决这个问题时 我发现界限非常松散 我是否做错了什么 或者只是这样 您还需要一个递归关系的基本情况 T 1 c T n T n 1 n 为了解决这个问题 您可以首先猜测一个
  • 在 O(n) 时间内找到 n x n 矩阵中的局部最小值

    所以 这不是我的家庭作业问题 而是取自 coursera 算法和数据结构课程的未评分作业 现已完成 You are given an n by n grid of distinct numbers A number is a local m
  • 使用C标准数学库精确计算标准正态分布的CDF

    标准 C 数学库不提供计算标准正态分布 CDF 的函数 normcdf 然而 它确实提供了密切相关的函数 误差函数 erf 和互补误差函数 erfc 计算 CDF 的最快方法通常是通过误差函数 使用预定义常量 M SQRT1 2 来表示 d
  • 通过分布式数据库聚合作业优化网络带宽

    我有一个分布式 联合数据库 结构如下 数据库分布在三个地理位置 节点 每个节点集群有多个数据库 关系数据库是 PostgreSQL MySQL Oracle 和 MS SQL Server 的混合体 非关系数据库是 MongoDB 或 Ca
  • 如何将一组重叠范围划分为不重叠范围?

    假设您有一组范围 0 100 一 0 75 b 95 150 c 120 130 d 显然 这些范围在某些点上重叠 您将如何剖析这些范围以生成不重叠范围的列表 同时保留与其原始范围相关的信息 在本例中为范围后面的字母 例如 运行算法后的上述
  • 点集子集的最小周长凸包

    给定平面上的 n 个点 没有 3 个共线 给定数字 k 找到 k 个点的子集 使得 k 个点的凸包在 k 个点的子集的任何凸包中具有最小周长 我可以想到一个简单的方法 运行时间为 O n k k log k 找到大小为 k 的每个子集的凸包

随机推荐

  • 正则表达式拆分 key=value

    我有一个像这样的字符串 KEY1 Value1 KE Y2 V LUE2A Value2B Key3 KEY4 V AL UE4 KEY5 Value5 我需要将其拆分以获得带有键值对的 Map 值在 应作为单个值传递 KE Y2是一个关键
  • 使用 Xamarin.iOS 获取 iOS Library 文件夹的正确方法是什么?

    这将获取我的 iOS 应用程序的文档根目录 Environment GetFolderPath Environment SpecialFolder MyDocuments 有没有类似的东西可以到达Library folder var doc
  • 静态属性未在 UI 中更新

    我花了最后一个小时试图在谷歌和 stackoverflow 中找到答案 我遵循了不同的意见和建议 但到目前为止没有任何效果 我当前的代码如下所示 public class GlobalManager ViewModelBase static
  • Oracle 中四舍五入到特定有效数字位数

    oracle 是否有舍入函数可以四舍五入到特定数量的有效数字 例如 将 1278 舍入到 1300 四舍五入到两位有效数字 Try ROUND x d FLOOR LOG 10 x 1 where d是有效位数 x是要四舍五入的值 Exam
  • /docker-entrypoint-initdb.d 文件夹中的脚本将被忽略

    我需要使用一些 SQL 命令配置 Postogres 但我放入 docker entrypoint initdb d 文件夹中的所有内容都不会被执行 我正在使用 postgres 9 6 图像 我的 Dockerfile 如下 FROM p
  • 包使用冲突:捆绑包启动时的导入包

    尝试安装 htmlunit 捆绑包时出现以下错误 com springsource com gargoylesoftware htmlunit 2 6 0 370 could not be resolved Reason Package u
  • 如何将本地不同的 Git 分支推送到 Heroku/master

    Heroku 的政策是忽略除 master 之外的所有分支 虽然我确信 Heroku 的设计者对这个政策有很好的理由 我猜测是为了存储和性能优化 但对我作为开发人员来说 结果是无论我正在研究什么本地主题分支 我都想要一种简单的方法将 Her
  • CakePHP 无法写入某些文件

    我开始使用 CakePHP 为我的框架开发一个网站 我实际上刚刚开始并且已经遇到了错误 我无法理解它们的含义 Warning cake core cache was unable to write cake dev en us to Fil
  • CSS加载后触发的jQuery事件?

    我的页面上有几个链接 在 div 允许您更改 CSS 样式表 theme selector a click function var path this attr href head link remove head append retu
  • 我可以使用 CALayer 来加速视图渲染吗?

    我正在制作一个自定义 NSView 对象 其中一些内容经常更改 而另一些内容则很少更改 事实证明 变化较少的部分需要花费最多的时间来绘制 我想做的是将这两个部分渲染在不同的层中 以便我可以分别更新其中一个或另一个 从而使我的用户免受缓慢的用
  • 未确定的泛型类型在 ghci 的运行时中如何表示

    我很清楚通用函数和通用数据类型 在泛型类型中 data SB forall x show x gt SB x instance Show SB where show SB x show x 所以对于任何给定类型x 如果它有一个签名Show
  • charindex() 最后计算白色字符,len() 在 T-SQL 中不计算

    我想找到最后一个的索引 性格 但问题是 LEFT target LEN target CHARINDEX REVERSE target 不起作用 因为目标列中的字符串末尾有很多空格字符 并且charindex函数包含空格 但是len没有 有
  • 如何对异步 API 进行单元测试?

    我已经安装了适用于 Mac 的 Google 工具箱 http code google com p google toolbox for mac 进入 Xcode 并按照说明设置单元测试发现here http code google com
  • Android NDK 链接问题

    我用 NDK 编译了 Sox 等 所以 我拥有所有 Android 友好的共享库 我制造了一个简单的测试文件 http pastebin com rniwQ7Gz它调用 sox 函数 NDK 构建告诉我 undefined referenc
  • 尝试以紧凑模式访问 UITextView 时 iMessage 扩展程序崩溃

    下面是我在 iMessage 应用程序中的完整代码 class MessagesViewController MSMessagesAppViewController IBOutlet weak var messageView UITextV
  • .net Web 应用程序中的异常处理

    我承认 我不关心太多的异常处理 我知道我应该做得更多 但我永远不知道从哪里开始和从哪里停止 我并不懒惰 离得很远 这是因为我对异常处理的矛盾心理感到过度紧张 即使是最小的应用程序中 似乎也有无数个地方可以应用异常处理 但它可能会让人感觉有点
  • Java 中对象序列化和压缩的性能成本

    应用程序不断接收名为Report并将对象放入Disruptor对于三个不同的消费者 在 Eclipse Memory Analysis 的帮助下 每个进程的 Retained Heap SizeReport对象平均为 20KB 该应用程序开
  • 使用 xslt 比较两个 xml 文件?

    我有 2 个 xml 文件 如何使用 xslt 比较两个文件是否相等 如果不等于意味着第二个 xml 中发生了更改 在 XPath 2 0 中你可以简单地使用fn deep equal http www w3 org TR 2005 CR
  • 检测用户何时点击 div 外部

    我正在向用户展示一个模式 灯箱 当用户单击按钮时 模式会显示 页面的其余部分会变暗 平常的东西 不过我想这样做 如果用户单击模式之外的任何元素 我希望模式消失并且页面恢复正常 如何才能做到这一点 我知道我可以为 body 设置一个 oncl
  • 分配不同价值对象的算法建议

    我有以下问题 给定 N 个对象 N 编辑 通过最公平的分配 我的意思是任何两个玩家获得的物体的价值之间的差异是最小的 另一个类似的情况是 我有N个不同价值的硬币 我需要将它们平均分配给M个玩家 有时他们并没有完全分开 我需要找到下一个最佳的