Lập kế hoạch tài nguyên bằng Python

Đa ngôn ngữ trong PHP MySQL. Đa ngôn ngữ trong PHP MySQL. Hướng dẫn PHP MySQL. Hướng dẫn đa ngôn ngữ https. //www. youtube. com/watch?v=Cu4crMofbJg Tải tệp hình ảnh lên & lưu trữ vào bảng MySQL & hiển thị tệp hình ảnh https. //www. youtube. com/watch?v=XBQfktx74j8 Văn bản CSS. Hướng dẫn CSS cho người mới bắt đầu. Hướng dẫn HTML & CSS https. //www. youtube. com/watch?v=7PRzgkN2bq0 Bảng CSS. Hướng dẫn CSS cho người mới bắt đầu https. //www. youtube. com/watch?v=cvj6Kf5aAsA Hệ thống đầu tư và tín dụng vi mô bằng php mysql https. //www. youtube. com/watch?v=Qo5dsyOYQoY img trong HTML. hình ảnh trong HTML. Hướng dẫn về HTML và Hình ảnh. hình ảnh css. Hướng dẫn HTML cho người mới bắt đầu https. //www. youtube. com/watch?v=X2MmBsIOsKU Thao tác bảng HTML trong JavaScript. Hướng dẫn JavaScript dành cho người mới bắt đầu https. //www. youtube. com/watch?v=LXhMh-npKhs Dự án quản lý nhóm bán hàng trong Codeigniter https. //www. youtube. com/watch?v=YTpJUJyHQZQ Hướng dẫn về hàm mũi tên JavaScript ES6 https. //www. youtube. com/watch?v=UUBVGotrep8 Lớp & Hàm tạo trong JavaScript. Hướng dẫn JavaScript dành cho người mới bắt đầu https. //www. youtube. com/watch?v=3FBEIsEK2uc&t=144s Hướng dẫn JSON [Ký hiệu đối tượng JavaScript]. Hướng dẫn JavaScript dành cho người mới bắt đầu https. //www. youtube. com/watch?v=aCYWuz-sa7s Viralelites dự án trong PHP MySQL để quản lý khách hàng để cho phép họ mua lượt thích bình luận chia sẻ & quảng cáo https. //www. youtube. com/watch?v=hGv0dvVflUU Tạo phần tử và nội dung HTML một cách linh hoạt với JavaScript. Tài liệu. CreateElement[] trong JavaScript https. //www. youtube. com/watch?v=e9tYm8m7eY8 Cách gỡ lỗi trong JavaScript. Nhận đầu ra của JavaScript. Hướng dẫn JavaScript dành cho người mới bắt đầu https. //www. youtube. com/watch?v=eATA3SwAnXM Các kiểu dữ liệu trong JavaScript. Hướng dẫn JavaScript. JavaScript dành cho người mới bắt đầu https. //www. youtube. com/watch?v=e_NoIzsNNJg&t=21s Hệ thống dịch thuật thương mại điện tử Tải lên tệp trực tuyến, Đếm từ, Thanh toán & Chỉ định người dịch https. //www. youtube. com/watch?v=yUHWeb_ZRag Hệ thống thanh toán liên kết & quản lý khách hàng tiềm năng bằng PHP MySQL https. //www. youtube. com/watch?v=_bCxZ61rHS8 Lớp & ID trong CSS. Hướng dẫn CSS cho người mới bắt đầu https. //www. youtube. com/watch?v=NS_H6ItC3Ss Chuyển đổi [Ẩn/Hiện] một Phần tử trong JavaScript & CSS. Hướng dẫn JavaScript cho người mới bắt đầu https. //www. youtube. com/watch?v=-AP-Eg9bS0Y Dự án [Phần mềm] Quản lý Chăn nuôi trong CodeIgniter với Mã nguồn & Cơ sở dữ liệu https. //www. youtube. com/watch?v=mQG6MQxi2eU Hướng dẫn tự động tăng khóa chính và khóa ngoại trong PHP MySQL https. //www. youtube. com/watch?v=JNGzV1G9iCs&t=125s UUID trong PHP MySQL. Cách tạo Id duy nhất. Tự động tạo mã. Tự động tạo UUID. Hướng dẫn PHP MySQL https. //www. youtube. com/watch?v=kSFjDDjDrso CSS [Cascade Style Sheet] cho người mới bắt đầu. Hướng dẫn CSS https. //www. youtube. com/watch?v=gVFwOQUh7t8 Dự án mặc định trong CodeIgniter với Mã nguồn & Cơ sở dữ liệu https. //www. youtube. com/watch?v=zQvfap38AFI

