Tôi đang làm việc trên một chương trình bằng Python, trong đó một phần nhỏ liên quan đến việc tối ưu hóa một hệ phương trình/bất đẳng thức. Lý tưởng nhất, tôi sẽ muốn làm như có thể được thực hiện trong Modelica, viết ra các phương trình và để cho người giải quyết chăm sóc nó.Python - Tối ưu hóa hệ thống bất bình đẳng
Hoạt động của trình giải quyết và lập trình tuyến tính là một chút ngoài vùng thoải mái của tôi, nhưng tôi vẫn quyết định thử. Vấn đề là thiết kế chung của chương trình là hướng đối tượng và có nhiều khả năng kết hợp khác nhau để tạo thành các phương trình, cũng như một số phi tuyến tính, vì vậy tôi không thể dịch nó thành một chương trình tuyến tính vấn đề (nhưng tôi có thể sai).
Sau một số nghiên cứu tôi thấy rằng trình giải mã Z3 dường như làm những gì tôi muốn. Tôi đến với điều này (điều này trông giống như một trường hợp điển hình về những gì tôi muốn tối ưu hóa):
from z3 import *
a = Real('a')
b = Real('b')
c = Real('c')
d = Real('d')
e = Real('e')
g = Real('g')
f = Real('f')
cost = Real('cost')
opt = Optimize()
opt.add(a + b - 350 == 0)
opt.add(a - g == 0)
opt.add(c - 400 == 0)
opt.add(b - d * 0.45 == 0)
opt.add(c - f - e - d == 0)
opt.add(d <= 250)
opt.add(e <= 250)
opt.add(cost == If(f > 0, f * 50, f * 0.4) + e * 40 + d * 20 +
If(g > 0, g * 50, g * 0.54))
h = opt.minimize(cost)
opt.check()
opt.lower(h)
opt.model()
Bây giờ công trình này, và mang lại cho tôi kết quả tôi muốn, mặc dù nó không phải là cực kỳ nhanh (tôi cần phải giải quyết các hệ thống như vậy vài nghìn lần). Nhưng tôi không chắc tôi đang sử dụng đúng công cụ cho công việc (Z3 là một "định lý prover").
API về cơ bản là chính xác những gì tôi cần, nhưng tôi sẽ tò mò nếu các gói khác cho phép một cú pháp tương tự. Hoặc tôi có nên cố gắng xây dựng vấn đề theo một cách khác để cho phép tiếp cận LP chuẩn không? (mặc dù tôi không biết làm thế nào)
Trình giải mã LP có thể giải quyết vấn đề này sau khoảng 0 giây vì điều này thực sự rất nhỏ. –
Có, nhưng làm cách nào tôi có thể quản lý một số điều kiện "if" trong hàm? Các giải pháp mà tôi đã nhìn thấy dường như khá đáng sợ, và sẽ không thực sự làm việc trong trường hợp của tôi. –
Tôi nghĩ rằng điều này có thể được thực hiện bằng cách sử dụng chia tách. I E. giới thiệu các biến không âm 'fplus, fmin'. Thêm ràng buộc 'f = fplus-fmin'. 'If' đầu tiên sau đó trở thành:' 50 fplus-0.4 fmin'. –