表述:
你有24个元素,我将这些元素从A到X(前24个字母)命名。每个元素将在4个图表中占据一个位置。我将为4个图表的24个节点分配一个编号,从1到24。
我将通过24元组=(xA1,xA2...,xA24)来确定A的位置,如果我想将A分配给节点号码8,例如,我将写成(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、...X有一些约束条件,使用这些符号:
Xii位于{0,1}中
和
Sum(Xai)=1 ... Sum(Xxi)=1
Sum(Xa1,xb1,...Xx1)=1 ... Sum(Xa24,Xb24,... Xx24)=1
因为一个元素只能被分配到一个节点。
我将通过定义每个节点的邻居关系来定义一个图形,比如说节点8有邻居节点7和节点10
要检查A和B是否是节点8的邻居,例如我需要:
A.e8=1 and B.e7 or B.e10 =1,然后我只需要A.e8*(B.e7+B.e10)==1
在函数isNeighborInGraphs(A,B)中,我测试每个节点,并根据邻居关系得到1或0。
符号:
- 4个图形,每个图形有6个节点,每个元素的位置由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在一个图形中是邻居
例如
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)
- 解决以下问题(使用求解器,例如AMPL,因为它是非线性优化问题):
目标函数
min(Sum(N(Z),Z=A to X)
约束条件:
Sum(Xai)=1 ... Sum(Xxi)=1
Sum(Xa1,xb1,...Xx1)=1 ...
Sum(Xa24,Xb24,... Xx24)=1
获得最佳解
4.重复步骤2和3,再进行3次。