Viết văn bản trên ảnh trong tệp tài liệu Microsoft [MS] Word. Hướng dẫn tài liệu Microsoft Word https. //www. youtube. com/watch?v=ynLTJHLXK10 Đặt ảnh này lên ảnh khác trong Microsoft Paint. Đặt ảnh lên trên ảnh https. //www. youtube. com/watch?v=W14gxd4uOBE Đặt ảnh này lên ảnh khác trong Microsoft [MS] Word. Đặt ảnh lên trên ảnh https. //www. youtube. com/watch?v=p4XkgR4NhMM npm ERR. Không thể đọc thuộc tính 'khớp' của không xác định. npm cài đặt LỖI https. //www. youtube. com/watch?v=axEJJ5zzuz0 Hệ thống quản lý bệnh viện [Chăm sóc bác sĩ] bằng PHP & MYSQL CodeIgniter Framework với mã nguồn https. //www. youtube. com/watch?v=HNU_VK1CF4s Sự kiện trong JavaScript. Hướng dẫn JavaScript https. //www. youtube. com/watch?v=80XNOfUhqyY DOM API & bộ chọn truy vấn. Hướng dẫn JavaScript https. //www. youtube. com/watch?v=Gio7H1zwJZ4 Hướng dẫn kiến ​​trúc CRM [Quản lý quan hệ khách hàng] https. //www. youtube. com/watch?v=Ogyap8bQ8sM Biến toàn cầu,Biến cục bộ,Lưu trữ cục bộ trong JavaScript. Hướng dẫn JavaScript https. //www. youtube. com/watch?v=LX9bRVNyD6w Mảng,Mảng đa chiều,Lặp mảng trong JavaScript. Hướng dẫn JavaScript https. //www. youtube. com/watch?v=bsW6SCJ9MHU Đang chờ , Không đồng bộ , Hứa hẹn , Gọi lại bằng JavaScript. Hướng dẫn JavaScript https. //www. youtube. com/watch?v=qozPEBJ2hSY&t=3s

Một kịch bản lịch trình py đơn giản trong đó ba nhiệm vụ gia đình cần được giao cho hai người, Alice và Bob

from pyschedule import Scenario, solvers, plotters, alt

# the planning horizon has 10 periods
S = Scenario['household',horizon=10]

# two resources: Alice and Bob
Alice, Bob = S.Resource['Alice'], S.Resource['Bob']

# three tasks: cook, wash, and clean
cook = S.Task['cook',length=1,delay_cost=1]
wash = S.Task['wash',length=2,delay_cost=1]
clean = S.Task['clean',length=3,delay_cost=2]

# every task can be done either by Alice or Bob
cook += Alice | Bob
wash += Alice | Bob
clean += Alice | Bob

# compute and print a schedule
solvers.mip.solve[S,msg=1]
print[S.solution[]]

