最近在做个课题(本科),直线m中心问题
mathematica吧
全部回复
仅看楼主
level 6
这个问题的名字一点都不形象,问题是这样的:
平面上有n个点,需要用m个正方形去覆盖它们,n和m均为定值,正方形边长最小为最优解,正方形的边或垂直或平行于直角坐标轴。
虽然在《算法设计与分析导论》中有介绍它的最优近似算法(这是个NP问题,最优的近似算法只能达到最优解的两倍或二分之一),实现起来不难,但我想知道mathematica中有没有解决这个问题的比较好的函数。
2018年10月24日 13点10分 1
吧务
level 15
……直接搜 直线m中心问题 甚至找不到相关资料。
如果知道该问题的英文名的话可能会好办点。
2018年11月03日 08点11分 2
能找到《算法设计与分析导论》,仿佛全世界只有这本书提到了这个问题
2018年11月03日 16点11分
英文名是 rectilinear m-center problem
2018年11月03日 16点11分
level 6
补几张书上的图吧,我还以为你们能找到这本书呢
2018年11月03日 16点11分 3
level 6
(*松弛测试子程序*)
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
1