Mặc dù lập trình tuyến tính số nguyên hỗn hợp (MILP) thực sự là NP hoàn chỉnh, có những trường hợp có thể giải được (không cần thiết) của lập trình tuyến tính số nguyên hỗn hợp.
NP-Complete có nghĩa là lập trình tuyến tính số nguyên hỗn hợp là:
a) có thể hòa tan trong thời gian đa thức với máy Turing không điều kiện (phần NP)
b) thời gian đa thức có thể giảm xuống 3-SAT (phần hoàn chỉnh; trong phần còn lại của cuộc thảo luận, phần này thực sự không quan trọng)
Ôi ( 2n)n
Câu nói đó không có nghĩa là các trường hợp "nhỏ" không thể truy cập được. Thật không may, tôi không thể đưa ra một tuyên bố chính xác về ý nghĩa nhỏ của một ví dụ MILP. Tôi giải quyết các vấn đề có 3.000 biến số quyết định nhị phân trở lên trên cơ sở thường xuyên. Tùy thuộc vào cách xây dựng vấn đề, các sự cố có thể mất ít hơn 0,01 giây (đó là trường hợp đối với các sự cố tương đối bị hạn chế) hoặc hơn một giờ (đó là trường hợp xảy ra sự cố khi có nhiều ràng buộc hoạt động), vì các sự cố dường như để có cấu trúc thuận lợi. Tôi có thể nói rằng các bộ giải LP hiện đại có thể giải quyết các LP với hàng triệu biến số quyết định liên tục và nếu không có cấu trúc đặc biệt, rất khó có thể xảy ra sự cố với khoảng 1.000 đến 10,
Nếu bạn nghĩ rằng bạn có một thể hiện có thể giải quyết được của MILP, bạn sẽ muốn sử dụng thuật toán phân nhánh và liên kết hoặc phân nhánh. Các triển khai tốt nhất là CPLEX và Gurobi . Cả hai đều là sản phẩm thương mại có giấy phép học thuật miễn phí nếu bạn đào đủ. Nếu bạn thực sự cần một người giải mã nguồn mở, các dự án trong cộng đồng COIN-OR phù hợp hơn, mặc dù các gói nguồn đôi khi có thể rất khó. Các dự án phù hợp nhất sẽ là các CBC ngành và cắt giải , người giải quyết SYMPHONY , người giải quyết BCP chi nhánh cắt giá , và các giải ABACUS ngành và cắt . Tất cả các dự án này sẽ yêu cầu nhiều gói từ COIN-OR, do cấu trúc mô-đun của nó.
Nếu bạn muốn tùy chọn dùng thử nhiều bộ giải, cách tốt nhất của bạn là sử dụng Giao diện bộ giải mở từ COIN-OR . Xin lưu ý rằng các phần của giao diện này sẽ chỉ cho phép bạn đặt các tùy chọn bộ giải cơ bản và để đặt các tùy chọn nâng cao cho bộ giải, bạn nên tham khảo danh sách gửi thư của COIN-OR để biết thêm chi tiết. Các bộ giải MILP thương mại là NHIỀU (đôi khi là một thứ tự cường độ trở lên) nhanh hơn các bộ giải mã nguồn mở. Một tùy chọn khác cho prototyping là sử dụng một ngôn ngữ mô hình đại số như GAMS hoặc ampl . Cả hai gói phần mềm đều mang tính thương mại, nhưng có các phiên bản dùng thử có thể được sử dụng trong các trường hợp nhỏ. Đối với các trường hợp sự cố lớn hơn, bạn có thể gửi tệp GAM hoặc AMPL đếnMáy chủ NEOS sẽ được giải quyết; máy chủ này có sẵn cho công chúng.
Nếu bạn có một ví dụ đủ lớn về MILP, thì không có bộ giải nào trong số này sẽ hoạt động tốt. Bạn có thể thư giãn các biến số nguyên thành các biến liên tục, giải quyết vấn đề và sau đó làm tròn đến tập hợp các biến số gần nhất là một giải pháp khả thi trong trường hợp vấn đề của bạn. Một giải pháp tối ưu cho việc thư giãn LP của MILP của bạn sẽ giúp bạn có giới hạn thấp hơn về giá trị chức năng mục tiêu tối ưu của MILP của bạn (tất nhiên là giả sử tối thiểu hóa) và một giải pháp khả thi của MILP sẽ cung cấp cho bạn giới hạn trên về mục tiêu tối ưu giá trị chức năng của MILP của bạn.
Nếu bạn thực sự may mắn và ma trận ràng buộc của bạn hoàn toàn không có hình dạng , thì bạn có thể sử dụng bộ giải LP để tạo các giải pháp số nguyên cho MILP của mình và bạn có thể giải quyết vấn đề của mình một cách hiệu quả mặc dù kích thước lớn. Các loại vấn đề khác có thuật toán xấp xỉ nhanh, chẳng hạn như các vấn đề về ba lô và cắt giảm các vấn đề chứng khoán . Các thuật toán phân tách MILP chuyên dụng cũng tồn tại cho các vấn đề có cấu trúc đặc biệt, mặc dù tôi không quen thuộc với các chi tiết, vì các chủ đề này hơi chuyên biệt và nằm ngoài phạm vi của luận án của tôi.
Tôi không biết về sơ đồ xấp xỉ thời gian đa thức hoàn toàn (FPTAS) dành riêng cho MILP, mặc dù một FPTAS của một lớp vấn đề bao gồm MILP tồn tại (xem bài viết này). Đề nghị của tôi sẽ là sử dụng một trong những bộ giải lập trình tuyến tính số nguyên hỗn hợp ở trên cùng với giới hạn thời gian và dung sai thích hợp trên các khoảng trống tối ưu. Làm như vậy sẽ cung cấp cho bạn giải pháp khả thi tốt nhất có thể cho MILP của bạn trong thời gian giới hạn và nếu người giải quyết chấm dứt thành công trước thời hạn, giải pháp khả thi sẽ tối ưu trong phạm vi dung sai khoảng cách tối ưu bạn đặt. Quá trình hành động này vẫn sẽ cung cấp cho bạn giới hạn về chất lượng của giải pháp, bởi vì giải pháp khả thi của bạn sẽ là giới hạn trên và người giải quyết có thể cung cấp cho bạn giới hạn dưới phù hợp. Các ràng buộc sẽ không được đảm bảo nằm trong một giải pháp tối ưu yếu tố nhất định, nhưng một lần nữa, bất kỳ FPTAS nào cũng sẽ trở nên đắt đỏ hơn khi sự gần đúng trở nên tốt hơn.
Điều quan trọng nhất bạn có thể làm trước khi giải quyết công thức MILP là chọn công thức mạnh nhất mà bạn có thể tìm thấy; bạn có thể tìm thấy lời khuyên về cách chọn các công thức mạnh trong Giới thiệu về Tối ưu hóa tuyến tính của Bertsimas và Tsitsiklis. Ý tưởng chính là chọn một công thức có các ràng buộc xác định một đa giác càng gần với vỏ lồi của công thức càng tốt (cũng xem các ghi chú khóa học này ). Chọn một công thức mạnh có thể tạo ra một sự khác biệt lớn trong thời gian cần thiết để giải quyết một vấn đề.