- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我认为这是一个日程安排问题,但我什至不确定那么多!我想要的是找到最佳的非重叠购买决策序列,当我充分了解它们的值(value)以及 future 会出现什么机会时。
想象一下,一个批发商销售我想为自己的商店购买的各种商品。在任何时候,他们都可能有多个特别优惠事件;我会全价出售,所以他们的折扣就是我的利润。
我想最大化利润,但问题是我一次只能买一件东西,而且没有信用,更糟糕的是,还有交货延迟。好消息是我会在货到货后立即卖掉,然后我就可以再花钱了。因此,通过所有选择的一条路径可能是:我在星期一购买 100 公斤苹果,它们在星期二交付。然后我购买了 20 件修女服装,在星期天送达,足够合适。我跳过了几天,因为我知道周三他们将以大幅折扣出售法拉利。所以我买了其中一个,它在下周二交付。等等。
您可以考虑复合利润或不复合利润。该算法归结为在每个阶段做出决定,是选择今天的特别优惠之一,还是等待一天,因为明天会有更好的东西。
让我们抽象一下。购买和交付成为时代以来的天数。利润表示为卖出价除以买入价。 IE。 1.00 表示收支平衡,1.10 表示 10% 的利润,2.0 表示我的钱翻了一番。
buy delivery profit
1 2 1.10 Apples
1 3 1.15 Viagra
2 3 1.15 Notebooks
3 7 1.30 Nun costumes
4 7 1.28 Priest costumes
6 7 1.09 Oranges
6 8 1.11 Pears
7 9 1.16 Yellow shoes
8 10 1.15 Red shoes
10 15 1.50 Red Ferrari
11 15 1.40 Yellow Ferrari
13 16 1.25 Organic grapes
14 19 1.30 Organic wine
注意:机会只存在于购买日(例如,如果没有人购买,有机葡萄就会被制成 Wine !),我可以在交货的同一天出售,但直到购买日才能购买我的下一件商品次日。所以我不能在 t=7 卖掉我的修女服装,然后在 t=7 立即买黄色鞋子。
我希望存在一个已知的最佳算法,并且已经有一个 R 模块,但算法或学术文献也很好,任何其他语言的任何东西都一样。速度很重要,但主要是当数据变大时,所以我想知道它是 O(n2) 还是其他。
顺便问一下,如果存在最大可能的交付延迟,最佳算法会改变吗?例如。如果delivery - buy <= 7
以上数据为 CSV 格式:
buy,delivery,profit,item
1,2,1.10,Apples
1,3,1.15,Viagra
2,3,1.15,Notebooks
3,7,1.30,Nun costumes
4,7,1.28,Priest costumes
6,7,1.09,Oranges
6,8,1.11,Pears
7,9,1.16,Yellow shoes
8,10,1.15,Red shoes
10,15,1.50,Red Ferrari
11,15,1.40,Yellow Ferrari
13,16,1.25,Organic grapes
14,19,1.30,Organic wine
或者作为 JSON:
{"headers":["buy","delivery","profit","item"],"data":[[1,2,1.1,"Apples"],[1,3,1.15,"Viagra"],[2,3,1.15,"Notebooks"],[3,7,1.3,"Nun costumes"],[4,7,1.28,"Priest costumes"],[6,7,1.09,"Oranges"],[6,8,1.11,"Pears"],[7,9,1.16,"Yellow shoes"],[8,10,1.15,"Red shoes"],[10,15,1.5,"Red Ferrari"],[11,15,1.4,"Yellow Ferrari"],[13,16,1.25,"Organic grapes"],[14,19,1.3,"Organic wine"]]}
或者作为 R 数据框:
structure(list(buy = c(1L, 1L, 2L, 3L, 4L, 6L, 6L, 7L, 8L, 10L,
11L, 13L, 14L), delivery = c(2L, 3L, 3L, 7L, 7L, 7L, 8L, 9L,
10L, 15L, 15L, 16L, 19L), profit = c(1.1, 1.15, 1.15, 1.3, 1.28,
1.09, 1.11, 1.16, 1.15, 1.5, 1.4, 1.25, 1.3), item = c("Apples",
"Viagra", "Notebooks", "Nun costumes", "Priest costumes", "Oranges",
"Pears", "Yellow shoes", "Red shoes", "Red Ferrari", "Yellow Ferrari",
"Organic grapes", "Organic wine")), .Names = c("buy", "delivery",
"profit", "item"), row.names = c(NA, -13L), class = "data.frame")
链接
Are there any R Packages for Graphs (shortest path, etc.)? (igraph 提供了一个 shortest.paths 函数,除了 C 库之外,还有一个 R package 和一个 python 接口(interface))
最佳答案
思考这个问题的最简单方法类似于 shortest-path problem (尽管将其视为 maximum flow problem 在技术上可能更好)。日期编号 1 ... 19 可用作节点名称;每个节点 j 都有一个指向权重为 1 的节点 j+1 的链接,并且每个产品 (b,d,g,p)列表添加一个从第 b 天到第 d+1 天的链接,权重为 g。当我们在寻路时通过节点时,我们会跟踪到目前为止在每个节点看到的最佳乘积值。
下面显示的 Python 代码运行时间为 O(V+E),其中 V 是顶点数(或天数),E 是边数。在此实现中,E = V + 正在销售的产品数量。 添加注释:循环 for i, t in enumerate(graf): 对每个顶点处理一次。在该循环中,for e in edges: 处理来自当前顶点的每条边一次。因此,没有一条边被处理超过一次,所以性能是 O(V+E)。
编辑注释 2: krjampani 声称 O(V+E) 比 O(n log n) 慢,其中 n 是产品的数量。但是,除非我们对所考虑的天数做出假设,否则这两个订单不可比。请注意,如果交货延迟有限且产品日期重叠,则天数为 O(n),因此 O(V+E) = O(n),这比 O(n log n) 更快。
但是,在一组给定的假设下,我的方法和 krjampani 的运行时顺序可以相同:对于大量的天数,更改我的方法以仅在 x[0] 的排序联合中为天数创建图节点和 x[1] 值,并使用指向 day[i-1] 和 day[i+1] 的链接而不是指向 i-1 和 i+1 的链接。对于少量天数,将 krjampani 的方法更改为使用 O(n) 计数排序。
程序的输出如下所示:
16 : 2.36992 [11, 15, 1.4, 'Yellow Ferrari']
11 : 1.6928 [8, 10, 1.15, 'Red shoes']
8 : 1.472 [4, 7, 1.28, 'Priest costumes']
4 : 1.15 [1, 3, 1.15, 'Viagra']
这表明我们在第 15 天卖出黄色法拉利后,在第 16 天获得了 2.36992 的复合利润;在第 11 天卖出红鞋后获利 1.6928;等等。请注意,产品列表开头的虚拟条目以及数字周围引号的删除是与 JSON 数据的主要区别。列表元素 graf[j]
中的条目以 [1, j-1, 0, [[j+1,1,0]]]
开头,即,形式为 [best-value-so-far, best-from-node#, best-from-product-key, edge-list]。每个边缘列表都是列表的列表,其形式为 [next-node#, edge-weight, product-key]。将产品 0 设为虚拟产品可简化初始化。
products = [[0,0,0,""],[1,2,1.10,"Apples"],[1,3,1.15,"Viagra"],[2,3,1.15,"Notebooks"],[3,7,1.30,"Nun costumes"],[4,7,1.28,"Priest costumes"],[6,7,1.09,"Oranges"],[6,8,1.11,"Pears"],[7,9,1.16,"Yellow shoes"],[8,10,1.15,"Red shoes"],[10,15,1.50,"Red Ferrari"],[11,15,1.40,"Yellow Ferrari"],[13,16,1.25,"Organic grapes"],[14,19,1.30,"Organic wine"]]
hiDay = max([x[1] for x in products])
graf = [[1, i-1, 0, [[i+1,1,0]]] for i in range(2+hiDay)]
for i, x in enumerate(products):
b, d, g, p = x[:]
graf[b][3] += [[d+1, g, i]] # Add an edge for each product
for i, t in enumerate(graf):
if i > hiDay: break
valu = t[0] # Best value of path to current node
edges = t[3] # List of edges out of current node
for e in edges:
link, gain, prod = e[:]
v = valu * gain;
if v > graf[link][0]:
graf[link][0:3] = [v, i, prod]
day = hiDay
while day > 0:
if graf[day][2] > 0:
print day, ":\t", graf[day][0], products[graf[day][2]]
day = graf[day][1]
关于algorithm - 非重叠购买的最佳顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12683058/
我在一本书(Interview Question)中读到这个问题,想在这里详细讨论这个问题。请点亮它。 问题如下:- 隐私和匿名化 马萨诸塞州集团保险委员会早在 1990 年代中期就有一个绝妙的主意
我最近接受了一次面试,面试官给了我一些伪代码并提出了相关问题。不幸的是,由于准备不足,我无法回答他的问题。由于时间关系,我无法向他请教该问题的解决方案。如果有人可以指导我并帮助我理解问题,以便我可以改
这是我的代码 public int getDist(Node root, int value) { if (root == null && value !=0) return
就效率而言,Strassen 算法应该停止递归并应用乘法的最佳交叉点是多少? 我知道这与具体的实现和硬件密切相关,但对于一般情况应该有某种指南或某人的一些实验结果。 在网上搜索了一下,问了一些他们认为
我想学习一些关于分布式算法的知识,所以我正在寻找任何书籍推荐。我对理论书籍更感兴趣,因为实现只是个人喜好问题(我可能会使用 erlang(或 c#))。但另一方面,我不想对算法进行原始的数学分析。只是
我想知道你们中有多少人实现了计算机科学的“ classical algorithms ”,例如 Dijkstra's algorithm或现实世界中的数据结构(例如二叉搜索树),而不是学术项目? 当有
我正在解决旧编程竞赛中的一些示例问题。在这个问题中,我们得到了我们有多少调酒师以及他们知道哪些食谱的信息。制作每杯鸡尾酒需要 1 分钟,我们需要使用所有调酒师计算是否可以在 5 分钟内完成订单。 解决
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
我开始学习 Nodejs,但我被困在中间的某个地方。我从 npm 安装了一个新库,它是 express -jwt ,它在运行后显示某种错误。附上代码和错误日志,请帮助我! const jwt = re
我有一个证书,其中签名算法显示“sha256rsa”,但指纹算法显示“sha1”。我的证书 SHA1/SHA2 的标识是什么? 谢谢! 最佳答案 TL;TR:签名和指纹是完全不同的东西。对于证书的强度
我目前在我的大学学习数据结构类(class),并且在之前的类(class)中做过一些算法分析,但这是我在之前的类(class)中遇到的最困难的部分。我们现在将在我的数据结构类(class)中学习算法分
有一个由 N 个 1x1 方格组成的区域,并且该区域的所有部分都是相连的(没有任何方格无法到达的方格)。 下面是一些面积的例子。 我想在这个区域中选择一些方块,并且两个相邻的方块不能一起选择(对角接触
我有一些多边形形状的点列表,我想将其包含在我页面上的 Google map 中。 我已经从原始数据中删除了尽可能多的不必要的多边形,现在我剩下大约 12 个,但它们非常详细以至于导致了问题。现在我的文
我目前正在实现 Marching Squares用于计算等高线曲线,我对此处提到的位移位的使用有疑问 Compose the 4 bits at the corners of the cell to
我正在尝试针对给定算法的约束满足问题实现此递归回溯函数: function BACKTRACKING-SEARCH(csp) returns solution/failure return R
是否有包含反函数的库? 作为项目的一部分,我目前正在研究测向算法。我正在使用巴特利特相关性。在 Bartlett 相关性中,我需要将已经是 3 次矩阵乘法(包括 Hermitian 转置)的分子除以作
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 8 年前。 Improve
问题的链接是UVA - 1394 : And There Was One . 朴素的算法是扫描整个数组并在每次迭代中标记第 k 个元素并在最后停止:这需要 O(n^2) 时间。 我搜索了一种替代算法并
COM 中创建 GUID 的函数 (CoCreateGUID) 使用“分散唯一性算法”,但我的问题是,它是什么? 谁能解释一下? 最佳答案 一种生成 ID 的方法,该 ID 具有一定的唯一性保证,而不
在做一个项目时我遇到了这个问题,我将在这个问题的实际领域之外重新措辞(我想我可以谈论烟花的口径和形状,但这会使理解更加复杂).我正在寻找一种(可能是近似的)算法来解决它。 我有 n 个不同大小的容器,
我是一名优秀的程序员,十分优秀!