Đ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]]
2Sau đó, 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]]
3INFO: 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]]
2INFO: execution time for solving mip [sec] = 0.025493860244750977
INFO: objective = 1.0
[[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]
3Trong 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]]
4INFO: execution time for solving mip [sec] = 0.025493860244750977
INFO: objective = 1.0
[[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]
5Tổ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]]
6INFO: execution time for solving mip [sec] = 0.025493860244750977
INFO: objective = 1.0
[[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]
7Chú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]]
8INFO: execution time for solving mip [sec] = 0.025493860244750977
INFO: objective = 1.0
[[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]
9Chỉ đị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
0Rõ 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
1pip install pyschedule
2Rà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
4pip install pyschedule
5Vì 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ọnChú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
6pip install pyschedule
7Vì
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
8pip install pyschedule
9Quyề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]]
34cô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, alt0
from pyschedule import Scenario, solvers, plotters, alt1
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, alt2
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, alt3
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, alt4
from pyschedule import Scenario, solvers, plotters, alt5
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, alt6
from pyschedule import Scenario, solvers, plotters, alt7
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 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àySự 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, alt8
from pyschedule import Scenario, solvers, plotters, alt9
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à 2Rà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 ứngKế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ánS = 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ềuS = 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à
06 được cài đặt sẵn trong góiINFO: 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ệnhINFO: 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ụngINFO: 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ệnhINFO: 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ụngINFO: execution time for solving mip [sec] = 0.025493860244750977 INFO: objective = 1.0 [[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]
11INFO: execution time for solving mip [sec] = 0.025493860244750977 INFO: objective = 1.0 [[clean, Alice, 0, 3], [cook, Bob, 0, 1], [wash, Bob, 1, 3]]
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
12 [mặc định là Không 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]]
- 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