给定一个圆的列表,输出包含最小矩形的区域


28

将为您提供半径列表,您必须输出它们都将适合的最小矩形区域。

例如,给定列表,[5,3,1.5]您将输出157.460

这是图像:

宽度为15.7460,高度为10,因此面积为157.460

规则:

  • 您可以通过stdin或function参数获取列表,通过stdout或function return输出答案。

  • 半径最多有2个小数位。

  • 该列表的长度在2到6之间。

  • 输出应精确到小数点后3位或更多。

  • 如果需要,π= 3.1416。

测试用例:

  • [5,3,1.5] = 157.460

  • [9,4,8,2] = 733.431- 在这里工作

  • [18,3,1] = 1296.000

以字节为单位的最短代码获胜。



1
我没有看到客观的获胜标准
Maltysen '16

这是我们最核心的规则之一
Maltysen

2
@Tim大多数都是代码高尔夫球,目的是以最少的字节进行编码。我认为这将是一个很好的代码挑战,因为它具有确切的规格。
xnor

我建议摆脱“四舍五入不被截断”的条件,因为它是任务的外围,有些语言可以做到这一点,而另一些语言则需要额外的编码才能实现。我不确定您是否希望输出3个以上的小数位还可以,但是我建议也允许它。
xnor

Answers:


16

Python 2 + PySCIPOpt,267字节

from pyscipopt import*
R=input()
m=Model()
V,C=m.addVar,m.addCons
a,b,c=V(),V(),V()
m.setObjective(c)
C(a*b<=c)
P=[]
for r in R:
 x,y=V(),V();C(r<=x);C(x<=a-r);C(r<=y);C(y<=b-r)
 for u,v,s in P:C((x-u)**2+(y-v)**2>=(r+s)**2)
 P+=(x,y,r),
m.optimize()
m.printBestSol()

怎么运行的

