Tải bản đầy đủ (.pdf) (14 trang)

báo cáo tối ưu lập kế hoạch back tracking with branch and bound

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.49 MB, 14 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

<b>0.1 Back tracking with branch and bound</b>

<b>Ý tưởng: Sử dụng 2 mảng</b>xvàyđể lưu thứ tự khách hàng được phục vụ. Trong đó,•y<small>k</small>chỉ khách hàng đầu tiên được phụ vụ bởi nhân viênk, vớik= 1, ..., K.•x<small>i</small>chỉ khách hàng sau được phục vụ sau khách hàngi, vớii= 1, ...N

<b>Hình 0.1: Ví dụ cho biểu diễn phương pháp quay lui.</b>

</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

<b>Algorithm 1: Backtracking for Vehicle Routing Problem</b>

<b>Input: Cost matrix , Number of vehicles , Number of customers</b>C K N

<b>Output: Optimal routes for vehicles</b>

Initialize arrays X, Y , andvisited;Setfbest← ∞;

Set initial routes in ;Y

<b>while</b>not all configurations tried<b>do</b>

Generate new configurations for ;Y

<b>for k ∈ {1, 2, . . . , K} do: TryY(k);for i ∈ Y do: TryX(i, k where</b>Y[k] = i);Update f<small>best</small>if a better solution is found;

<b>Procedure TryY( );</b>k

<b>foreach</b>i∈ {0, 1, . . . , N }<b>do:if</b><i><b>CheckY</b>(i, k)</i><b>then</b>

Y[k] ← i;visited i[ ] ← 1;

<b>TryY(</b>k+ 1);visited i[ ] ← 0;

<b>Procedure TryX(</b>i, k);

<b>foreach</b>v∈ {0, 1, . . . , N }<b>do:if</b><i><b>CheckX</b>(v, i, k)</i><b>then</b>

X[i] ← v;visited[v] ← 1;

<b>TryX(</b>v, k);visited[v] ← 0;

<b>Return Optimal routes as determined by X and ;</b>Y

2

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

<b>0.2 Local search</b>

<b>0.2.1 Relocate operator</b>

Phép toán này bao gồm việc di chuyển một khách hàng từ một tuyến đường này sangmột tuyến đường khác. Cụ thể, khách hàng từ tuyến đườngi r<small>0</small>sẽ được loại bỏ khỏir<small>0</small>và chèn vào tuyến đườngr<small>1</small>tại vị trí , nơi màp r<small>0</small>=r<small>1</small>và0 ≤ p ≤ |r<small>1</small>|.

Ví dụ, trong Hình 0.7, khách hàngc<small>4</small>được di chuyển từ tuyến đườngr<small>1</small>sang tuyếnđường .r<small>0</small>

<b>Hình 0.2: Ví dụ cho relocate operator.</b>

<b>0.2.2 Swap operator</b>

Phép toán này bao gồm việc đổi chỗ hai khách hàng từ hai tuyến đường khác nhau.Nó có thể được xem như một sự di chuyển kép, trong đó các khách hàng được chèn vàovị trí tương ứng của nhau trong tuyến đường. Một cách chính thức hơn, khách hàngc<small>i</small>tạivị tríp<small>i</small>trong tuyến đườngr<small>0</small>được di chuyển đến vị tríp<small>j</small>trong tuyến đường , trong khir<small>1</small>khách hàngc<small>j</small>tại vị tríp<small>j</small>trong tuyến đườngr<small>1</small>được di chuyển đến vị tríp<small>i</small>trong tuyếnđường .r<small>0</small>

Trong hình 0.7, khách hàngc<small>6</small>từ tuyến đườngr<small>1</small>và khách hàngc<small>5</small>từ tuyến đườngr<small>0</small>được đổi chỗ theo vị trí tương ứng của họ.

3

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

<b>Hình 0.3: Ví dụ cho swap operator.</b>

<b>0.2.3K-Exchange operator</b>

Phép tốn này, còn được gọi là k-opt, bao gồm việc loại bỏkcạnh trong cùng mộttuyến đường và sau đó kết nối lại các đoạn đường còn lại bằng các cạnh khác. Kết quảlà, một số đoạn có thể được đảo ngược. Một cách chính thức, nó bao gồm việc loại bỏkcạnh mà các điểm cuối của chúng nằm ở các vị trí< p<small>0</small>p<small>1</small>. . . p<small>k</small>>trên tuyến đường.Mục tiêu là kết nối lại các đoạn đường theo một trật tự khác nhau. Phép tốn này có thểđược định nghĩa cho bất kỳ số lượng cạnh nào bắt đầu từ hai. Tuy nhiên, việc tính tốntất cả các sự trao đổi có thể địi hỏi rất nhiều tài ngun. Vì vậy, phép tốn thường đượcgiới hạn ở sự trao đổi 2-cạnh hoặc 3-cạnh.

