我在2D城堡防御上编程,今天我遇到了一个问题,我无法找到一个好的解决方案。见下图:
我想找到最接近的位置,将红色矩形放在这个矩形区域中而不重叠任何矩形。通过最接近的位置,我指的是最接近当前鼠标位置的位置,因此通常是与任何给定点最接近的位置。
该问题的正确算法是什么?
感谢!!!
答案 0 :(得分:0)
这是一个优化问题,你的约束是线性的,你的目标函数是(分段)二次或线性的,这取决于你想要如何定义光标的距离。
假设矩形是由...定义的
x_i, y_i, w_i, h_i for i=1..n
并且红色矩形的大小为w, h
,决策变量为红色矩形的x, y
位置。
然后是非重叠约束:
所有x >= x_i + w_i
的 y >= y_i + h_i
或x <= x_i - w
或y <= y_i - h
或i=1..n
您可以通过多种方式定义目标(红色矩形与光标的距离):
然后,您可以使用quadratic programming solver或MILP(混合整数线性编程)解算器来查找答案。如果矩形的数量不是太大(比如不到一百),那么即使使用GLPK或LP Solve等免费解算器,它也会非常快。
请注意,要正确表达这些求解器的约束,您可能必须转换约束和目标,例如使用big M method作为约束,或transform将问题转换为线性目标。这意味着你将有额外的二进制变量,以及一些更多的约束(附加变量和约束的数量将与矩形的数量成比例)。