闲论排样/排料算法(nesting)

http://blog.csdn.net/nestingchina/article/details/5484325


之所以是闲论,主要是我不想长篇大论,而且还要引证、提供文献出处,实在繁琐。

    在我看来,这类算法主要分成三个层次。

    这三个层次分别是底层几何算法、排样策略、优化算法。

    底层的几何算法是指多边形之间的位置、距离这类的算法,这看起来好像比较简单,但是纵览这几十年的文献资料,可以发现由于排料策略和优化算法的不同,衍生出很多替代或者变相的多边形位置、距离等算法。比如以多边形重叠面积来衡量多边形之间的关系,或者是多边形互相“侵入”的某个方向的长度来表达多边形之间的关系,有人会问,排样不是不允许重叠吗?这个后面会说到。  还有NFP算法,NFP算法不仅让多边形之间的位置判断更加快速,也提供了更多的排料策略选择。

    排料策略分两大类。一类是初始解是可行解。另一类是初始解可接受不可行解。最直观的看不可行解就是有重叠的。整个策略和算法会慢慢移除重叠,当然移除方法依据都有很多种类。  对于第一类的排样策略,很好理解,比如传统的左底排放策略,虽然它不是很有效,但也算是种策略,影响了国内的众多研究者^_^.    看看第二类的排样策略,现在我们就能理解为什么需要计算多边形的重叠关系了,它是多边形移动方向和移动距离大小的依据。这个时候NFP算法也常能带来很好的效果。

    优化算法这个层次相对来说影响并不大---这是仅对于第一类排样策略。 因为第一类排样策略大部分是基于调序优化的,对于这种转化为组合优化的问题,实际上各类智能优化算法比如模拟退火、遗传算法等之间并没有很多差别。  而对于第二来排样策略来说,更多的会采用传统优化算法(线性和非线性规划)和智能优化相结合的办法。

     国内的研究较之国外整体要落后10-20年。我看过很多的硕士甚至博士论文在研究别人二十年前就搞清楚了的东西。现在国际上领先的(二维)商用排样软件有shapeshifter、nester。  学院派的有德国的autonester(曾经使用过,大规模效果也不好)。国内很多公司号称掌握了什么核心技术,其实绝大多数是和别人合作,用别人的排样引擎。  这个引擎如果能达到目前国际顶尖水平,就至少价值过亿。


  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用[1],以下是矩形排样模拟退火算法的Python代码示例: ```python import math import random # 矩形类 class Rectangle: def __init__(self, width, height): self.width = width self.height = height # 排样类 class Packing: def __init__(self, rectangles): self.rectangles = rectangles self.width = sum([r.width for r in rectangles]) self.height = max([r.height for r in rectangles]) self.area = self.width * self.height # 计算排样的适应度 def fitness(self): return self.area # 随机生成初始解 def random_solution(self): x = 0 y = 0 solution = [] for r in self.rectangles: if x + r.width > self.width: x = 0 y += r.height solution.append((x, y)) x += r.width return solution # 交换两个矩形的位置 def swap_rectangles(self, solution): i = random.randint(0, len(solution) - 1) j = random.randint(0, len(solution) - 1) while i == j: j = random.randint(0, len(solution) - 1) new_solution = solution.copy() new_solution[i], new_solution[j] = new_solution[j], new_solution[i] return new_solution # 旋转矩形 def rotate_rectangle(self, solution): i = random.randint(0, len(solution) - 1) new_solution = solution.copy() x, y = new_solution[i] r = self.rectangles[i] new_solution[i] = (x, y, not r.rotated) return new_solution # 扰动产生新解 def perturb(self, solution): if random.random() < 0.5: return self.swap_rectangles(solution) else: return self.rotate_rectangle(solution) # 模拟退火算法 def simulated_annealing(self, initial_temperature=1000, cooling_rate=0.95, stopping_temperature=1e-8): current_solution = self.random_solution() current_fitness = self.fitness() best_solution = current_solution best_fitness = current_fitness temperature = initial_temperature while temperature > stopping_temperature: new_solution = self.perturb(current_solution) new_fitness = self.fitness() delta_fitness = new_fitness - current_fitness if delta_fitness < 0 or math.exp(-delta_fitness / temperature) > random.random(): current_solution = new_solution current_fitness = new_fitness if current_fitness < best_fitness: best_solution = current_solution best_fitness = current_fitness temperature *= cooling_rate return best_solution ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值