一个优化算法,有难度

canoe982 2010-02-18 02:40:49
问题描述如下:
  
  设有一含有M个元素的集合S,有N个产生式,每个产生式的形式可以表示为P(s,d),s,d均为S的非空子集。现设某用户希望由这N个产生式,得到一个目标集ud(也为S的非空子集),该用户可以提供一个源集us(为S的非空子集),us中的每个元素都附带一个权值c(权值各不相同)。请教一个算法,能够快速准确的找到us的一个子集,满足条件:(1)由该子集可以得到目标集ud;(2)该子集中各元素的权值之和是满足(1)的所有子集中最小的一个。

  可以假定已经存在函数f(s,d),可以判定由s是否可以得到d。当然,若s1是s2的子集,而f(s1,d)=1(表示由s1可以得到d),则f(s2,d)=1。

  由于可用分不多(只能20分),还望高手们赐教。
...全文
471 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
wohenbuzhidao 2010-03-03
  • 打赏
  • 举报
回复
留个脚印。先想想~~~~~~~~~~~~~~~~再发言
canoe982 2010-03-02
  • 打赏
  • 举报
回复
引用 18 楼 litaoye 的回复:
估计求最优解够呛呀,可以试试先从s为1个元素的集合逐步进行松弛。然后再弄s为2个元素的......
以此类推。LZ给一个复杂一点的例子吧,越复杂越好,我试试。


考虑过你这种想法,但分析之后没有找到非指数时间复杂度的最优算法。可以用这种思路得到一个较好的结果,但找不到度量这种结果好环程序的方法。
我的想法是:如果找不到最优,能够找到局部最优、可度量的近似最优也行。不过,到目前为止,还没有找到。

至于说要复杂的例子,可以用下面的算法,自动生成:
(1)随机产生一个集体M={"A1","A2",..."An"}。
(2)随机生成一个产生式:取一名字,不妨设为P1;从M中随机取a~b个元素作为P1的前件;从M中剩下的元素中随机取s~t个元素作为P1的后件。
(3)重复第2步,总共产生m个产生式。
(4)随机生成待求解问题:从M中随机取出c~d个元素作为已经条件,并给每个元素附随机权值;从M中剩下的元素中随机取出p~q个元素作为目标条件。
我在实验的时候,其中的参数是这样取值的:
a=s=1, b=t=5, c = 3, d = 8, p = 1, q = 5;
n/m = 2;
n与m的值根据问题规范需要同步增长。
绿色夹克衫 2010-03-01
  • 打赏
  • 举报
回复
估计求最优解够呛呀,可以试试先从s为1个元素的集合逐步进行松弛。然后再弄s为2个元素的......
以此类推。LZ给一个复杂一点的例子吧,越复杂越好,我试试。
n007dna1 2010-03-01
  • 打赏
  • 举报
回复
围观学习中。。。这是干嘛用的???
iwantnon 2010-02-27
  • 打赏
  • 举报
回复
我的意思是说,计算量主要在"求f"上。只要有了f,然后就是个最短路径问题。
求f的复杂度大概避免不了是指数级的。
所以楼主应说清到底f是已知还是未知。
canoe982 2010-02-27
  • 打赏
  • 举报
回复
我已经找到了求f的算法,其时间复杂度为O(n^2),n为产生式的个数,单位操作为两个集合的包含判断与合并。这个算法只能判断由s是否可以得到d,而不能得到由s如何到d。
iwantnon 2010-02-26
  • 打赏
  • 举报
回复
引用 11 楼 canoe982 的回复:
这与穷举法没有多少差别了。

我认为这句话也有问题,因为产生式是有传递关系的,而函数f的作用就是封装了这种传递关系,所以在函数f未知的情况下,这题不可能存在穷举解法。
iwantnon 2010-02-26
  • 打赏
  • 举报
回复
引用楼主 canoe982 的回复:
  可以假定已经存在函数f(s,d),可以判定由s是否可以得到d。当然,若s1是s2的子集,而f(s1,d)=1(表示由s1可以得到d),则f(s2,d)=1。

是你自己说的函数f已知。
canoe982 2010-02-26
  • 打赏
  • 举报
回复
引用 13 楼 iwantnon 的回复:
引用 11 楼 canoe982 的回复:这与穷举法没有多少差别了。
我认为这句话也有问题,因为产生式是有传递关系的,而函数f的作用就是封装了这种传递关系,所以在函数f未知的情况下,这题不可能存在穷举解法。


你对函数f的理解不恰当。对于M中的任何s,f(s,d)的值都是确定的、可知的。所以穷举解法是可以的,只是复杂度太高。
canoe982 2010-02-25
  • 打赏
  • 举报
回复
引用 10 楼 iwantnon 的回复:
其中函数f就是图的邻接矩阵。