Ví dụ về phép toán trao đổi 2-cạnh và trao đổi 3-cạnh được mơ tả trong Hình 0.8.Trong trường hợp đầu tiên, hai cạnh được loại bỏ vớic<small>1</small>vàc<small>7</small>là điểm cuối. Tuyến đườngkết quả là một tuyến đường mới chứa đoạn bắt đầu từc<small>1</small>và kết thúc ởc<small>3</small>theo hình thứcđảo ngược.

Trong trường hợp thứ hai, các cạnh này cóc<small>1</small>,c<small>4</small>vàc<small>6</small>là điểm cuối. Do đó, chúng tathu được hai đoạn đường bắt đầu từc<small>1</small>vàc<small>4</small>và kết thúc tạic<small>2</small>vàc<small>7</small>tương ứng. Đoạn thứhai được theo dõi trước tiên theo cùng một trật tự. Sau đó, đoạn đầu tiên được theo dõitheo trật tự đảo ngược.

4

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

<b>Hình 0.4: Ví dụ cho relocate operator.</b>

<b>0.2.4 Cross operator</b>

Phép tốn này cắt hai tuyến đường khác nhau thành hai phần và tái cấu trúc chúngbằng cách sử dụng các cạnh chéo. Một cách chính thức, nó trao đổi các đoạn từ tuyếnđườngr<small>1</small>vàr<small>2</small>bắt đầu từ khách hàngc<small>i</small>vàc<small>j</small>tương ứng và kết thúc ở kho, nơir<small>1</small>= r<small>2</small>.

<b>Hình 0.5: Ví dụ cho relocate operator.</b>

5

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

<b>0.3 Constraints programming0.3.1 Biến</b>

•y<small>k</small>để chỉ trạng thái hoạt động của nhân viên k, nếuy<small>k</small>= 1tức là nhân viên hoạtkđộng, ngược lại,y<small>k</small>= 0nhân viênkkhơng hoạt động.

<small>i,j</small>= 0thì cung(i, j)khơng thuộc hành trình của nhân viên .k

•max_work time_ Thời gian làm việc lớn nhất của một nhân viên nào đó.

<b>0.3.2 Ràng buộc</b>

• Mỗi khách hàng chỉ được bảo trì bởi một nhân viên.<small>K</small>

x<small>i,j</small><sup>k</sup> =<small>N</small>X<small>i=0</small>

x<sup>k</sup><small>j,i</small>,∀j = 0, ..., N; k= 1, ..., K (2)• Mỗi nhân viên bắt đầu từ 0 và kết thúc tại 0.

x<sup>k</sup><sub>0,j</sub>= y<small>k</small>

jđược bảo trì sau khách hàngi).Nếux<small>k</small>

<small>i,j</small>= 1thìp<sup>j</sup><sub>k</sub>≥ p<small>ik</small>+ 1,

∀ i= j;i= 0, ..., N j = 1; , ..., N; k= 1, ..., K (6)• Để tối ưu thời gian chạy code, giả sử các nhân viên được sắp xếp sao cho nếu nhânviên k hoạt động thì nhân viên k+1 cũng phải hoạt động (dồn tất cả nhân viên khônghoạt động lên đầu, để tránh trường hợp hoán vị).

6

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

y ≤y ,∀k = 1, ..., K − 1 (7)• Thời gian làm việc lớn nhất.

max work_ _time≥<small>N</small>X<small>i=0</small>

x<sup>k</sup><sub>i,j</sub>× (d<small>j</small>+ t<small>i,j</small>) , ∀k = 1, ..., K (8)• Miền giá trị của các biến.

•<sup>y</sup><sup>k</sup>để chỉ trạng thái hoạt động của nhân viên k, nếuy<small>k</small>= 1tức là nhân viên hoạtkđộng, ngược lại,y<small>k</small>= 0nhân viênkkhơng hoạt động.

•<sup>p</sup><small>i</small><sup>k</sup>để chỉ thứ tự của khách hàng thứ trong hành trình của nhân viên .i k•x<small>k</small>

<small>i,j</small>chỉ cung(i, j)có thuộc hành trình của nhân viênkhay khơng. Nếux<small>ki,j</small> = 1thì cung(i, j)thuộc hành trình của nhân viên . Ngược lại,k x<small>k</small>

