VF2, VF3算法

本文详细介绍了VF2和VF3两种图同构算法,包括它们的基本定义、整体流程、关键函数及其在处理图匹配问题时的优化策略。VF2算法通过State Space Representation判断同构,VF3在VF2基础上引入节点分类,进一步裁剪搜索空间,提高效率。
摘要由CSDN通过智能技术生成

1. VF2算法

1.1 基本定义和整体流程

  1. 原文An Improved Algorithm for Matching Large Graphs。
  2. VF算法能够解决有向/无向,有标签/无标签,图同构问题。原文中的符号和VF3算法不同,这里对某些符号采用了更为广泛地符号定义。
  3. 给定两个图 G 1 = ( V 1 , E 1 ) G_1=(V_1,E_1) G1=(V1,E1), G 2 = ( V 2 , E 2 ) G_2=(V_2,E_2) G2=(V2,E2)和一个映射 M ⊂ V 1 × V 2 M \subset V_1 \times V_2 MV1×V2, 当且仅当 M M M是一个双射且对应边也是双射时, G 1 G_1 G1 G 2 G_2 G2称为同构。
  4. 作者采用了一种称为State Space Representation (SSR)的方法判断同构。假设当前状态为 s s s,则 M ( s ) M(s) M(s)表示 M M M中与状态 s s s相关的映射的集合。则 M 1 ( s ) M_1(s) M1(s)表示 M ( s ) M(s) M(s)中属于 V 1 V_1 V1中的点构成的集合,同理 M 2 ( s ) M_2(s) M2(s) E 1 ( s ) E_1(s) E1(s)表示 E 1 E_1 E1中连接 M 1 ( s ) M_1(s) M1(s)中点的边,同理 E 2 ( s ) E_2(s) E2(s)
  5. 通过 M 1 ( s ) M_1(s) M1(s) E 1 ( s ) E_1(s) E1(s)我们可以得到 G 1 G_1 G1的子图 G 1 ( s ) G_1(s) G1(s),同理 G 2 ( s ) G_2(s) G2(s)
  6. 算法整体流程如下图所示
    在这里插入图片描述
    其中 F ( s , n , m ) F(s,n,m) F(s,n,m)是一个布尔函数,也称为feasibility function。该函数的返回值如果是true,则表明将边 ( n , m ) (n,m) (n,m)加入到当前状态 s s s s s s状态表示当前的部分映射 M ( s ) M(s) M(s)是满足同构的)后,新状态 s ∗ s^* s的部分映射 M ( s ∗ ) M(s^*) M(s)仍然满足同构。因此最终的状态可能是 G 1 G_1 G1 G 2 G_2 G2同构或者两个图的子图同构。返回值为false,则表明 ( n , m ) (n,m) (n,m)不应该加入到当前状态,能够起到剪枝的作用。

1.2 P ( s ) P(s) P(s)的定义

  1. 给定一个图 G G G和图中的一个点 n n n,我们定义 P r e d ( G , n ) Pred(G,n) Pred(G,n) G G G n n n的入度邻居节点构成的集合( n n n的前继集合),定义 S u c c ( G , n ) Succ(G,n) Succ(G,n) G G G n n n的出度邻居节点构成的集合( n n n的后继集合)。
  2. 我们定义out-terminal集合 T 1 o u t ( s ) T^{out}_1(s) T1out(s) G 1 G_1 G1中不属于 M 1 ( s ) M_1(s) M1(s)但属于 M 1 ( s ) M_1(s) M1(s)中节点的后继节点构成的集合。定义in-terminal集合 T 1 i n ( s ) T^{in}_1(s) T1in(s)为不属于 M 1 ( s ) M_1(s) M1(s)但属于 M 1 ( s ) M_1(s) M1(s)中节点的前继节点构成的集合。同理定义 T 2 o u t ( s ) T^{out}_2(s) T2out(s) T 2 i n ( s ) T^{in}_2(s) T2in(s)
  3. P ( s ) P(s) P(s)采用如下的方式构造:
    (1)如果 T 1 o u t ( s ) T^{out}_1(s) T1out(s) T 2 o u t ( s ) T^{out}_2(s) T2out(s)都不为空,
    P ( s ) = T 1 o u t ( s ) × { m i n   T 2 o u t ( s ) } P(s)=T^{out}_1(s) \times \{min\ T^{out}_2(s)\} P(s)=T1out(s)×{ min T2out(s)}
    m i n   T 2 o u t ( s ) min\ T^{out}_2(s) min T2out(s)表示 T 2 o u t ( s ) T^{out}_2(s) T2out(s)中具有最小label的节点(任意一个排序方法均可)。
    (2)如果 T 1 o u t ( s ) T^{out}_1(s) T1out(s) T 2 o u t ( s ) T^{out}_2(s) T2out(s)都为空,且 T 1 i n ( s ) T^{in}_1(s) T1in(s) T 2 i n ( s ) T^{in}_2(s) T2in(s)均不为空,
    P ( s ) = T 1 i n ( s ) × { m i n   T 2 i n ( s ) } P(s)=T^{in}_1(s) \times \{min\ T^{in}_2(s)\} P(s)=T1in(s)×{ min T2in(s)}
    (3)如果四个terminal集合都是空的,
    P ( s ) = ( V 1 − M 1 ( s ) ) × { m i n   ( V 2 − M 2 ( s ) ) } P(s)=(V_1-M_1(s)) \times \{min\ (V_2-M_2(s))\} P(s)=(V1M1(s))×{ min (V2M2(s))}
  4. 当出现只有一个in-terminal集合或者只有一个out-terminal集合为空的时候,可以证明状态 s s s不可能构造出最终的同构,因此状态 s s s不需要再继续分析。同时 P ( s ) P(s) P(s)的定义可以保证同一个状态不会被访问两次。

