急求一个急于版本范围的依赖问题的算法

yanical 2013-04-16 05:33:13
有很多个组件,组件之间会有依赖关系,依赖关系是一个版本范围的依赖,比如:


组件 A, 版本 1 依赖: 组件 B, 版本 1~3; 和 组件 C, 版本 2~3
组件 D, 版本 1 依赖: 组件 B, 版本 2~4; 和 组件 C, 版本 1~2


对同一个组件类型,只能选择其中一个版本。 那假设我现在确定了我要组件A,版本1和组件D,版本1。 我需要确定出组件B和C分别用哪个版本。

考虑,依赖会有很多层,但是不会有循环依赖。

请描述详细算法,谢谢了!
...全文
250 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanical 2013-04-22
  • 打赏
  • 举报
回复
引用 5 楼 tkminigame 的回复:
类似的问题解决过 首先描述出组件之间的依赖关系,无非是并或或 Depend(A) = (B1 or B2 or B3) and (C1 or C2 or C3) Depend(D) = (B2 or B3) and (C1 or C2) 解决问题 Solve(A and D) 每一个depend都会生成一个字典型的版本集 for A: B(1,……
看起来是个好想法,不过,最后的几句我不是很明白,每个分支都解开是什么意思? 以上面的例子来说,会产生4个组合,(B2,C1);(B3,C1);(B2,C2);(B3,C2)。这几个组合都作为可选的分别作处理吗? 还有一个case我忘了提了,如果出现冲突怎么办,比如你提到的比如B2和C1依赖同一个组件E,但是他们的版本会产生冲突而且不可能解决,在这种情况下,就要更换B或C的版本。
tkminigame 2013-04-22
  • 打赏
  • 举报
回复
引用 6 楼 yanical 的回复:
引用 5 楼 tkminigame 的回复:类似的问题解决过 首先描述出组件之间的依赖关系,无非是并或或 Depend(A) = (B1 or B2 or B3) and (C1 or C2 or C3) Depend(D) = (B2 or B3) and (C1 or C2) 解决问题 Solve(A and D) 每一个depend都会生成一……
每个分支是指每个or,不是组合 比如 Solve((B2 or B3) and (C1 or C2)) 分支有b2,b3,c1,c2单独去求他们的集,不是组合到一块 如果有冲突的情况,可设置一个冲突集列表 Conflict(B2,C1) Conflict(B3,C2) ... 对正在解决的问题维持一个当前集冲突,尝试往里面加入时检查,比如加入b2后, {C1} 加入C2后 {C1,B3} 如果要回溯到某一步,则要根据当时一部的集重新构造冲突集。 还有最重要的一点:缓存结果,不要每次都去算就行了。
tkminigame 2013-04-19
  • 打赏
  • 举报
回复
类似的问题解决过 首先描述出组件之间的依赖关系,无非是并或或 Depend(A) = (B1 or B2 or B3) and (C1 or C2 or C3) Depend(D) = (B2 or B3) and (C1 or C2) 解决问题 Solve(A and D) 每一个depend都会生成一个字典型的版本集 for A: B(1,2,3) C(1,2,3) for D: B(2,3) C(1,2) 如果集与集之间的关系是and则合并集合,同键值之间取交集,如果关系是or则保持之作为分支继续往下搜 得到 for (A and D) B(2,3) C(1,2) 问题转化为 Solve((B2 or B3) and (C1 or C2)) 如此。 对于or分支,我会每个都解开,看起来有点恐怖,但是实际不会太夸张,因为只是组件依赖,数据不可能到很离谱的程度。
yanical 2013-04-19
  • 打赏
  • 举报
回复
引用 3 楼 FancyMouse 的回复:
原来版本范围是被依赖的范围,而且还有每个组件只能选用一个版本的限制啊。 那就估计没啥好办法了。光考虑第一个条件就很可能已经是NPC了。因为A->B or C写出来就是(not A) or B or C,已经是个3CNF了,弄到最后很可能这个问题本身就是3SAT或者甚至比3SAT更难。
是的,我对算法基本上没什么了解,在国外网站上问了一些人,有人说就是k-SAT了,搜了下k-SAT也没什么解决方案。类似的案例是有,但是没时间研究。现在就打算穷举了,因为我只要找到一个满足的就好了,希望穷举不要太慢。 有什么建议吗?
FancyMouse 2013-04-18
  • 打赏
  • 举报
回复
原来版本范围是被依赖的范围,而且还有每个组件只能选用一个版本的限制啊。 那就估计没啥好办法了。光考虑第一个条件就很可能已经是NPC了。因为A->B or C写出来就是(not A) or B or C,已经是个3CNF了,弄到最后很可能这个问题本身就是3SAT或者甚至比3SAT更难。
yanical 2013-04-17
  • 打赏
  • 举报
回复
引用 1 楼 FancyMouse 的回复:
不同版本的组件看成不同组件。
然后呢,别人也建议我这样,但是我不知道下一步该怎么走了,这样组件有排它性,又有可选的依赖性。
FancyMouse 2013-04-17
  • 打赏
  • 举报
回复
不同版本的组件看成不同组件。

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