Avg. number of boxes : 11
Free volume (total) : 1414306
Avg. free volume: 30.671274509803922 percent
+2020-07-19 13:04:27,287 Details for Category from O1 to O3 :
+Total time (in seconds) : 0.005005072000130895
+Number of boxes : 31
+Avg. number of boxes : 10
+Free volume (total) : 1220826
+Avg. free volume: 34.3641935483871 percent
+2020-07-19 13:04:53,589 Details for Category from O1 to O3 :
+Total time (in seconds) : 0.00504950499998813
+Number of boxes : 31
+Avg. number of boxes : 10
+Free volume (total) : 1220826
+Avg. free volume: 34.3641935483871 percent
+2020-07-19 13:06:08,634 Details for Category from O0 to O10 :
+Total time (in seconds) : 0.01787604100036333
+Number of boxes : 112
+Avg. number of boxes : 10
+Free volume (total) : 4389886
+Avg. free volume: 34.67431547619047 percent
+2020-07-19 13:09:23,472 Details for Category from O0 to O100059 :
+Total time (in seconds) : 116.31860341499987
+Number of boxes : 755151
+Avg. number of boxes : 7
+Free volume (total) : 30402133137
+Avg. free volume: 32.900668570480164 percent
+2020-07-19 13:20:24,549 Details for Category from 5 to 10 :
+Total time (in seconds) : 1.5173372700000982
+Number of boxes : 64
+Avg. number of boxes : 12
+Free volume (total) : 2491080
+Avg. free volume: 35.128125 percent
# Copyright (c) 2020 Janos Piddubnij
# Copyright (c) 2020 Moritz Dedderichs
+
from inform_or_models.assign_items_by_volume import assign_items_by_volume
from inform_or_parser.parse_generated_csv import parse_generated_csv
from inform_or_models.place_items_in_box import place_items_in_box
from inform_or_parser.parse_boxes import parse_boxes
from typing import Dict, Tuple
-
+import sys
class SplitModel:
def __init__(self, input_file: str, boxes_file: str):
input_file: str
The CSV file created by the INFORM-Generator to be processed.
"""
- self.orders, self.length_items, self.width_items, self.height_items, self.weight_items = parse_generated_csv(input_file)
+ self.orders, self.length_items, self.width_items, self.height_items, self.weight_items = parse_generated_csv(input_file, ";", "utf-16", 0, sys.maxsize)
boxes_dict = parse_boxes(boxes_file)
self.boxes = list(boxes_dict.keys())
self.length_boxes = {k: v[0] for k, v in boxes_dict.items()}
"""
# Copyright (c) 2020. Yordan Manolov <yordan DOT manolov AT rwth DASH aachen DOT de >
-#
+# Copyright (c) 2020. Moritz Dedderichs
+import argparse
import csv
-from typing import List
+from typing import List, Generator
-from inform_or_parser.parse_generated_csv import parse_generated_csv
from inform_or_ep_objects.item import Item
from inform_or_ep_objects.order import Order
+from inform_or_parser.parse_generated_csv import parse_generated_csv
ORDER_COLUMN = "Order ID"
ARTICLE_COLUMN = "Article ID"
return True
-def parse_file_as_objects(name: str, delimiter: str = ";", encoding: str = "utf-16") -> List[Order]:
+def parse_file_as_objects(args: argparse.Namespace,
+ delimiter: str = ";",
+ encoding: str = "utf-16") -> Generator[Order, None, None]:
"""
Wrapper for the original parser.
Outputs objects instead of dictionaries. Fast.
Parameters
----------
- name : str
- Filename.
+ args:
+ Basic arguments, especially file name, first and last order to process
delimiter : str, optional
The default is ";".
encoding : str, optional
- The default is "utf-16".
+ The default is "utf-16"
Returns
-------
- List[Order]
- A list of order (objects).
+ Generator[Order]
+ Order (objects).
"""
+ name = args.input
+ file_beginning = args.first
+ file_end = args.last
verify_input(name, delimiter, encoding)
- result = list()
- orders, lengths, widths, heights, weights = parse_generated_csv(name, delimiter, encoding)
+ orders, lengths, widths, heights, weights = parse_generated_csv(name,
+ delimiter,
+ encoding,
+ file_beginning,
+ file_end)
for key, item_list in orders.items():
order = Order(key, list())
for item_id, count in item_list:
order.itemlist.append(
- Item(item_id, count, lengths[item_id], widths[item_id], heights[item_id], weights[item_id]))
- result.append(order)
+ Item(item_id, count, lengths[item_id], widths[item_id],
+ heights[item_id], weights[item_id]))
+ yield order
- return result
# Copyright (c) 2020 Moritz Dedderichs
-
+# Copyright (c) 2020 Yordan Manolov
import csv
from typing import Tuple, Dict, Any, DefaultDict
from collections import defaultdict
-def parse_generated_csv(csv_file: str, delimiter: str = ';', encoding: str = 'utf-16') -> Tuple[
- DefaultDict[Any, list], Dict[str, int], Dict[str, int], Dict[str, int], Dict[str, int]]:
+def name_to_number(order_name: str) -> int:
+ """
+
+ Parameters
+ ----------
+ order_name
+ The full name of the current order
+
+ Returns
+ -------
+ The name without non-numerals, stripped of leading zeroes
+
+ """
+ return int("".join(c for c in order_name if c.isdigit()))
+
+
+def parse_generated_csv(csv_file: str,
+ delimiter: str = ';',
+ encoding: str = 'utf-16',
+ first: int = None,
+ last: int = None) -> Tuple[DefaultDict[Any, list],
+ Dict[str, int],
+ Dict[str, int],
+ Dict[str, int],
+ Dict[str, int]]:
""" This functions reads the given csv file and returns a gurobi like data collection to use in the optimisation process
Parameters
next(reader)
for row in reader:
order_name = row[0].strip()
+ order_nr = name_to_number(order_name)
item_name = row[6].strip()
+
+ if first and last:
+ if order_nr < first or order_nr > last:
+ continue
orders[order_name].append((item_name, int(row[12])))
length_items[item_name] = int(row[8])
width_items[item_name] = int(row[9])
"""
instruction = os.path.join(arguments.output, 'instructions_ep.txt')
print_instruction_description_to_file(instruction)
- orders = parse_csv_extreme_points.parse_file_as_objects(arguments.input)
- order_from = arguments.first
- order_until = arguments.last
- if isinstance(order_until, int):
- order_until += 1
- orders = orders[order_from:order_until]
processed_orders = list()
start_all_orders = time.perf_counter()
- for order in orders:
+ for order in parse_csv_extreme_points.parse_file_as_objects(arguments):
start_current_order = time.perf_counter()
result = extreme_points(order, instruction, arguments)
processed_orders.append(result)
end_all_orders = time.perf_counter()
time_all_orders = end_all_orders - start_all_orders
- stat_me("Category from " + str(orders[0].identifier) +
- " to " + str(orders[-1].identifier),
- len(orders),
+ stat_me("Category from " + str(args.first) +
+ " to " + str(args.last),
+ abs(args.first - args.last),
time_all_orders,
processed_orders)
width_box[box] = boxes_dict[box][1]
height_box[box] = boxes_dict[box][2]
- orders, length_item, width_item, height_item, weight_item = parse_generated_csv(input_file_path)
-
- if first is None:
- first = 0
- if last is None:
- last = len(orders)
+ orders, length_item, width_item, height_item, weight_item = parse_generated_csv(input_file_path, ";", "utf-16", first, last)
complete_solution_dictionary = dict()