java矩形排样_优化排样(板材矩形一刀切算法)

优化排样:

小矩形在大矩形上的优化排版算法 优化排样问题是指在给定的材料区域内,找出被排零件的全局最优排布,使得材料利用率最高,且零件互不重叠;

可以理解为 给你一堆要画的不同规格(长宽)的矩形,给你一堆不同规格(长宽)的白纸,把所有矩形排列在白纸上,要求能够在剪刀不转弯的情况下剪裁出来(一刀切),求最少白纸的使用量(面积最小)?

要求:

一、添加原材料

1、可添加多种不同尺寸的原材料。

2、可添加上一次剩下的余料(优化时优先使用)。

3、可添加不同的原材料。

4、添加原材料的参数(长、宽、厚度、数量、种类)

二、添加零件

1、添加零件的参数(长、宽、厚度、数量、种类、纹路、名称等)

2、添加零件时,可设定每一个零件是否要按纹路要求优化(纹路要求(true表示无纹路要求,可任意旋转,false表示有纹路要求,不可旋转,纹路方向默认为原片长边)。)。

三、优化参数

1、刀口宽度设定

2、大板的修边值设定。

3、每一次转向修边量可设定(设置为零表示转向可不修边)(即板材每次切割都要修边的数据)。

4、余料回收设置(面积回收、长度与宽度回收),

5、达到回收标准,即在结果文件中输出余料的信息

6、层次设定(层次:每一张原材料中,要转向多少次才能切割完成。)

7、首次切割方向(自动选择、X方向、Y方向 )。

8、优化功能按客户要求可在“偏向速度”和“偏向省料”两选项之间选择优化算法。

7.1偏向速度:即表示锯切速度优化,尽量多堆叠切割。

7.2偏向省料:即表示利用率优先。尽量省料为主。

9、同一板件可选择是否尽可能集中在同一裁切方案里面。

四、优化结果

1、优化结果的应该达到或者超过同行业内其它软件的利用率与性能,如余料的再利用率、板材的利用率、优化速度、叠板率、图形率等(如果AUTOCUT,仁霸板材优化软件,天工优化软件,同德优化软件,黑格优化软件、cutrit等)

2、优化结果输入一个XML文件。里面包括原材料信息、零件信息、优化排版信息。

3、如果余料大于余料设置值,在文件中,要表示出来。

4、优化排版信息中,每一张成品,都是带有一个ID,当堆叠切割时,ID应该用逗号隔开,如ID=”1,2,3”(ID的作用是方面查找零件信息,来生成标签)。

5、多种原材料优化时,有XML里,应有对应的信息(双方可约定XML文件格式),如:

材料1的零件

材料2的零件与排版信息

其它:

1、求最小面积,也可以说是优化率、出材率 不低于目前行业软件正常水平,测试数据我们可以提供参考;

2、不能出现明显可以用小张白纸排列,结果用大张白纸排列造成浪费的低级错误;

3、计算速度与利用率上也不能低于行业软件正常水平;

由于我们需要的是算法,没有类似的经验就不要参与竞标了。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的矩形排样遗传算法的示例代码(使用Python实现): ```python import random # 定义矩形类 class Rectangle: def __init__(self, width, height): self.width = width self.height = height # 定义个体类 class Individual: def __init__(self, rects): self.rects = rects self.fitness = 0 # 定义遗传算法类 class GeneticAlgorithm: def __init__(self, rects, pop_size, mutation_rate, generations): self.rects = rects self.pop_size = pop_size self.mutation_rate = mutation_rate self.generations = generations self.population = [] self.best_individual = None # 初始化种群 def init_population(self): for i in range(self.pop_size): rects = self.random_rects() individual = Individual(rects) self.population.append(individual) # 产生随机的矩形排样方案 def random_rects(self): rects = [] for rect in self.rects: if random.random() > 0.5: rects.append(Rectangle(rect.width, rect.height)) else: rects.append(Rectangle(rect.height, rect.width)) return rects # 计算个体的适应度 def evaluate_fitness(self, individual): area_sum = 0 for rect in individual.rects: area_sum += rect.width * rect.height width_sum = 0 for rect in individual.rects: width_sum += rect.width height_max = max([rect.height for rect in individual.rects]) fitness = area_sum / (width_sum * height_max) individual.fitness = fitness # 选择操作 def select(self): population_size = len(self.population) fitnesses = [individual.fitness for individual in self.population] total_fitness = sum(fitnesses) probabilities = [fitness / total_fitness for fitness in fitnesses] selected = [] for i in range(population_size): r = random.random() cumulative_probability = 0 for j in range(population_size): cumulative_probability += probabilities[j] if r < cumulative_probability: selected.append(self.population[j]) break return selected # 交叉操作 def crossover(self, parent1, parent2): point = random.randint(1, len(parent1.rects) - 1) child1 = parent1.rects[:point] + parent2.rects[point:] child2 = parent2.rects[:point] + parent1.rects[point:] return Individual(child1), Individual(child2) # 变异操作 def mutate(self, individual): for i in range(len(individual.rects)): if random.random() < self.mutation_rate: individual.rects[i] = Rectangle(individual.rects[i].height, individual.rects[i].width) # 进化操作 def evolve(self): self.init_population() for generation in range(self.generations): for individual in self.population: self.evaluate_fitness(individual) self.population.sort(key=lambda individual: individual.fitness, reverse=True) if not self.best_individual or self.best_individual.fitness < self.population[0].fitness: self.best_individual = self.population[0] selected = self.select() next_population = [] for i in range(self.pop_size // 2): parent1 = random.choice(selected) parent2 = random.choice(selected) child1, child2 = self.crossover(parent1, parent2) self.mutate(child1) self.mutate(child2) next_population.append(child1) next_population.append(child2) self.population = next_population return self.best_individual.rects ``` 使用示例: ```python # 定义矩形 rects = [Rectangle(3, 4), Rectangle(2, 5), Rectangle(6, 2), Rectangle(1, 1)] # 定义遗传算法对象 ga = GeneticAlgorithm(rects, pop_size=10, mutation_rate=0.1, generations=50) # 进化 best_rects = ga.evolve() # 输出排样方案 for rect in best_rects: print(rect.width, rect.height) ``` 以上是一个简单的矩形排样遗传算法的实现,可以根据需要进行修改和优化

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值