表現:
24個の要素があります。この要素にAからX(最初の24文字)の名前を付けます。これらの各要素は、4つのグラフのいずれかに配置されます。1から24までの4つのグラフの24ノードに番号を割り当てます。
Aの位置を24-uple=(xA1、xA2 ...、xA24)で識別し、たとえばノード番号8にAを割り当てたい場合は、(xa1、Xa2..xa24)と記述します。 =(0,0,0,0,0,0,0,1,0,0 ... 0)、ここで1は位置8にあります。
A =(xa1、... xa24)と言えます
e1 ... e24は、(1,0 ... 0)から(0,0 ... 1)までの単位ベクトルです。
演算子'。'についての注意:
- A.e1 = xa1
- ..。
- X.e24 = Xx24
A、... Xには、次の表記法でいくつかの制約があります。
Xiiは{0,1}にあり、
Sum(Xai)= 1 ... Sum(Xxi)= 1
Sum(Xa1、xb1、... Xx1)= 1 ... Sum(Xa24、Xb24、... Xx24)= 1
1つの要素を1つのノードにのみ割り当てることができるため。
各ノードの隣接関係を定義することによってグラフを定義します。たとえば、ノード8に隣接ノード7とノード10があるとします。
たとえば、AとBがノード8のネイバーであることを確認するには、次のようにします。
A.e8=1およびB.e7またはB.e10=1の場合、A.e8 *(B.e7 + B.e10)==1が必要です。
関数isNeighborInGraphs(A、B)で、すべてのノードについてテストし、近傍に応じて1または0を取得します。
表記:
- 6ノードの4つのグラフ、各要素の位置は1〜24の整数で定義されます(最初のグラフの場合は1〜6など)。
- e1 ... e24は、(1,0,0 ... 0)から(0,0 ... 1)までの単位ベクトルです。
- A、B...XをN個の要素とします。
A =(0,0 ...、1、...、0)=(xa1、xa2 ... xa24)
B=..。
..。
X =(0,0 ...、1、...、0)
IsNeigborInGraphs(A、B)= A.e1 * B.e2 + ... //例として、1と2が1つのグラフの隣人である場合
L(A)= [B、B、C、E、G ...] // Aのネイバーのリスト(繰り返すことができます)
actualise(L(A)):
for element in [B,X]
if IsNeigbotInGraphs(A,Element)
L(A).append(Element)
endIf
endfor
N(A)= len(L(A))+ Sum(IsneigborInGraph(A、i)、i in L(A))
..。
N(X)=..。
アルゴリズムの説明
- 初期位置から開始A=e1 ... X = e24
- L(A)、L(B)を実現... L(X)
- これを解きます(ソルバーを使用すると、非線形最適化の問題であるため、例のアンプが機能すると思います):
目的関数
min(Sum(N(Z)、Z = AからX)
制約:
Sum(Xai)= 1 ... Sum(Xxi)= 1
Sum(Xa1、xb1、... Xx1)= 1 ... Sum(Xa24、Xb24、... Xx24)= 1
あなたは最高の解決策を手に入れます
4.手順2と3をさらに3回繰り返します。