Tôi đang tìm một số lời khuyên về phương pháp/cấu trúc dữ liệu/cách tiếp cận thuật toán cho một vấn đề mà tôi đang cố giải quyết.Lời khuyên về phương pháp/cấu trúc dữ liệu/thuật toán sử dụng
Tôi đang viết ứng dụng bảng tính tùy chỉnh trong VBA. Bảng tính là một lịch trình lao động & tài liệu tạo báo giá. Người dùng nhập thông tin lập kế hoạch lao động cơ bản, sau đó được sử dụng để tạo nhiều trang tính/tài liệu khác nhau với dữ liệu nguồn được trình bày trong nhiều bố cục/định dạng khác nhau.
Thành thật mà nói Excel là ứng dụng sai cho điều này nhưng đó là những gì người dùng muốn và cảm thấy thoải mái và tôi biết VBA khá tốt nên đó là những gì tôi bị mắc kẹt.
Dữ liệu chính mà người dùng nhập ở định dạng dưới đây, về cơ bản là mục nhập cho mỗi cuộc gọi công việc hàng ngày cho mỗi vai trò.
╔═════╦════════╦════════════════╦════════════════╦═══════════════════╗
║ QTY ║ ROLE ║ START ║ END ║ DESCRIPTION ║
╠═════╬════════╬════════════════╬════════════════╬═══════════════════╣
║ 1 ║ Rigger ║ 6/15/17 08:00a ║ 6/15/17 04:00p ║ Travel to Prep ║
╠═════╬════════╬════════════════╬════════════════╬═══════════════════╣
║ 1 ║ Rigger ║ 6/16/17 08:00a ║ 6/16/17 06:00p ║ Prep ║
╠═════╬════════╬════════════════╬════════════════╬═══════════════════╣
║ 1 ║ Rigger ║ 6/17/17 08:00a ║ 6/17/17 07:00p ║ Prep ║
╠═════╬════════╬════════════════╬════════════════╬═══════════════════╣
║ 3 ║ Rigger ║ 6/18/17 06:00a ║ 6/18/17 05:00p ║ Travel to Install ║
╠═════╬════════╬════════════════╬════════════════╬═══════════════════╣
║ 3 ║ Rigger ║ 6/19/17 08:00a ║ 6/20/17 01:00a ║ Install ║
╠═════╬════════╬════════════════╬════════════════╬═══════════════════╣
║ 3 ║ Rigger ║ 6/20/17 10:00a ║ 6/20/17 08:00p ║ Install ║
╠═════╬════════╬════════════════╬════════════════╬═══════════════════╣
║ 3 ║ Rigger ║ 6/21/17 07:00a ║ 6/21/17 04:00p ║ Travel Home ║
╚═════╩════════╩════════════════╩════════════════╩═══════════════════╝
Thông thường dữ liệu là nhiều vai trò trong nhiều ngày và thường sẽ có nhiều phiên bản vai trò trong một số ngày (nhưng không nhất thiết phải là tất cả) ngày.
Một trong những thao tác dữ liệu mà mã thực hiện là lấy dữ liệu nguồn này và định dạng lại thành bảng tóm tắt để người dùng có thể gán tên vào ngày sau khi người được chỉ định. Nó cũng là cơ sở cho nhiều tờ cá nhân làm việc-cuộc gọi khác và số lượng tính toán của các chuyến bay/khách sạn đêm, vv
╔══════╦═══════════╦═════════╦═════════╦═══════════════════════════════════════╗
║ NAME ║ ROLE ║ START ║ END ║ DESCRIPTION ║
╠══════╬═══════════╬═════════╬═════════╬═══════════════════════════════════════╣
║ ║ Rigger #1 ║ 6/15/17 ║ 6/21/17 ║ Trav | Prep | Trav | Install | Trav ║
╠══════╬═══════════╬═════════╬═════════╬═══════════════════════════════════════╣
║ ║ Rigger #2 ║ 6/18/17 ║ 6/21/17 ║ Trav | Install | Trav ║
╠══════╬═══════════╬═════════╬═════════╬═══════════════════════════════════════╣
║ ║ Rigger #3 ║ 6/18/17 ║ 6/21/17 ║ Trav | Install | Trav ║
╠══════╬═══════════╬═════════╬═════════╬═══════════════════════════════════════╣
║ ║ Sound ║ 6/15/17 ║ 6/22/17 ║ Trav | Install | Trav ║
╠══════╬═══════════╬═════════╬═════════╬═══════════════════════════════════════╣
║ ║ Crew #1 ║ 6/17/17 ║ 6/30/17 ║ Trav | Install | Show | Strike | Trav ║
╠══════╬═══════════╬═════════╬═════════╬═══════════════════════════════════════╣
║ ║ Crew #2 ║ 6/17/17 ║ 6/22/17 ║ Trav | Install | Trav ║
╠══════╬═══════════╬═════════╬═════════╬═══════════════════════════════════════╣
║ ║ Crew #2 ║ 6/26/17 ║ 6/30/17 ║ Trav | Strike | Trav ║
╚══════╩═══════════╩═════════╩═════════╩═══════════════════════════════════════╝
nào để chuyển đổi dữ liệu nguồn từ hàng n-qty thành hàng nx của qty 1 và thêm một ví dụ tính vào giá trị vai trò nếu có nhiều phiên bản. Điều này hiện đang đạt được bằng cách lặp mảng dữ liệu một vài lần và thao tác dữ liệu cho phù hợp - psuedocode bên dưới
Sau đó tôi tạo bảng tóm tắt từ mảng được mở rộng.
này hoạt động tốt đối với trường hợp đơn giản tuy nhiên khi có cấu hình phức tạp nó có thể tạo ra kết quả inconsistant khi phụ thêm số ví dụ liên quan đến các giá trị mô tả ví dụ ...
╔═════╦════════╦═════════════════╦════════════════╦═══════════════════╗
║ QTY ║ ROLE ║ START ║ END ║ DESCRIPTION ║
╠═════╬════════╬═════════════════╬════════════════╬═══════════════════╣
║ 1 ║ Rigger ║ 6/15/17 08:00a ║ 6/15/17 04:00p ║ Travel to Prep ║
╠═════╬════════╬═════════════════╬════════════════╬═══════════════════╣
║ 1 ║ Rigger ║ 6/16/17 08:00a ║ 6/16/17 06:00p ║ Prep ║
╠═════╬════════╬═════════════════╬════════════════╬═══════════════════╣
║ 1 ║ Rigger ║ 6/17/17 08:00a ║ 6/17/17 07:00p ║ Prep ║
╠═════╬════════╬═════════════════╬════════════════╬═══════════════════╣
║ 3 ║ Rigger ║ 6/18/17 06:00a ║ 6/18/18 05:00p ║ Travel to Install ║
╠═════╬════════╬═════════════════╬════════════════╬═══════════════════╣
║ 3 ║ Rigger ║ 6/19/17 08:00a ║ 6/19/17 06:00p ║ Install ║
╠═════╬════════╬═════════════════╬════════════════╬═══════════════════╣
║ 1 ║ Rigger ║ 6/20/17 07:00a ║ 6/20/17 04:00p ║ Travel Home ║
╠═════╬════════╬═════════════════╬════════════════╬═══════════════════╣
║ 2 ║ Rigger ║ 6/20/17 08:00a ║ 6/20/17 06:00p ║ Install ║
╠═════╬════════╬═════════════════╬════════════════╬═══════════════════╣
║ 2 ║ Rigger ║ 6/21/17 07:00a ║ 6/21/17 04:00p ║ Travel Home ║
╚═════╩════════╩═════════════════╩════════════════╩═══════════════════╝
... sẽ ra ...
╔═══════════╦═════════╦═════════╦════════════════════════════════════════════╗
║ ROLE ║ START ║ END ║ DESCRIPTION ║
╠═══════════╬═════════╬═════════╬════════════════════════════════════════════╣
║ Rigger #1 ║ 6/15/17 ║ 6/21/17 ║ Trav | Prep | Trav | Install | Trav | Trav ║
╠═══════════╬═════════╬═════════╬════════════════════════════════════════════╣
║ Rigger #2 ║ 6/18/17 ║ 6/21/17 ║ Trav | Install | Trav ║
╠═══════════╬═════════╬═════════╬════════════════════════════════════════════╣
║ Rigger #3 ║ 6/18/17 ║ 6/20/17 ║ Trav | Install ║
╚═══════════╩═════════╩═════════╩════════════════════════════════════════════╝
Toàn bộ hoạt động này xảy ra nhiều lần trong khi sử dụng tài liệu bình thường và nếu thay đổi thứ tự dữ liệu (có thể) nó cũng có thể tạo ra kết quả không phù hợp giữa các hoạt động.
Tôi không muốn sắp xếp mảng nguồn như là một phần của quá trình vì nó là quá trình tốn kém làm tăng độ trễ đáng kể khi bảng được chia thành 10 hàng, ngay cả khi sử dụng sắp xếp hợp nhất hoặc sắp xếp nhanh.
Tôi đang cố gắng giữ quy trình này càng được tối ưu hóa càng tốt; rất nhiều đầu ra khác sử dụng mảng mở rộng này, một số trong đó cung cấp phản hồi trực tiếp một cách hiệu quả do đó hoạt động chạy mỗi khi người dùng nhập dữ liệu.
Danh sách giới thiệu có thể là người dùng có thể chọn là xác định trước
╔═══════════════════════╗
║ Travel to Prep ║
╠═══════════════════════╣
║ Travel & Prep ║
╠═══════════════════════╣
║ Prep ║
╠═══════════════════════╣
║ Prep & Travel ║
╠═══════════════════════╣
║ Travel to Install ║
╠═══════════════════════╣
║ Travel & Install ║
╠═══════════════════════╣
║ Install ║
╠═══════════════════════╣
║ Travel to Show ║
╠═══════════════════════╣
║ Rehearsal ║
╠═══════════════════════╣
║ Show ║
╠═══════════════════════╣
║ Show & Dismantle ║
╠═══════════════════════╣
║ Travel to Dismantle ║
╠═══════════════════════╣
║ Dismantle ║
╠═══════════════════════╣
║ Travel Home ║
╠═══════════════════════╣
║ Travel to Site Survey ║
╠═══════════════════════╣
║ Site Survey ║
╠═══════════════════════╣
║ Dark Day ║
╚═══════════════════════╝
tôi nghĩ đây là một cách hiệu quả một đồ thị có hướng, các cạnh đều có một hướng đi (nhất là một chiều) và một số các nút có thể tự vòng lặp.Tôi đã xây dựng một ma trận kề cho danh sách trên vì đây có vẻ là một cách hợp lý để xác định xem thứ tự gán có hợp lệ không.
Có cách nào hiệu quả để đảm bảo tất cả các đường dẫn cho một vai trò cụ thể là các đường dẫn truyền hợp lệ hay không và cách tốt nhất để gán lại các số cá thể vai trò nếu một hoặc nhiều đường dẫn không hợp lệ? Hoặc có thể sử dụng tập hợp con các giá trị mô tả ở mỗi cấp độ truyền tải đường dẫn trong khi hoạt động mở rộng để đảm bảo số lượng vai trò vai trò được chỉ định chính xác để bắt đầu không? Không.
Có một khu vực lý thuyết đồ thị cụ thể nào mà tôi nên xem không? Đồ thị có phải là cách tiếp cận đúng ở đây không? Có cách tiếp cận thay thế nào có hiệu quả/hiệu quả hơn không?
Mọi lời khuyên/trợ giúp sẽ được biết ơn.
Cảm ơn
Tôi đã đọc mô tả 3 lần, nhưng bạn đang cố giải quyết vấn đề gì? Từ dữ liệu của bạn, dữ liệu dự kiến của bạn sẽ ra sao? Nhiều lần nếu bạn có thể giải thích vấn đề của mình cho người lạ, bạn sẽ có giải pháp. Điều này đọc như bạn đang mắc kẹt trong một cách như thế nào và quên những gì. Bạn có thể đưa ra một số ví dụ về đầu vào, đầu ra tốt, đầu ra sai không? – starmole