我们将问题写成如下:在变量abcx 1y 1,…,x ny n上最小化c,其中

  • ABÇ ;
  • ř X - - [R - [R ÿ b - ÿ ,1≤ Ñ ;
  • x ix j2 +(y - Ÿ Ĵ 2 ≥( - [R + ř Ĵ 2,1≤ Ĵ < Ñ

显然,我们在这些约束条件上使用了外部优化库,但您不能仅将它们提供给任何旧的优化程序,甚至Mathematica NMinimize对于这些微小的测试用例都会陷入局部最小值。如果密切注视约束,您会发现它们构成了一个二次约束二次程序,并且发现非凸QCQP的全局最优是NP难的。因此,我们需要一些难以置信的强大魔力。我选择了工业强度求解器SCIP,这是我可以找到的唯一的全球QCQP求解器,它具有免费的学术使用许可。幸运的是,它具有一些非常不错的Python绑定。

输入输出

在stdin上传递半径列表,例如[5,3,1.5]。输出显示objective value:的矩形区域,x1x2矩形尺寸,x3再次矩形区域,x4x5第一圆心坐标,x6x7第二圆心坐标等

测试用例

[5,3,1.5]157.459666673757

5,3,1.5

SCIP Status        : problem is solved [optimal solution found]
Solving Time (sec) : 0.04
Solving Nodes      : 187
Primal Bound       : +1.57459666673757e+02 (9 solutions)
Dual Bound         : +1.57459666673757e+02
Gap                : 0.00 %
objective value:                     157.459666673757
x1                                                 10   (obj:0)
x2                                   15.7459666673757   (obj:0)
x3                                   157.459666673757   (obj:1)
x4                                                  5   (obj:0)
x5                                                  5   (obj:0)
x6                                                  7   (obj:0)
x7                                   12.7459666673757   (obj:0)
x8                                                1.5   (obj:0)
x9                                   10.4972522849871   (obj:0)

[9,4,8,2]709.061485909243

这比OP的解决方案更好。确切尺寸为18 x 29 +6√3。

9,4,8​​,2

SCIP Status        : problem is solved [optimal solution found]
Solving Time (sec) : 1.07
Solving Nodes      : 4650
Primal Bound       : +7.09061485909243e+02 (6 solutions)
Dual Bound         : +7.09061485909243e+02
Gap                : 0.00 %
objective value:                     709.061485909243
x1                                                 18   (obj:0)
x2                                   39.3923047727357   (obj:0)
x3                                   709.061485909243   (obj:1)
x4                                                  9   (obj:0)
x5                                   30.3923047727357   (obj:0)
x6                                                 14   (obj:0)
x7                                   18.3923048064677   (obj:0)
x8                                                  8   (obj:0)
x9                                                  8   (obj:0)
x10                                                 2   (obj:0)
x11                                  19.6154311552252   (obj:0)

[18,3,1]1295.999999999

18、3、1

SCIP Status        : problem is solved [optimal solution found]
Solving Time (sec) : 0.00
Solving Nodes      : 13
Primal Bound       : +1.29599999999900e+03 (4 solutions)
Dual Bound         : +1.29599999999900e+03
Gap                : 0.00 %
objective value:                       1295.999999999
x1                                   35.9999999999722   (obj:0)
x2                                                 36   (obj:0)
x3                                     1295.999999999   (obj:1)
x4                                   17.9999999999722   (obj:0)
x5                                                 18   (obj:0)
x6                                   32.8552571627738   (obj:0)
x7                                                  3   (obj:0)
x8                                                  1   (obj:0)
x9                                                  1   (obj:0)

奖金案

[1,2,3,4,5]230.244214912998

1,2,3,4,5

SCIP Status        : problem is solved [optimal solution found]
Solving Time (sec) : 401.31
Solving Nodes      : 1400341
Primal Bound       : +2.30244214912998e+02 (16 solutions)
Dual Bound         : +2.30244214912998e+02
Gap                : 0.00 %
objective value:                     230.244214912998
x1                                   13.9282031800476   (obj:0)
x2                                    16.530790960676   (obj:0)
x3                                   230.244214912998   (obj:1)
x4                                                  1   (obj:0)
x5                                   9.60188492354373   (obj:0)
x6                                    11.757778088743   (obj:0)
x7                                   3.17450418828415   (obj:0)
x8                                                  3   (obj:0)
x9                                    13.530790960676   (obj:0)
x10                                  9.92820318004764   (obj:0)
x11                                   12.530790960676   (obj:0)
x12                                                 5   (obj:0)
x13                                                 5   (obj:0)

[3,4,5,6,7]553.918025310597

3,4,5,6,7

SCIP Status        : problem is solved [optimal solution found]
Solving Time (sec) : 90.28
Solving Nodes      : 248281
Primal Bound       : +5.53918025310597e+02 (18 solutions)
Dual Bound         : +5.53918025310597e+02
Gap                : 0.00 %
objective value:                     553.918025310597
x1                                   21.9544511351279   (obj:0)
x2                                   25.2303290086403   (obj:0)
x3                                   553.918025310597   (obj:1)
x4                                                  3   (obj:0)
x5                                   14.4852813557912   (obj:0)
x6                                   4.87198593295855   (obj:0)
x7                                   21.2303290086403   (obj:0)
x8                                   16.9544511351279   (obj:0)
x9                                                  5   (obj:0)
x10                                                 6   (obj:0)
x11                                                 6   (obj:0)
x12                                  14.9544511351279   (obj:0)
x13                                  16.8321595389753   (obj:0)

[3,4,5,6,7,8]777.87455544487

3,4,5,6,7,8

SCIP Status        : problem is solved [optimal solution found]
Solving Time (sec) : 218.29
Solving Nodes      : 551316
Primal Bound       : +7.77874555444870e+02 (29 solutions)
Dual Bound         : +7.77874555444870e+02
Gap                : 0.00 %
objective value:                      777.87455544487
x1                                   29.9626413867546   (obj:0)
x2                                   25.9614813640722   (obj:0)
x3                                    777.87455544487   (obj:1)
x4                                   13.7325948669477   (obj:0)
x5                                   15.3563780595534   (obj:0)
x6                                   16.0504838821134   (obj:0)
x7                                   21.9614813640722   (obj:0)
x8                                   24.9626413867546   (obj:0)
x9                                   20.7071098175984   (obj:0)
x10                                                 6   (obj:0)
x11                                  19.9614813640722   (obj:0)
x12                                                 7   (obj:0)
x13                                                 7   (obj:0)
x14                                  21.9626413867546   (obj:0)
x15                                  8.05799919177801   (obj:0)

遗憾的是最后一个给出了一些舍入错误,但效果很好!
蒂姆(Tim)

在我看来,[1,2,3,4,5]可以通过使半径3和半径5的圆也同时接触,然后将半径4 /半径5顺时针旋转一点来改善(半径1的圆必须。移出的方式,但有大量的死空间,无论我的直觉和我的计算表明,一个长而薄的矩形可以有效遏制半径4 /半径5圈多平方的。
等级河圣

@LevelRiverSt我不同意。将3向上移动到5会向右推4(从5逆时针),而不是向左移动(从5逆时针)。我程序的配置为(7 +4√3)×(9 +√(29 +16√3))≈13.9282×16.5308≈230.244,而您建议的配置为(30 +15√3)/ 4×(36 + 3 √5+6√15)/ 4≈13.9952×16.4865≈230.732。
Anders Kaseorg '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.