INFO: execution time for solving mip [sec] = 0.025493860244750977
INFO: objective = 1.0
[[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]

Chúng ta cũng có thể vẽ biểu đồ dưới dạng biểu đồ GANTT và ghi nó vào một tệp

plotters.matplotlib.plot[S,img_filename='pics/household.png']

Có sổ ghi chép ví dụ ở đây và các ví dụ đơn giản hơn trong thư mục ví dụ. Cài đặt nó với pip

pip install pyschedule

Hạn mức

Lưu ý rằng pyschedule nhằm mục đích trở thành một người giải quyết chung cho các vấn đề lập kế hoạch vừa và nhỏ. Một tình huống điển hình mà pyschedule bao gồm 10 tài nguyên và 100 nhiệm vụ với khoảng thời gian lập kế hoạch là 100 giai đoạn. Nếu yêu cầu của bạn lớn hơn nhiều so với mức này, thì khó có được giải pháp vượt trội. Có một số cách để tăng tốc pyschedule [e. g. xem các nhóm nhiệm vụ và tham số bộ giải]. Cũng có thể xây dựng các phương pháp phỏng đoán dựa trên pyschedule để giải quyết các vấn đề lập lịch quy mô lớn

Làm thế nào để bắt đầu

Khi tạo một kịch bản bằng cách sử dụng pyschedule, các thao tác nhập sau đây được khuyến nghị

from pyschedule import Scenario, solvers, plotters, alt

Điều này cho phép tạo ra một kịch bản

S = Scenario['hello_world',horizon=10]

Kịch bản này được đặt tên là

S = Scenario['hello_world',horizon=10]
8 và có khoảng thời gian là 10 giai đoạn. Mức độ chi tiết của các khoảng thời gian phụ thuộc vào vấn đề của bạn, e. g. một khoảng thời gian có thể là một giờ, một tuần hoặc một ngày. Tuy nhiên, có hơn 100 tiết khiến cho việc tính toán một lịch trình khá khó khăn. Một số thủ thuật để giảm số lượng thời gian là

  • Xóa các khoảng thời gian không được sử dụng, chẳng hạn như giờ trong đêm
  • Di chuyển đến mức độ chi tiết cao hơn, e. g. thử mức độ chi tiết là 2 giờ thay vì 1 giờ và làm tròn nhiệm vụ nếu cần

Chúng tôi cần ít nhất một tài nguyên trong một kịch bản

R = S.Resource['R']

Thật thuận tiện khi có các tên biến và tài nguyên giống hệt nhau, chẳng hạn như

S = Scenario['hello_world',horizon=10]
9. Trong mỗi khoảng thời gian, một số nhiệm vụ có thể được lên lịch cho khoảng thời gian này. Tài nguyên có thể là bất cứ thứ gì từ con người đến đồ vật như máy móc trong nhà máy. Chỉ yêu cầu rằng một tài nguyên có thể được sử dụng bởi nhiều nhất một nhiệm vụ trong mỗi khoảng thời gian

Tiếp theo, chúng tôi thêm một nhiệm vụ vào kịch bản

T = S.Task['T',length=1,delay_cost=1]

Nhiệm vụ này có độ dài là 1, tức là chỉ cần 1 tiết để hoàn thành. Vì 1 là độ dài mặc định của một nhiệm vụ, chúng tôi sẽ không phải đặt điều này một cách rõ ràng. Hơn nữa, chúng tôi đặt chi phí trì hoãn là 1, nghĩa là trì hoãn công việc này trong một khoảng thời gian sẽ làm tăng chi phí của lịch trình lên 1, điều này thúc đẩy hoàn thành nhiệm vụ này càng sớm càng tốt

Chúng tôi xác định rằng nhiệm vụ

R = S.Resource['R']
0 yêu cầu tài nguyên
S = Scenario['hello_world',horizon=10]
9 như sau

INFO: execution time for solving mip [sec] = 0.025493860244750977
INFO: objective = 1.0
[[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]
2

Sau đó, chúng tôi tính toán và in một lịch trình như sau

INFO: execution time for solving mip [sec] = 0.025493860244750977
INFO: objective = 1.0
[[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]
3

INFO: execution time for solving mip [sec] = 0.025493860244750977
INFO: objective = 1.0
[[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]
0

Đầu ra đầu tiên hiển thị thời gian cần thiết để giải quyết vấn đề. Ngoài ra, mục tiêu được vẽ. Vì chi phí của lịch trình này chỉ là chi phí chậm trễ của nhiệm vụ

R = S.Resource['R']
0, là lịch trình trong khoảng thời gian 0, nên tổng chi phí cũng bằng 0. Cách tiêu chuẩn để trình bày một lịch trình là một danh sách các cặp tài nguyên nhiệm vụ với các yêu cầu về thời gian. e. g. đầu ra ở trên nói rằng nhiệm vụ
R = S.Resource['R']
0 nên được lên lịch trên tài nguyên
S = Scenario['hello_world',horizon=10]
9 từ giai đoạn 0 đến 1

chi phí

Không cần thiết phải xác định chi phí trong một kịch bản. Trong trường hợp này, người giải sẽ cố gắng tìm một lịch trình khả thi. Không xác định bất kỳ chi phí đôi khi thậm chí sẽ tăng tốc độ tính toán. Tuy nhiên, trong hầu hết các trường hợp, thiết lập ít nhất một số chi phí chậm trễ có ý nghĩa

Chi phí chậm trễ

Chúng tôi đặt chi phí chậm trễ của một nhiệm vụ thành 1 như sau

INFO: execution time for solving mip [sec] = 0.025493860244750977
INFO: objective = 1.0
[[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]
1

Điều này có nghĩa là nếu nhiệm vụ này được lên lịch trong khoảng thời gian 0, thì sẽ không có chi phí chậm trễ, nếu nó được lên lịch trong khoảng thời gian 1, sẽ có tổng chi phí là 1, v.v. Do đó, thật hợp lý khi lên lịch cho nhiệm vụ này càng sớm càng tốt. Lưu ý rằng chi phí trì hoãn cũng có thể âm, trong trường hợp đó, một nhiệm vụ sẽ được đẩy đến cuối lịch trình. Cũng lưu ý rằng một nhiệm vụ có chi phí trễ cao hơn có nhiều khả năng được lên lịch sớm hơn nếu không có ràng buộc nào khác ngăn cản điều này. Chi phí chậm trễ mặc định là

R = S.Resource['R']
5

lịch trình chi phí

Chi phí lịch trình có thể được sử dụng cho các nhiệm vụ tùy chọn, nghĩa là chúng tôi cung cấp một số phần thưởng tích cực hoặc tiêu cực nếu một nhiệm vụ được lên lịch

INFO: execution time for solving mip [sec] = 0.025493860244750977
INFO: objective = 1.0
[[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]
2

INFO: execution time for solving mip [sec] = 0.025493860244750977
INFO: objective = 1.0
[[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]
3

Trong lịch trình ở trên, việc lập lịch trình cho nhiệm vụ

R = S.Resource['R']
6 với chi phí theo lịch trình -1 sẽ giảm tổng chi phí xuống 1, nhưng sau đó chúng ta sẽ phải lên lịch trình cho cả hai nhiệm vụ
R = S.Resource['R']
7 và
R = S.Resource['R']
6, và do đó một trong số chúng sẽ phải bắt đầu trong giai đoạn 2. Điều này sẽ dẫn đến một chi phí chậm trễ bổ sung là 2. Do đó, sẽ hợp lý hơn nếu không lên lịch cho
R = S.Resource['R']
6

Chi phí tài nguyên

Sử dụng tài nguyên trong một số khoảng thời gian có thể ngụ ý chi phí tài nguyên bổ sung

INFO: execution time for solving mip [sec] = 0.025493860244750977
INFO: objective = 1.0
[[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]
4

INFO: execution time for solving mip [sec] = 0.025493860244750977
INFO: objective = 1.0
[[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]
5

Tổng chi phí của lịch trình được tính toán là 5 mặc dù nhiệm vụ đơn lẻ được lên lịch trong giai đoạn đầu tiên. Điều này là do thực tế là việc lên lịch cho bất kỳ nhiệm vụ nào đều tốn 5 tài nguyên

S = Scenario['hello_world',horizon=10]
9

Danh sách nhiệm vụ và tài nguyên

Để đơn giản hóa việc xác định nhiệm vụ, có thể xác định danh sách nhiệm vụ

INFO: execution time for solving mip [sec] = 0.025493860244750977
INFO: objective = 1.0
[[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]
6

INFO: execution time for solving mip [sec] = 0.025493860244750977
INFO: objective = 1.0
[[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]
7

Chúng tôi đã tạo 5 tác vụ có độ dài 1 và chi phí trì hoãn 1. Chỉ mục của các nhiệm vụ được thêm vào cuối tên nhiệm vụ đã cho. Do đó, tránh tên nhiệm vụ kết thúc bằng chữ số. Lưu ý rằng cũng có thể tạo tất cả các tác vụ một cách riêng biệt. Nhưng nếu chúng tương tự nhau, thì điều này đơn giản hóa định nghĩa về các vấn đề lập lịch trình. Cuối cùng, chúng ta có thể định nghĩa tương tự các danh sách tài nguyên

INFO: execution time for solving mip [sec] = 0.025493860244750977
INFO: objective = 1.0
[[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]
8

INFO: execution time for solving mip [sec] = 0.025493860244750977
INFO: objective = 1.0
[[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]
9

Chỉ định tài nguyên

Có thể gán nhiều tài nguyên cho một tác vụ, chúng tôi xác định rằng một trong những tài nguyên này là bắt buộc hoặc tất cả

plotters.matplotlib.plot[S,img_filename='pics/household.png']
0

plotters.matplotlib.plot[S,img_filename='pics/household.png']
1

Lưu ý rằng nếu chúng ta có một danh sách các tài nguyên, như trên, chúng ta cũng có thể sử dụng toán tử

T = S.Task['T',length=1,delay_cost=1]
1

plotters.matplotlib.plot[S,img_filename='pics/household.png']
2

Bây giờ chúng ta có thể giải quyết tình huống này

plotters.matplotlib.plot[S,img_filename='pics/household.png']
3

plotters.matplotlib.plot[S,img_filename='pics/household.png']
4

Do đó,

R = S.Resource['R']
7 được lên lịch trên tài nguyên
T = S.Task['T',length=1,delay_cost=1]
3 trong giai đoạn 0 và
R = S.Resource['R']
6 trên tài nguyên
T = S.Task['T',length=1,delay_cost=1]
3 và
T = S.Task['T',length=1,delay_cost=1]
6 trong giai đoạn 1

Phụ thuộc tài nguyên

Thường cần đảm bảo rằng hai tác vụ chọn cùng một tài nguyên

plotters.matplotlib.plot[S,img_filename='pics/household.png']
5

plotters.matplotlib.plot[S,img_filename='pics/household.png']
6

Bây giờ chúng ta có thể giải quyết tình huống này

plotters.matplotlib.plot[S,img_filename='pics/household.png']
3

plotters.matplotlib.plot[S,img_filename='pics/household.png']
8

Sẽ tốt hơn nếu phân phối hai nhiệm vụ cho hai tài nguyên. Tuy nhiên, do các phụ thuộc tài nguyên được xác định, chúng phải được gán cho cùng một tài nguyên

Hạn chế thời gian

Chúng tôi có thể hạn chế các khoảng thời gian khi một công việc có thể được lên lịch hoặc khi có sẵn tài nguyên

plotters.matplotlib.plot[S,img_filename='pics/household.png']
9

pip install pyschedule
0

Rõ ràng, do các hạn chế về thời gian, khoảng thời gian duy nhất có thể để lên lịch cho nhiệm vụ

R = S.Resource['R']
0 là 3

giới hạn

Một cách khác để hạn chế khoảng thời gian khi một tác vụ có thể được lên lịch là giới hạn

pip install pyschedule
1

pip install pyschedule
2

Ràng buộc này là một ràng buộc lỏng lẻo, nghĩa là, nhiệm vụ _______ 70 có thể được lên lịch tại bất kỳ thời điểm nào sau giai đoạn 1. Nếu chúng tôi muốn thực thi khi chính xác

R = S.Resource['R']
0 được lên lịch, chúng tôi có thể sử dụng ràng buộc chặt chẽ. e. g. để buộc
R = S.Resource['R']
0 lên lịch chính xác sau tiết 1, chúng ta có thể viết

pip install pyschedule
3

ưu tiên

Các tác vụ thường cần được lên lịch theo một thứ tự nhất định

pip install pyschedule
4

pip install pyschedule
5

Vì nhiệm vụ

R = S.Resource['R']
7 bị trì hoãn hai giai đoạn, chúng tôi nhận được tổng chi phí trì hoãn là 4. Nếu chúng tôi không có ràng buộc về quyền ưu tiên, chúng tôi có thể lên lịch cho
R = S.Resource['R']
7 trước và chỉ nhận được chi phí trì hoãn 1. Lưu ý rằng
INFO: execution time for solving mip [sec] = 0.025493860244750977
INFO: objective = 1.0
[[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]
23 là tùy chọn

Chúng tôi gọi đây là ràng buộc ưu tiên lỏng lẻo. Tương tự như các ràng buộc chặt chẽ, các ràng buộc ưu tiên chặt chẽ cũng đảm bảo rằng các công việc được thực hiện trực tiếp sau nhau

pip install pyschedule
6

pip install pyschedule
7

R = S.Resource['R']
7 có chi phí chậm trễ âm nên nó sẽ được đẩy đến cuối lịch trình, nhưng ràng buộc về quyền ưu tiên chặt chẽ đảm bảo rằng nó được lên lịch hai giai đoạn sau khi
R = S.Resource['R']
6 kết thúc. Nếu chi phí chậm trễ của
R = S.Resource['R']
6 sẽ nhỏ hơn
R = S.Resource['R']
7, thì cả hai nhiệm vụ sẽ được đẩy đến cuối lịch trình

Ưu tiên có điều kiện

Các ràng buộc ưu tiên thường được yêu cầu chỉ được áp dụng nếu hai tác vụ được gán cho cùng một tài nguyên, e. g. nếu chúng tôi muốn đảm bảo rằng một tác vụ nhất định là tác vụ cuối cùng chạy trên một số tài nguyên

pip install pyschedule
8

pip install pyschedule
9

Quyền ưu tiên có điều kiện đầu tiên ngụ ý rằng nếu nhiệm vụ

R = S.Resource['R']
0 được lên lịch vào ngày
INFO: execution time for solving mip [sec] = 0.025493860244750977
INFO: objective = 1.0
[[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]
29, thì
INFO: execution time for solving mip [sec] = 0.025493860244750977
INFO: objective = 1.0
[[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]
30 sẽ được lên lịch sau đó. Do đó, cho phép
INFO: execution time for solving mip [sec] = 0.025493860244750977
INFO: objective = 1.0
[[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]
31 được lên lịch trong cùng khoảng thời gian với
R = S.Resource['R']
0 vì
R = S.Resource['R']
0 không được lên lịch vào
INFO: execution time for solving mip [sec] = 0.025493860244750977
INFO: objective = 1.0
[[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]
34

công suất

Các ràng buộc về năng lực có thể được sử dụng để hạn chế số lượng tác vụ được thực hiện trong một khoảng thời gian nhất định

from pyschedule import Scenario, solvers, plotters, alt
0

from pyschedule import Scenario, solvers, plotters, alt
1

Do hạn chế về năng lực, một nhiệm vụ được lên lịch sau tiết 5. Nếu không được xác định khác, giới hạn năng lực được áp dụng cho độ dài của nhiệm vụ. Nghĩa là, tổng độ dài của các nhiệm vụ trước giai đoạn 5 được yêu cầu nhiều nhất là 3. Chúng ta có thể làm cho điều này rõ ràng hơn bằng cách viết

from pyschedule import Scenario, solvers, plotters, alt
2

Cuối cùng, nếu chúng ta muốn giới hạn giá trị lớn nhất thay vì tổng, chúng ta có thể viết

from pyschedule import Scenario, solvers, plotters, alt
3

Nhiệm vụ phi đơn vị

Các trường hợp độ dài nhiệm vụ lớn hơn đáng được xử lý đặc biệt

from pyschedule import Scenario, solvers, plotters, alt
4

from pyschedule import Scenario, solvers, plotters, alt
5

Nhiệm vụ

R = S.Resource['R']
0 phải bắt đầu trong giai đoạn 2 do hạn chế về năng lực. Điều này là có thể bởi vì độ dài của phần nhiệm vụ này nằm trong giới hạn năng lực là 3. Cụ thể, phần dự kiến ​​ở tiết 2,3 và 4. Điều này nói chung, một nhiệm vụ đóng góp vào một giới hạn năng lực tiêu chuẩn tỷ lệ thuận với mức độ trùng lặp của nó với giới hạn năng lực. Điều này khái quát hóa thành các thuộc tính tác vụ do người dùng xác định như được mô tả trong phần tiếp theo

Thuộc tính tác vụ do người dùng xác định

Chúng ta có thể áp dụng các ràng buộc về năng lực cho tất cả các thuộc tính của nhiệm vụ, không chỉ độ dài của nhiệm vụ mà còn cả các thuộc tính do người dùng xác định

from pyschedule import Scenario, solvers, plotters, alt
6

from pyschedule import Scenario, solvers, plotters, alt
7

INFO: execution time for solving mip [sec] = 0.025493860244750977
INFO: objective = 1.0
[[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]
36 không thêm bất kỳ thứ gì vào tổng các giá trị thuộc tính của tôi trước giai đoạn 5, nên tất cả các tác vụ có thể được lên lịch trước giai đoạn này

Sự khác biệt giới hạn

Cách mặc định để tổng hợp trong phạm vi giới hạn năng lực là tóm tắt. Mặt khác, nếu chúng ta muốn đảm bảo rằng một số thuộc tính không thay đổi quá nhiều theo thời gian, chúng ta cũng có thể hạn chế tổng chênh lệch của thuộc tính này.

from pyschedule import Scenario, solvers, plotters, alt
8

from pyschedule import Scenario, solvers, plotters, alt
9

Lưu ý rằng nếu chúng ta không xác định phạm vi của giới hạn dung lượng như trên, thì giới hạn đó sẽ được áp dụng cho toàn bộ thời gian. Trong kịch bản trên, sẽ có lợi nếu lên lịch cho các tác vụ

INFO: execution time for solving mip [sec] = 0.025493860244750977
INFO: objective = 1.0
[[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]
36 và
INFO: execution time for solving mip [sec] = 0.025493860244750977
INFO: objective = 1.0
[[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]
38 càng sớm càng tốt, vì chúng có chi phí chậm trễ cao hơn. Tuy nhiên, nếu sắp xếp chúng lần lượt trong các giai đoạn 0 và 1, và ngay sau đó là
INFO: execution time for solving mip [sec] = 0.025493860244750977
INFO: objective = 1.0
[[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]
39 và
INFO: execution time for solving mip [sec] = 0.025493860244750977
INFO: objective = 1.0
[[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]
00, thì thuộc tính của tôi trước tiên sẽ tăng 1 trong giai đoạn 2 và sau đó lại giảm xuống 1 trong giai đoạn 4, dẫn đến tổng chênh lệch là 2

Ràng buộc dung lượng

INFO: execution time for solving mip [sec] = 0.025493860244750977
INFO: objective = 1.0
[[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]
01 giới hạn tổng số lần tăng và giảm. Nếu chúng ta chỉ muốn giới hạn tăng hoặc giảm, thì chúng ta có thể sử dụng
INFO: execution time for solving mip [sec] = 0.025493860244750977
INFO: objective = 1.0
[[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]
02 hoặc
INFO: execution time for solving mip [sec] = 0.025493860244750977
INFO: objective = 1.0
[[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]
03 tương ứng

Kết hợp các ràng buộc

Chúng ta có thể kết hợp các ràng buộc năng lực làm số học tự nhiên

S = Scenario['hello_world',horizon=10]
0

S = Scenario['hello_world',horizon=10]
1

Vì một tác vụ được lên lịch trong khoảng thời gian 0, nên chúng tôi không thể lên lịch cho bất kỳ tác vụ nào nữa trong khoảng thời gian từ 0 đến 2 hoặc trong khoảng thời gian từ 5 đến 6. Do đó, chúng tôi dồn vào hai nhiệm vụ trong tiết 3 và 4 và một nhiệm vụ trong tiết 7

Nhóm nhiệm vụ

Thường có sự dư thừa nhiệm vụ trong một dự án lập kế hoạch, e. g. có thể có một nhóm các nhiệm vụ có thể hoán đổi cho nhau. Nghĩa là, chúng có thể được hoán đổi trong lịch trình mà không làm thay đổi chi phí hoặc tính khả thi của nó. Cung cấp thông tin này trong thuộc tính

INFO: execution time for solving mip [sec] = 0.025493860244750977
INFO: objective = 1.0
[[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]
04, điều này có thể được người giải khai thác để thường xuyên tăng tốc đáng kể quá trình tính toán

S = Scenario['hello_world',horizon=10]
2

S = Scenario['hello_world',horizon=10]
3

Chạy cái này với cài đặt

INFO: execution time for solving mip [sec] = 0.025493860244750977
INFO: objective = 1.0
[[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]
05 chỉ làm tăng một chút thời gian chạy, nhưng có những tình huống mà sự khác biệt này đáng kể hơn nhiều

S = Scenario['hello_world',horizon=10]
4

THẬN TRỌNG. kết hợp các nhóm nhiệm vụ với khả năng phụ thuộc vào tài nguyên có thể không hoạt động trong một số trường hợp

Tham số bộ giải

Chương trình phụ trợ pyschedule mặc định là một công thức số nguyên hỗn hợp được lập chỉ mục theo thời gian [MIP]. Có các thông số sau

  • tin nhắn. bật/tắt hiển thị thông tin [mặc định là 0]
  • thời gian giới hạn. giới hạn thời gian giải tính bằng giây [mặc định là Không có]
  • ratio_gap. dừng quá trình giải khi đạt đến khoảng cách tích phân này, e. g. 1. 2 là viết tắt của khoảng cách 20% đến mức tối ưu [mặc định là Không có]
  • hạt giống ngẫu nhiên. hạt giống ngẫu nhiên được sử dụng bởi bộ giải [mặc định là 42]
  • Tốt bụng. chương trình phụ trợ Lập trình số nguyên để sử dụng. Giá trị mặc định là
    INFO: execution time for solving mip [sec] = 0.025493860244750977
    INFO: objective = 1.0
    [[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]
    
    06 được cài đặt sẵn trong gói
    INFO: execution time for solving mip [sec] = 0.025493860244750977
    INFO: objective = 1.0
    [[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]
    
    07. Nếu SCIP đã được cài đặt [lệnh
    INFO: execution time for solving mip [sec] = 0.025493860244750977
    INFO: objective = 1.0
    [[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]
    
    08 phải đang chạy], bạn có thể sử dụng
    INFO: execution time for solving mip [sec] = 0.025493860244750977
    INFO: objective = 1.0
    [[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]
    
    09. Cuối cùng, nếu bạn đã cài đặt CPLEX [lệnh
    INFO: execution time for solving mip [sec] = 0.025493860244750977
    INFO: objective = 1.0
    [[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]
    
    10 phải đang chạy], bạn có thể sử dụng
    INFO: execution time for solving mip [sec] = 0.025493860244750977
    INFO: objective = 1.0
    [[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]
    
    11

E. g. cái này có thể được sử dụng như sau

S = Scenario['hello_world',horizon=10]
5

Thông số máy vẽ

Chương trình phụ trợ pyschedule mặc định để vẽ lịch trình là matplotlib. Một số thông số là

  • img_filename. viết cốt truyện dưới dạng tệp
    INFO: execution time for solving mip [sec] = 0.025493860244750977
    INFO: objective = 1.0
    [[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]
    
    12 [mặc định là Không có]
  • fig_size. kích thước của cốt truyện [mặc định là [15,5]]
  • resource_height. chiều cao của tài nguyên trong cốt truyện [mặc định là 1]
  • show_task_labels. hiển thị nhãn của các tác vụ trong cốt truyện [mặc định là True]
  • hide_t task. danh sách các nhiệm vụ không vẽ [mặc định là []]
  • hide_resources. danh sách các tài nguyên cần ẩn trong cốt truyện [mặc định là []]
  • task_colors. ánh xạ các tác vụ thành màu sắc [mặc định là từ điển trống]
  • vertical_text. viết nhãn nhiệm vụ theo chiều dọc [mặc định nếu Sai]

E. g. cái này có thể được sử dụng như sau

S = Scenario['hello_world',horizon=10]
6

LƯU Ý CUỐI CÙNG. pyschedule đang được phát triển tích cực, có thể có những thay đổi không tương thích ngược

Chủ Đề