<small>i,j</small>= 0thì cung(i, j)khơng thuộc hành trình của nhân viên .k

•max_work time_ Thời gian làm việc lớn nhất của một nhân viên nào đó.

<b>0.4.2 Ràng buộc</b>

• Mỗi khách hàng chỉ được bảo trì bởi một nhân viên.<small>K</small>

• Đến và rời khỏi khách hàng bởi cùng một nhân viên.<small>N</small>

<small>j,i</small>,∀j = 0, ..., N; k= 1, ..., K (14)

7

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

x<small>k0,j</small>= y<small>k</small>

• Nhân viên cần di chuyển đến các khách hàng.x<small>k</small>

<small>i,i</small>= 0,∀i= 0, ..., N; ∀k= 1, ..., K (17)• Loại bỏ sub-tour (Nếu cung(i, j)thuộc hành trình của nhân viên thì khách hàngk

jđược bảo trì sau khách hàngi).

M x<sub>i,j</sub><sup>k</sup>− 1 + p<sup>i</sup><small>k</small>+ 1 ≤ p<small>kj</small>

∀ i= j; j = 1, ..., N; i= 1, ..., N; k= 1, ..., K (18)• Để tối ưu thời gian chạy code, giả sử các nhân viên được sắp xếp sao cho nếu nhânviên k hoạt động thì nhân viên k+1 cũng phải hoạt động (dồn tất cả nhân viên khônghoạt động lên đầu, để tránh trường hợp hốn vị).

• Thời gian làm việc lớn nhất.

max work_ _time≥<small>N</small>X<small>i=0</small>

<small>i,j</small>× (d<small>j</small>+ t<small>i,j</small>) , ∀k = 1, ..., K (20)• Miền giá trị của các biến.

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

<b>0.5 Tham lam0.5.1 Greedy 1</b>

<b>• Ý tưởng: Tập các khách hàng chưa được phục vụ được sắp xếp theo thứ tự tăng dần</b>

về thời gian (thời gian di chuyển + thời gian bảo trì) so với cơng ty0("gần"). Sauđó các khách hàng được thêm vào các tuyến của nhân viên sao cho làm giá trị củahàm mục tiêu tăng ít nhất. Nếu khơng làm tăng giá trị hàm mục tiêu, khách hàngđược thêm vào tuyến của nhân viên đang có thời gian làm việc ngắn nhất.

<b>• Sơ đồ giải thuậtAlgorithm 2: Greedy 1</b>

P← tập khách hàng;

Sắp xếp theo thứ tự "gần" công ty;

<i><b>while P khác rỗng do</b></i>

Lấy khách hàng đầu c trong ;P

Q← tập các nhân viên có hành trình làm tăng ít giá trị hàm mục tiêu nhất nếu thêmcvào hành trình;

Lựa chọn nhân viên đang có thời gian làm việc nhỏ nhất trongk Q;Thêm c vào hành trình của ;k

Loại bỏ c khỏi ;P

<b>0.5.2 Greedy 2</b>

<b>• Ý tưởng: Tại mỗi bước, mỗi nhân viên sẽ chọn khách hàng tốn ít thời gian nhất để</b>

đi đến. Thứ tự chọn khách hàng của nhân viên được thực hiện lần lượt.

<b>• Sơ đồ giải thuậtAlgorithm 3: Greedy 2</b>

Khởi tạo hành trình của mỗi nhân viên bắt đầu tại 0;k← 1;

<i><b>while Tồn tại khách hàng chưa được phục vụ do</b></i>

Lựa chọn khách hàng tốn ít thời gian nhất thêm vào hành trình của ;kk← (k + 1)%K;

<b>0.6 Tìm kiếm cục bộ0.6.1 Relocate operator</b>

Phép toán này bao gồm việc di chuyển một khách hàng từ một tuyến đường này sangmột tuyến đường khác. Cụ thể, khách hàng từ tuyến đườngi r<small>0</small>sẽ được loại bỏ khỏir<small>0</small>và chèn vào tuyến đườngr<small>1</small>tại vị trí , nơi màp r<small>0</small>=r<small>1</small>và0 ≤ p ≤ |r<small>1</small>|.

Ví dụ, trong Hình 0.7, khách hàngc<small>4</small>được di chuyển từ tuyến đườngr<small>1</small>sang tuyến9

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

Trong hình 0.7, khách hàngc<small>6</small>từ tuyến đườngr<small>1</small>và khách hàngc<small>5</small>từ tuyến đườngr<small>0</small>được đổi chỗ theo vị trí tương ứng của họ.

