Ya que he resuelto el otro problema vinculado, he pensado que podría probar con el recocido simulado.
La respuesta también es sí; de hecho, aquí podemos encontrar $3$ copias disjuntas de $2K_{3,3} \cup (K_{5,5} - P_{10})$ . Añadí la arista extra para intentar que el problema fuera un poco más limitado y que la solución fuera más bonita, pero no estoy seguro del efecto que tuvo.
La solución que he encontrado está más abajo:
Aquí está mi código de recocido simulado (puede tomar algunos intentos antes de encontrar una solución de energía cero):
edges[{perm1_, perm2_}] :=
Join[
Tuples[{perm1[[1 ;; 3]], perm2[[1 ;; 3]]}],
Tuples[{perm1[[4 ;; 6]], perm2[[4 ;; 6]]}],
Complement[
Tuples[{perm1[[7 ;; 11]], perm2[[7 ;; 11]]}],
Table[{perm1[[i]], perm2[[i]]}, {i, 7, 11}],
Table[{perm1[[i]], perm2[[i + 1]]}, {i, 7, 10}]]];
value[state_] := 102 - Length[Union @@ (edges /@ state)];
randomPerm[] := {RandomSample[Range[11]], RandomSample[Range[11]]}
newState[] := {{Range[11], Range[11]}, randomPerm[], randomPerm[]};
randomSwitch[state_] :=
Module[{h = RandomInteger[{2, 3}], i = RandomInteger[{1, 2}], j, k,
copy = state},
{j, k} = RandomSample[Range[11], 2];
copy[[h, i, {j, k}]] = Reverse[copy[[h, i, {j, k}]]];
Return[copy];
]
currentState = bestState = newState[];
currentEnergy = bestEnergy = value[currentState];
temp = 1;
While[Exp[-1/temp] > 1/1000,
Do[
nextState = randomSwitch[currentState];
nextEnergy = value[nextState];
If[nextEnergy < bestEnergy, bestState = nextState;
bestEnergy = nextEnergy];
prob = Exp[-((nextEnergy - currentEnergy)/temp)];
If[RandomReal[] < prob, currentState = nextState;
currentEnergy = nextEnergy];
, {3000}];
If[bestEnergy == 0, Break[]];
temp *= 0.99; Print[{temp, currentEnergy}]
]
Print["Done ", bestEnergy];