diff options
Diffstat (limited to 'src_py')
| -rw-r--r-- | src_py/opcut/common.py | 3 | ||||
| -rw-r--r-- | src_py/opcut/csp.py | 15 |
2 files changed, 17 insertions, 1 deletions
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) |