<b>Hình 0.7: Ví dụ cho swap operator.</b>

10

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

<b>0.6.3K-Exchange operator</b>

Phép tốn này, cịn được gọi là k-opt, bao gồm việc loại bỏkcạnh trong cùng mộttuyến đường và sau đó kết nối lại các đoạn đường còn lại bằng các cạnh khác. Kết quảlà, một số đoạn có thể được đảo ngược. Một cách chính thức, nó bao gồm việc loại bỏkcạnh mà các điểm cuối của chúng nằm ở các vị trí< p<small>0</small>p<small>1</small>. . . p<small>k</small>>trên tuyến đường.Mục tiêu là kết nối lại các đoạn đường theo một trật tự khác nhau. Phép toán này có thểđược định nghĩa cho bất kỳ số lượng cạnh nào bắt đầu từ hai. Tuy nhiên, việc tính tốntất cả các sự trao đổi có thể địi hỏi rất nhiều tài ngun. Vì vậy, phép tốn thường đượcgiới hạn ở sự trao đổi 2-cạnh hoặc 3-cạnh.

Ví dụ về phép tốn trao đổi 2-cạnh và trao đổi 3-cạnh được mơ tả trong Hình 0.8.Trong trường hợp đầu tiên, hai cạnh được loại bỏ vớic<small>1</small>vàc<small>7</small>là điểm cuối. Tuyến đườngkết quả là một tuyến đường mới chứa đoạn bắt đầu từc<small>1</small>và kết thúc ởc<small>3</small>theo hình thứcđảo ngược.

Trong trường hợp thứ hai, các cạnh này cóc<small>1</small>,c<small>4</small>vàc<small>6</small>là điểm cuối. Do đó, chúng tathu được hai đoạn đường bắt đầu từc<small>1</small>vàc<small>4</small>và kết thúc tạic<small>2</small>vàc<small>7</small>tương ứng. Đoạn thứhai được theo dõi trước tiên theo cùng một trật tự. Sau đó, đoạn đầu tiên được theo dõitheo trật tự đảo ngược.

<b>Hình 0.8: Ví dụ cho relocate operator.</b>

11

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

<b>0.6.4 Cross operator</b>

Phép toán này cắt hai tuyến đường khác nhau thành hai phần và tái cấu trúc chúngbằng cách sử dụng các cạnh chéo. Một cách chính thức, nó trao đổi các đoạn từ tuyếnđườngr<small>1</small>vàr<small>2</small>bắt đầu từ khách hàngc<small>i</small>vàc<small>j</small>tương ứng và kết thúc ở kho, nơir<small>1</small>= r<small>2</small>.

<b>Hình 0.9: Ví dụ cho relocate operator.</b>

<b>0.7 Tham lam kết hợp tìm kiếm cục bộ</b>

<b>• Ý tưởng: Sử dụng Giải thuật 2 hoặc Giải thuật 3 để tạo ra lời giải ban đầu, sau đó</b>

tiến hành tìm kiếm các lời giải láng giếng bằng việc hoán đổi một đoạn hành trìnhcủa nhân viên đang có thời gian dài nhất cho một nhân viên khác bất kì.

<b>• Sơ đồ giải thuật</b>

<b>Algorithm 4: GLS1</b>

Khởi tạo lời giải ban đầuSbằng Giải thuật 2;

<i><b>while Điều kiện dừng chưa thỏa mãn do</b></i>

r1← chuyến có thời gian nhiều nhất trong ;Sr2← chuyến bất kì khác r1trong ;Ssub1← đoạn hành trình trên r1;sub2← đoạn hành trình trên r2;

Hoán đổi sub1và sub2tạo thành lời giải mớiS<small>′</small>;

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

<b>Algorithm 5: GLS2</b>

Khởi tạo lời giải ban đầuSbằng Giải thuật 3;

<i><b>while Điều kiện dừng chưa thỏa mãn do</b></i>

r1← chuyến có thời gian nhiều nhất trong ;Sr2← chuyến bất kì khác r1trong ;Ssub1← đoạn hành trình trên r1;sub2← đoạn hành trình trên r2;

Hốn đổi sub1và sub2tạo thành lời giải mớiS<small>′</small>;

<b>Hình 0.11: Lai ghép thứ tự</b>

13

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

<b>Hình 0.12: Đột biến hoán điểm</b>

<b>Bảng 1: Tham số cho giải thuật di truyền.</b>

14

</div>

×