生活随笔
收集整理的這篇文章主要介紹了
最大团问题-分支界限法
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
最大團(tuán)問(wèn)題-分支界限法
遍歷所有點(diǎn)構(gòu)造二叉樹(shù);
廣度遍歷樹(shù),遍歷過(guò)程中判斷當(dāng)前結(jié)點(diǎn)的點(diǎn)數(shù)據(jù)時(shí),是否構(gòu)成完全子圖,如果不能則只將右結(jié)點(diǎn)加入隊(duì)列,每次選取隊(duì)列中完全子圖最大的結(jié)點(diǎn)作為活結(jié)點(diǎn),無(wú)子結(jié)點(diǎn)時(shí)到達(dá)葉子結(jié)點(diǎn),記錄為一個(gè)完全子圖,優(yōu)先隊(duì)列法中第一個(gè)完全子圖即為最優(yōu)解。
package?test;import?java.util.*;/***?Created?by?saishangmingzhu?on?2018/12/10.*?最大團(tuán)問(wèn)題*/
public?class?MaximumCliqueProblem?{//圖private?int[][]?pointIndex=new?int[][]{{1,1,0,1,1},{1,1,1,0,1},{0,1,1,0,1},{1,0,0,1,1},{1,1,1,1,1}};public?static?void?main(String[]?arg){new?MaximumCliqueProblem().branchAndBoundMethod();}/***?分支界限法-優(yōu)先隊(duì)列式*?優(yōu)先隊(duì)列式求解時(shí),到達(dá)第一個(gè)沒(méi)有子結(jié)點(diǎn)的活結(jié)點(diǎn)時(shí),即為最優(yōu)解*/public?void?branchAndBoundMethod()?{List<Point>?pointList=new?ArrayList<>();pointList.add(new?Point("1",0));pointList.add(new?Point("2",1));pointList.add(new?Point("3",2));pointList.add(new?Point("4",3));pointList.add(new?Point("5",4));//【1】構(gòu)建樹(shù)Node?root=new?Node();createTree(pointList,?root,0);//【2】廣度遍歷List<Node>?currentLiveNodeList=new?ArrayList<>();currentLiveNodeList.add(root);while?(true)?{//排序Node?parent?=?currentLiveNodeList.get(0);if?(parent.leftNode==null){//表示到了葉子結(jié)點(diǎn),進(jìn)行記錄//點(diǎn)不算子圖,所以要去除點(diǎn)集為1的葉子break;}List<Point>?leftPointList?=?parent.leftNode.hasPointList;if?(judge(leftPointList)?!=?0)?{currentLiveNodeList.add(parent.leftNode);}//因?yàn)橛医Y(jié)點(diǎn)是空,所以不需要判斷//List<Point>?rightPointList=parent.rightNode.hasPointList;currentLiveNodeList.add(parent.rightNode);currentLiveNodeList.remove(parent);Collections.sort(currentLiveNodeList,?new?Comparator<Node>()?{@Overridepublic?int?compare(Node?o1,?Node?o2)?{return?o2.hasPointList.size()-o1.hasPointList.size();}});}System.out.println("最大團(tuán)");for?(Point?point:currentLiveNodeList.get(0).hasPointList){System.out.print(point.name+",");}}/***?判斷現(xiàn)有節(jié)點(diǎn)是否是完全子圖?-1?表示不是*?@param?pointList*?@return*/private?int?judge(List<Point>?pointList){for?(int?i=0;i<pointList.size();i++){Point?pointi=pointList.get(i);int?indexi=pointi.index;for?(int?j=i+1;j<pointList.size();j++){Point?pointj=pointList.get(j);int?indexj=pointj.index;//使用[indexi][indexj]是為了說(shuō)明問(wèn)題,可以直接使用[i][j]if?(pointIndex[indexi][indexj]!=1){return?0;}}}return?1;}private?void?createTree(List<Point>?pointList,?Node?parent,int?i)?{if?(i>=pointList.size()){return;}Node?leftNode=new?Node();leftNode.hasPointList.addAll(parent.hasPointList);leftNode.hasPointList.add(pointList.get(i));i++;createTree(pointList,leftNode,i);parent.leftNode=leftNode;Node?rightNode=new?Node();rightNode.hasPointList.addAll(parent.hasPointList);createTree(pointList,rightNode,i);parent.rightNode=rightNode;}class?Point{private?String?name;private?int?index;public?Point(String?name,int?index)?{this.name?=?name;this.index?=?index;}}class?Node{private?Node?leftNode;private?Node?rightNode;private?List<Point>?hasPointList=new?ArrayList<>();}
}
轉(zhuǎn)載于:https://blog.51cto.com/zuohao1990/2328591
總結(jié)
以上是生活随笔為你收集整理的最大团问题-分支界限法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。