V = 1:3
E = 2
C = nchoosek(V,E)
この方法も良いかなと思ったのですが、7頂点の内から何個取って繋ぐかを機械的に判断する事は難しいと思いました。網羅的にするなら隣接行列で指定した方が簡単に実装できそうだと思いました。
graph関数によるグラフの定義方法は大きく分けて「始点と終点の指定」と「隣接行列の指定」の2種類あります。私は「隣接行列の指定」を選び、対角成分(ループ)を除く上三角部に1(辺有り)と0(辺無し)の組み合わせを網羅しグラフを定義しました。
連結グラフの判定アルゴリズムは大変ですが、グラフの連結要素を返すMATLAB関数を使いました。全て同じ所属の要素なら連結グラフであると判定します。
nd = 7; % 頂点の数
eg = nd*(nd-1)/2; % 辺の最大数
egs = dec2bin(0:2^eg-1)-'0'; % 辺の有無組み合わせ
tri = find(triu(ones(nd),1)); % 隣接行列の上三角部のインデックス
adj = zeros(nd); % 隣接行列の初期化
for i = 1:2^eg % 辺の有無組み合わせ数分だけ繰り返す
adj(tri) = egs(i,:); % 隣接行列の上三角部を入れ替え
G = graph(adj,'upper'); % グラフの定義
if(all(~diff(conncomp(G)))) % 連結グラフだったら
plot(G); % 描画する
drawnow;
end
end
あとはサブプロットに並べて表示する方法でしょうか(多すぎて全部の表示は困難。ラベル無しでも連結グラフの総数は7ノードで853。Number of Graphs on n unlabelled vertices (yorku.ca))
更に、コメントに頂いたラベル無しグラフの組み合わせも良い方法が無いか探してみます。
下記条件のグラフと認識しています(○×は対応状況)
○ 無向グラフ:辺が向きを持たないグラフ(有向グラフと比較して組み合わせ数が少ない)
○ 単純グラフ:多重辺やループを持たないグラフ(多重辺やループを持つと組み合わせ数が発散する)
○ 連結グラフ:任意の2頂点間が連結されたグラフ(全組み合わせと比較して組み合わせ数が少ない)
× ラベル無グラフ:ノードを特定しないグラフ(ラベル有グラフと比較して組み合わせ数が少ない)