答案更新,12/22:
使用peter shor的observation在立方体上的不同部分和对象排列之间存在同态,通过将一组立方体对称表示为对称组的子组[8]列出所有此类排列,并使用组元素/排列,使用mathematica的sat解算器找到质心分配,选择具有不同奇异值、很少更多细节和完整代码的点集here
问题
一个有趣的2d截面是一个平面,它穿过一个规则3dsimplex的中心和另外两个点,每个点都是一些非空顶点子集的质心。它由两个顶点子集定义。例如{1},{1,2}给出了一个由三个点定义的平面——四面体的中心、第一个顶点以及第一个和第二个顶点的平均值。
一组有趣的截面是在顶点重标线下没有两个截面定义同一平面的集合。例如,集合{{1},{2},{{3},{4}就不有趣了。有没有一种有效的方法来找到一组有趣的部分?我需要一些东西,可以推广到一个类似的问题,为三维截面的7D单纯形,并完成一夜。
我尝试的方法如下。一个问题是,如果忽略几何体,一些等价的部分将被保留,所以我得到10个部分,而不是3个。一个更大的问题是我使用了蛮力,它绝对不可伸缩(需要10^17比较7D单纯形)
(来源:yaroslavvb.com)
下面是生成上面图片的Mathematica代码。
entropy[vec_] := Total[Table[p Log[p], {p, vec}]];
hadamard = KroneckerProduct @@ Table[{{1, 1}, {1, -1}}, {2}];
(* rows of hadamard matrix give simplex vertex coordinates *)
vertices = hadamard;
invHad = Inverse[hadamard];
m = {m1, m2, m3, m4};
vs = Range[4];
(* take a set of vertex averages, generate all combinations arising \
from labeling of vertices *)
vertexPermutations[set_] := (
newSets = set /. Thread[vs -> #] & /@ Permutations[vs];
Map[Sort, newSets, {2}]
);
(* anchors used to define a section plane *)
sectionAnchors = Subsets[{1, 2, 3, 4}, {1, 3}];
(* all sets of anchor combinations with centroid anchor always \
included *)
anchorSets = Subsets[sectionAnchors, {2}];
anchorSets = Prepend[#, {1, 2, 3, 4}] & /@ anchorSets;
anchorSets = Map[Sort, anchorSets, {2}];
setEquivalent[set1_, set2_] := MemberQ[vertexPermutations[set1], set2];
equivalenceMatrix =
Table[Boole[setEquivalent[set1, set2]], {set1, anchorSets}, {set2,
anchorSets}];
Needs["GraphUtilities`"];
(* Representatives of "vertex-relabeling" equivalence classes of \
ancher sets *)
reps = First /@ StrongComponents[equivalenceMatrix];
average[verts_] := Total[vertices[[#]] & /@ verts]/Length[verts];
makeSection2D[vars_, {p0_, p1_, p2_}] := Module[{},
v1 = p1 - p0 // Normalize;
v2 = p2 - p0;
v2 = v2 - (v1.v2) v1 // Normalize;
Thread[vars -> (p0 + v1 x + v2 y)]
];
plotSection2D[f_, pointset_] := (
simplex =
Graphics3D[{Yellow, Opacity[.2],
GraphicsComplex[Transpose@Rest@hadamard,
Polygon[Subsets[{1, 2, 3, 4}, {3}]]]}];
anchors = average /@ pointset;
section = makeSection2D[m, anchors];
rf = Function @@ ({{x, y, z, u, v},
And @@ Thread[invHad.{1, x, y, z} > 0]});
mf = Function @@ {{p1, p2, p3, x, y}, f[invHad.m /. section]};
sectionPlot =
ParametricPlot3D @@ {Rest[m] /. section, {x, -3, 3}, {y, -3, 3},
RegionFunction -> rf, MeshFunctions -> {mf}};
anchorPlot = Graphics3D[Sphere[Rest[#], .05] & /@ anchors];
Show[simplex, sectionPlot, anchorPlot]
);
plots = Table[
plotSection2D[entropy, anchorSets[[rep]]], {rep, reps}];
GraphicsGrid[Partition[plots, 3]]
最佳答案
正确的编程解决方案概括如下:
观察中心是以射影对的形式出现的——所以识别并只保留中心集合中一个或另一个半球覆盖物中的一半。对是彼此的集合互补。一个例子规则:包含顶点1的所有子集,以及那些在“赤道”上的子集,那些包含顶点2的子集,那些在集合的“赤道”上的子集,那些包含顶点3的子集,等等,递归地保持边界的一半与最小的索引顶点相邻。
请注意,对于每个子样本,子样本要么与顶点1相邻,要么与单纯形相距1。(原因:四面体中的每个新顶点都附加到四面体的每个前一个顶点上——因此,每个子样点要么入射到顶点1上,要么顶点1连接到单纯形中的每个顶点。)因此,每种子样点只有两个总体(相对于指定顶点)。(我们可以用只保留每个射影对的较小成员的决定来代替这个观察,但是标记顶点的规则更加复杂。)
四面体在顶点标号置换下是完全对称的。因此,任何“有趣的部分”都等同于另一个只包含顶点前段的部分,即可以在某些n的顶点范围[1,n]中识别。
综上所述,我们发现有一个从有趣的部分到一组图的满射。对于每个图,我们必须枚举一致的顶点成员关系(稍后描述)。除了一个顶点,图的顶点是成对的
该对包含给定基数的所有中心(给定维度的所有子模板)。
该对的一个成员包含入射到顶点1的中心。
对的另一个成员包含不在顶点1上的中心。
特殊顶点是包含所有顶点的中心或其投影对(“空中心”)。
如果一个图包含一对图的任何成员,它必须(至少)包含与1相关的包含中心的成员(或者可以重新标记顶点以使其如此)。
图的边是加权的。权重是两个中心共享的顶点数。根据每端中心的基数以及两个顶点是第一个成员还是第二个成员,或者是每一个成员中的一个,对权重有限制。(“例如,其中一个”不能共享顶点1。)
图是顶点集上包含特殊顶点的完整子图。例如,对于四面体,一个图是上面标识的顶点集上的k{3},其中一个顶点是特殊的,并且具有边权。
一个部分是一个图,在每一条边的末端的中心有一个一致的标签应用(即一致的标签,以尊重由边的权重表示的共享顶点的数量,并且一组图顶点中的每个子集包含顶点1)。因此,给定的图可以表示多个部分(通过不同的标线)。(没有听起来那么多的选择,好像一秒钟内就有意义了。)
如果由中心坐标构成的矩阵的行列式为零,则截面就不有趣了。
在三维情况下,有四个顶点,我们得到以下集合(我们使用短投影对,因为在这个例子中有足够的可见性,不需要更简单的顶点标记拒绝规则):
0:投影对{1,2,3,4}
1:{1}
1':{2},{3},{4}
2:{1,2},{1,3},{1,4}
2':投射对到2(因此省略)
3:投射对到1'(省略)
3':投射对到1(因此省略)
标签约束:
{0->x,x}
{0->x',x}
{1->1,1}——不允许:中心不包含两次
{1->1',0}
{1->2,1}
{2->2,1}
这些图顶点不可能有其他权重。
图是0上的k{3}事件,以下图在图选择规则下生存:
答:{0->1,1},{0->1',1},{1->1',0}
B:{0->2,2},{0->2,2},{2->2,1}
a只有一个标签:{1},{2},{},并且是三角形的有趣集合。这个标签没有零行列式。
b只有一个标签:{1,2},{1,3},{},这是一个有趣的正方形集合。这个标签没有零行列式。
转换成代码是留给读者的练习(因为我必须离开工作)。