这样考虑当然也可以,但复杂度同样很高。设M中有n个元素,将形成有2的n次方个节点的邻接矩阵,这与穷举法没有多少差别了。

不知道是否我的理解有误。
iwantnon 2010-02-25
  • 打赏
  • 举报
回复
其中函数f就是图的邻接矩阵。
iwantnon 2010-02-25
  • 打赏
  • 举报
回复
引用楼主 canoe982 的回复:
  可以假定已经存在函数f(s,d),可以判定由s是否可以得到d。当然,若s1是s2的子集,而f(s1,d)=1(表示由s1可以得到d),则f(s2,d)=1。

我觉得,如果有了f这个函数的话,那么本题就是一个标准的最短路径问题。
canoe982 2010-02-22
  • 打赏
  • 举报
回复
  3楼的表述有些文字错误,由于不能修改,当时没作处理,现在修改后重新帖出来。如果仍觉得不清楚,还望指出具体的不清楚之处。
  设有集合M={A,B,C,D,E,F,G,H,I,J},并有如下一些产生式:
P1({G,I},{F,D})、
P2({H,I},{C,J})、
P3({A,J},{I,E,H})、
P4({F},{B,G})、
P5({H},{A,D})、
P6({A,B},{C,E})、
P7({D},{C,G})
每个产生式形如Pi(s,d),s,d均为M的非空子集,其含义是:如果已知s中的所有元素,就可以推导出d中的任何元素。比如P1的含义是:如果已知G和I,就可以推导出F或D。

  现有某用户希望得到目标ud = {E,I},为此他需要提供一些前提,不妨设为us = {A,C,F,H}。
作为用户,他希望需要提供的前提的代价是最小的。一般来说,us中的每个元素的获取都需要代价,假设得到A的代价为20,C为5,F为11,H为9。 (可认为该用户不能直接获得M-us中的元素)
现在的问题是:
  找到us的一个子集cus,满足:(1)由cus中的元素通过以上的产生式集可推导出ud中的所有元素;(2)若有us的子集cus1也可以推导出ud,则cus1中元素的代价之和不小于cus中元素的代价和。也就是说寻找满足(1)的代价和最小的子集。
  当然,如果由us都不能得到ud,返回不可满足信息即可。
  另外,为了避开产生式推导相关内容,可以假定已经存在函数f(s,d),若f(s,d)=1,表示由s可以得到d,若f(s,d)=0,表示由s不可以得到d,其中s,d均为M的子集。当然,若s1是s2的子集,而f(s1,d)=1(表示由s1可以得到d),则f(s2,d)=1。
canoe982 2010-02-22
  • 打赏
  • 举报
回复
引用 7 楼 haozi8993 的回复:
遍历us,找出所有满足cus条件的子集再比较输出最小代价那个。最简单的算法,估计不是最好的


这当然是最简单的办法,但时间复杂度太高,是指数级别的啊。只有在us中元素比较小(比如小于10时)才有用啊。当然是不希望用这种方法了。

如果做不到最优,近似最优解也是不错的选择。
罗耗子 2010-02-22
  • 打赏
  • 举报
回复
遍历us,找出所有满足cus条件的子集再比较输出最小代价那个。最简单的算法,估计不是最好的
yyq2008 2010-02-21
  • 打赏
  • 举报
回复
还是不够清楚!!!!
canoe982 2010-02-20
  • 打赏
  • 举报
回复
就没有人提供点什么想法吗?还是表述得实在不够清楚?
canoe982 2010-02-19
  • 打赏
  • 举报
回复
UD就是S的子集而已。如果直接取权值最小的那个,怎么能够保证其满足条件(1)?

为了说得列清楚一些,给一个简单具体的例子:
设在集体M={A,B,C,D,E,F,G,H,I,J},并有如下一些产生式:
P1({G,I},{F,D})、
P2({H,I},{C,J})、
P3({A,J},{I,E,H})、
P4({F},{B,G})、
P5({H},{A,D})、
P6({A,B},{C,E})、
P7({D},{C,G})
其中P1的含义是:如果已经G和I,就可以得到F或D。

现有某用户希望得到目标ud = {E,I},为此他需要提供一些前提,不妨设为us = {A,C,F,H}。
用户得到us中的前提是要付出代价的,假设得到A的代价为20,C为5,F为11,H为9。
现在的问题是:找到us的一个子集cus,满足由cus可以由上面的产生式集得到ud,并且cus中所有元素的代价和是最小的。
当然,如果由us都不能得到ud,返回不可满足信息即可。
jlr_6 2010-02-18
  • 打赏
  • 举报
回复
问题描述不清晰
UD究竟有什么特殊含义 仅仅只是S的子集就可以了么?
那干脆直接把US中权值最小的一个拿出来,认为是UD好了

33,008

社区成员

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

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