aboutsummaryrefslogtreecommitdiff
path: root/src_py
diff options
context:
space:
mode:
authorbozo.kopic <bozo@kopic.xyz>2021-12-19 03:28:00 +0100
committerbozo.kopic <bozo@kopic.xyz>2021-12-19 03:28:00 +0100
commitf2a664ee509cc0a5840da0ed932bfc3eadea9a74 (patch)
treee9cae8b30f78578bbe29103b7fffb0331069ec2c /src_py
parentb7883de47e05d0b52ea4e04440f4894a0a9032a1 (diff)
additional calculate parameter - minimize initial panel usage
Diffstat (limited to 'src_py')
-rw-r--r--src_py/opcut/common.py3
-rw-r--r--src_py/opcut/csp.py15
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)