(*松弛测试子程序*)
test[m0_, pts0_, r0_] := Module[{r = r0, m = m0, pts = pts0, sq = {}},
While[pts != {} \[And] m > 0,
AppendTo[sq, pts[[1]]];
mf = RegionMember[Rectangle[pts[[1]] - r, pts[[1]] + r]];
pts = Select[pts, False == mf[#] &]; m--]; If[pts != {}, {}, sq]];
mcenter[p0_, m0_] :=
Module[{p = p0, m = m0, right, left, i, sq = {}, d, x, y, n},
(*初始化*)
n = Length[p]; left = 1; right = (n (n - 1))/2; x = p[[All, 1]];
y = p[[All, 2]]; p = SortBy[p, First];
(*计算直线距离*)
d = Sort@
Flatten@Table[
Max[Abs[x[[i]] - x[[j]]], Abs[y[[i]] - y[[j]]]], {i, 1,
n - 1}, {j, i + 1, n}];
(*最优近似算法*)
While[right != left + 1,
(*二分查找*)
i = IntegerPart[(left + right)/2];
If[test[m, p, d[[i]]] != {}, right = i, left = i];];
(*找到方形边长的最优解*)
sq = test[m, p, d[[right]]];
(*打印覆盖图形*)
Print@Graphics[
Flatten@{Point[p], EdgeForm[Thin], Opacity[0],
Table[{Rectangle[sq[[i]] - d[[right]],
sq[[i]] + d[[right]]]}, {i, 1, Length@sq}]}];
(*打印方形边长最优解*)
Print@d[[right]];
(*打印最优近似解的中心点集*)
Print@sq]
不容易啊,用了一个星期
2018年11月11日 14点11分
6