1.3 F ( s , n , m ) F(s,n,m) F(s,n,m)的定义

为了判断 F ( s , n , m ) F(s,n,m) F(s,n,m),算法需要检查所有与 n , m n,

  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是NSGA-II算法的Matlab代码示例: ``` % NSGA-II algorithm implementation in Matlab % Author: https://www.github.com/rafitc % Adapted from: https://www.mathworks.com/matlabcentral/fileexchange/19915-nsga-ii-a-multi-objective-optimization-algorithm % Problem definition n = 10; % Number of decision variables m = 2; % Number of objectives lb = zeros(1,n); % Lower bounds ub = ones(1,n); % Upper bounds f1 = @(x) x(1); % Objective 1 f2 = @(x) (1+x(2))/x(1); % Objective 2 f = {f1,f2}; % NSGA-II parameters popSize = 100; % Population size maxGen = 50; % Maximum number of generations pc = 0.8; % Crossover probability nc = 2; % Number of children per crossover pm = 1/n; % Mutation probability nm = round(pm*popSize*n); % Number of mutants eta = 20; % Crossover and mutation distribution index alpha = 0.5; % Crowding distance parameter % Initialize population popDec = lhsdesign(popSize,n); popObj = evaluatePopulation(popDec,f); % NSGA-II main loop for iGen = 1:maxGen % Non-dominated sorting fronts = nonDominatedSorting(popObj); % Crowding distance assignment dist = crowdingDistanceAssignment(popObj,fronts,alpha); % Select parents parents = tournamentSelection(popObj,fronts,dist); % Generate offspring offDec = sbxCrossover(parents,pc,nc,lb,ub,eta); offDec = polynomialMutation(offDec,pm,lb,ub,eta); % Evaluate offspring offObj = evaluatePopulation(offDec,f); % Merge parent and offspring populations dec = [popDec;offDec]; obj = [popObj;offObj]; % Non-dominated sorting of merged population fronts = nonDominatedSorting(obj); % Crowding distance assignment of merged population dist = crowdingDistanceAssignment(obj,fronts,alpha); % Select new population popDec = []; popObj = []; iFront = 1; while(length(popObj) + length(fronts{iFront}) <= popSize) % Fill up population with fronts popDec = [popDec;dec(fronts{iFront},:)]; popObj = [popObj;obj(fronts{iFront},:)]; iFront = iFront + 1; end if(length(popObj) < popSize) % Fill up remaining population with individuals from last front lastFront = fronts{iFront}; [~,rank] = sort(dist(lastFront),'descend'); popDec = [popDec;dec(lastFront(rank(1:popSize-length(popObj))),:)]; popObj = [popObj;obj(lastFront(rank(1:popSize-length(popObj))),:)]; end % Display progress disp(['Generation ' num2str(iGen) ': hypervolume = ' num2str(hypervolume(popObj,[0 0]))]) end % Plot final population scatter(popObj(:,1),popObj(:,2),20,'k','filled') xlabel('Objective 1') ylabel('Objective 2') title('NSGA-II') ``` 注意,此代码中的许多函数都需要自己实现。但是,这个代码示例可以让您了解NSGA-II算法实现的主要步骤。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值