From f2a664ee509cc0a5840da0ed932bfc3eadea9a74 Mon Sep 17 00:00:00 2001 From: "bozo.kopic" Date: Sun, 19 Dec 2021 03:28:00 +0100 Subject: additional calculate parameter - minimize initial panel usage --- src_py/opcut/common.py | 3 +++ src_py/opcut/csp.py | 15 ++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) (limited to 'src_py') diff --git a/src_py/opcut/common.py b/src_py/opcut/common.py index 90a8b00..9fbb7dd 100644 --- a/src_py/opcut/common.py +++ b/src_py/opcut/common.py @@ -29,6 +29,7 @@ class Item(typing.NamedTuple): class Params(typing.NamedTuple): cut_width: float + min_initial_usage: bool panels: typing.List[Panel] items: typing.List[Item] @@ -81,6 +82,7 @@ def params_to_json(params: Params) -> json.Data: """Convert params to json serializable data specified by ``opcut://opcut.yaml#/definitions/params``""" return {'cut_width': params.cut_width, + 'min_initial_usage': params.min_initial_usage, 'panels': {panel.id: {'width': panel.width, 'height': panel.height} for panel in params.panels}, @@ -94,6 +96,7 @@ def params_from_json(data: json.Data) -> Params: """Convert json serializable data specified by ``opcut://opcut.yaml#/definitions/params`` to params""" return Params(cut_width=data['cut_width'], + min_initial_usage=data.get('min_initial_usage', False), panels=[Panel(id=k, width=v['width'], height=v['height']) diff --git a/src_py/opcut/csp.py b/src_py/opcut/csp.py index 43b8e1f..eb08314 100644 --- a/src_py/opcut/csp.py +++ b/src_py/opcut/csp.py @@ -145,4 +145,17 @@ def _fitness(result): fitness -= (_fitness_K * min(used_areas, default=0) * max(unused_areas, default=0) / (total_area * total_area)) - return fitness + + if not result.params.min_initial_usage: + return fitness + + unused_initial_count = sum(1 for unused in result.unused + if _is_unused_initial(unused)) + return (-unused_initial_count, fitness) + + +def _is_unused_initial(unused): + return (unused.x == 0 and + unused.y == 0 and + unused.width == unused.panel.width and + unused.height == unused.panel.height) -- cgit v1.2.3-70-g09d2