乘用车物流运输计划问题

乘用车物流运输计划问题

介于此题与运筹学知识相关,我们初步运用了线性规划和遗传算法对此做出了分析,遗传算法(Genetic Algorithm)是一类借鉴生物界的进化规律(适者生存,优胜劣汰遗传机制)演化而来的随机化搜索方法。它是由美国的J.Holland教授1975年首先提出,其主要特点是直接对结构对象进行操作,不存在求导和函数连续性的限定;具有内在的隐并行性和更好的全局寻优能力;采用概率化的寻优方法,能自动获取和指导优化的搜索空间,自适应地调整搜索方向,不需要确定的规则。计算程序运用了MATLAB。

考虑到成本问题,影响成本高低的首先是轿运车使用数量;其次,在轿运车使用数量相同情况下,1-1型轿运车的使用成本较低,2-2型较高,1-2型略低于前两者的平均值,但物流公司1-2型轿运车拥有量小,为方便后续任务安排,每次1-2型轿运车使用量不超过1-1型轿运车使用量的20%;再次,在轿运车使用数量及型号均相同情况下,行驶里程短的成本低,注意因为该物流公司是全国性公司,在各地均会有整车物流业务,所以轿运车到达目的地后原地待命,无须放空返回。最后每次卸车成本几乎可以忽略。尽量先把1-2型的装满   然后根据题目说的尽量不留位置所以都是选留下空位较少的那个方案,装完1-2然后再来考虑1-1,剩下的装在1-1,考虑放完的,都是先同样车型放一起。最后在混放如果有剩余的话。

考虑到第四问中涉及到路径最优问题,我们选用最短路径算法解决这类问题。

  >> flag = Passenger_num~=0;

temp Car_carriers(2,1) - (flag(1)*A_2_2(:,1)*Passenger(1,1)+flag(2)*A_2_2(:,2)*Passenger(2,1)...

    +flag(3)*A_2_2(:,3)*Passenger(3,1)+0.1*sum(A_2_2,2));

[~,ib] = min(temp);

temp_res = A_2_2(ib,:);

result = [];

for i = 1:50

    loop_end = round(i/0.2);

    temp = [];

    num = 0;

    for j = 0:100

        for k = 0:100

            if j+k>=loop_end

                con_1 = 3*temp_res(1)*i+2*restrict(1,1)*j;

                con_2 = 3*temp_res(2)*i+2*restrict(2,1)*k;

                if con_1>=Passenger_num(1) && con_2>=Passenger_num(2)

                    num = num+1;

                    temp(num,:) = [i j k];

                    break;

                end

               

            end

        end

    end

    if size(temp,1)>0

        result = [result;temp(1,:)];

        clear temp;

    end

   

end

res(:,1) = result(:,1);

res(:,2) = result(:,2)+result(:,3);

final = [];

final(1,:) = res(1,:);

for i = 2:size(res,1)

    temp = sum(res(i,:))-sum(res(i-1,:));

    if (res(i,1)>res(i-1,1) && res(i,2)>res(i-1,2)) || temp>=0

        continue;

    end

    final = [final;res(i,:)];

end

??? Undefined function or variable 'Passenger_num'.

>> temp_res = [5 4;12 5];

result = [];

for i = 1:50

    loop_end = round(i/0.2);

    temp = [];

    num = 0;

    for j = loop_end:100

       

        con_1 = temp_res(2,1)*i+temp_res(1,1)*j;

        con_2 = temp_res(2,2)*i+temp_res(1,2)*k;

        if con_1>=Passenger_num(2) && con_2>=Passenger_num(3)

            num = num+1;

            temp(num,:) = [i j];

            break;

        end

       

    end

   

    if size(temp,1)>0

        result = [result;temp(1,:)];

        clear temp;

    end

end

res = [];

res(:,1) = result(:,1);

res(:,2) = result(:,2);

final = [];

final(1,:) = res(1,:);

for i = 2:size(res,1)

    temp = sum(res(i,:))-sum(res(i-1,:));

    if (res(i,1)>res(i-1,1) && res(i,2)>res(i-1,2)) || temp>=0

        continue;

    end

    final = [final;res(i,:)];

end

??? Undefined function or variable 'k'.

>> temp_res = [5 1 2;5 12 1];

result = [];

for i = 1:50

    % 剩余多少车

    remain_1 = Passenger_num(1)-temp_res(2,1)*i;

    remain_2 = Passenger_num(2)-temp_res(2,2)*i;

    remain_3 = Passenger_num(3)-temp_res(2,3)*i;

    % 先满足3型车

    res_1 = floor(remain_3/restrict(3,1));

   

    % 尽可能多放1-1上层只放一种

    %%

    % 只放第一种

    remain_3_1 = remain_3-restrict(3,1)*res_1;

    remain_2_1 = remain_2-restrict(2,1)*res_1;

    res_2 = floor(remain_1/restrict(1,1)/2);

    remain_1_1 = remain_1-2*restrict(1,1)*res_2;

    res_3 = 1;

    temp = find(A_1_2(:,3)==remain_3_1);

    for j = 1:size(temp,1)

        temp_res_1 = A_1_2(temp(j),:);

        remain_2_1 = remain_2_1-temp_res_1(2);

        remain_1_1 = remain_1_1-temp_res_1(1);

        flag = remain_1_1<=A_1(:,1) & remain_2_1<=A_1(:,2);

        if sum(flag)==0

            res_3 = 2;

        end

    end

    result = [result;i res_1 res_2 res_3];

end

res(:,1) = result(:,1);

res(:,2) = result(:,2)+result(:,3)+result(:,4);

final = [];

final(1,:) = [res(1,:) 1];

for i = 2:size(res,1)

    temp = sum(res(i,:))-sum(res(i-1,:));

    if (res(i,1)>res(i-1,1) && res(i,2)>res(i-1,2)) || temp>=0

        continue;

    end

    final = [final;res(i,:) i];

end

% 1-1和1-2数量限制

temp = final(:,2)*0.2>=final(:,1);

final_1.final = final(temp,:);

final_1.plan = result(final(temp,3),:);

final = final_1;

??? Undefined function or method 'Passenger_num' for input arguments of type 'double'.

>> function final = cc(Passenger_num)

% 请输入运载矩阵

% 装满的所有情况(加入限制)

%1-1 的第一层所有的情况

% Passenger_num = [100 68 0];

xianzhi;

%% 把最少的情况求出来

if Passenger_num(3) == 0

    case_1;

elseif Passenger_num(1) == 0

    case_2;

else

    case_3;

end

end

??? function final = cc(Passenger_num)

    |

Error: Function definitions are not permitted in this context.

>> cc

??? Undefined function or variable 'cc'.

>> %%

% 车型的矩阵

Passenger = [4.61 1.7 1.51;3.615 1.605 1.394;4.63 1.785 1.77];

% 轿运车的矩阵

Car_carriers = [19 2.7 2.7;24.3 3.5 2.7];

%% 轿运车最多可以放车型个数(紧长度限制)

restrict  = [4 5;5 6;4 5];

% 装满的所有情况(加入限制)

%1-1 的第一层所有的情况

A_1 = [];

num = 0;

%%

for i = 0:restrict(1,1)

    num = num+1;

    temp_sum = 0;

    j = 0;

    while j<=restrict(2,1) && temp_sum<Car_carriers(1,1)

        temp = [i j];

       

        j = j+1;

        temp_sum = i*Passenger(1,1)+j*Passenger(2,1)+0.1*(i+j-1);

    end

    A_1(num,:) = temp;

end

%%

%1-1 的第二层所有的情况

A_1_2 = [];

num = 0;

for i = 0:restrict(1,1)

   

   

    for j = 0:restrict(2,1)

        num = num+1;

        k = 0;

        temp_sum = 0;

        temp_sum = i*Passenger(1,1)+j*Passenger(2,1)+k*Passenger(3,1)+0.1*(i+j+k-1);

        while k<=restrict(3,1) && temp_sum<Car_carriers(1,1)

            temp = [i j k];

            k = k+1;

            temp_sum = i*Passenger(1,1)+j*Passenger(2,1)+k*Passenger(3,1)+0.1*(i+j+k-1);

        end

        A_1_2(num,:) = temp;

    end

    

end

A_1_2 = unique(A_1_2,'rows');

% 装满的所有情况(加入限制)

%1-2 的第一层所有的情况

A_2 = [];

num = 0;

%%

for i = 0:restrict(1,2)

    num = num+1;

    temp_sum = 0;

    j = 0;

    while j<=restrict(2,2) && temp_sum<Car_carriers(2,1)

        temp = [i j];

       

        j = j+1;

        temp_sum = i*Passenger(1,1)+j*Passenger(2,1)+0.1*(i+j-1);

    end

    A_2(num,:) = temp;

end

%%

%1-2 的第二层所有的情况

A_2_2 = [];

num = 0;

for i = 0:restrict(1,2)

   

   

    for j = 0:restrict(2,2)

        num = num+1;

        k = 0;

       

        temp_sum = i*Passenger(1,1)+j*Passenger(2,1)+k*Passenger(3,1)+0.1*(i+j+k-1);

        while k<=restrict(3,2) && temp_sum<Car_carriers(2,1)

            temp = [i j k];

            k = k+1;

            temp_sum = i*Passenger(1,1)+j*Passenger(2,1)+k*Passenger(3,1)+0.1*(i+j+k-1);

        end

        A_2_2(num,:) = temp;

    end

    

end

A_2_2 = unique(A_2_2,'rows');

>> %%

% 车型的矩阵

Passenger = [4.61 1.7 1.51;3.615 1.605 1.394;4.63 1.785 1.77];

% 轿运车的矩阵

Car_carriers = [19 2.7 2.7;24.3 3.5 2.7];

%% 轿运车最多可以放车型个数(紧长度限制)

restrict  = [4 5;5 6;4 5];

% 装满的所有情况(加入限制)

%1-1 的第一层所有的情况

A_1 = [];

num = 0;

%%

for i = 0:restrict(1,1)

    num = num+1;

    temp_sum = 0;

    j = 0;

    while j<=restrict(2,1) && temp_sum<Car_carriers(1,1)

        temp = [i j];

       

        j = j+1;

        temp_sum = i*Passenger(1,1)+j*Passenger(2,1)+0.1*(i+j-1);

    end

    A_1(num,:) = temp;

end

%%

%1-1 的第二层所有的情况

A_1_2 = [];

num = 0;

for i = 0:restrict(1,1)

   

   

    for j = 0:restrict(2,1)

        num = num+1;

        k = 0;

        temp_sum = 0;

        temp_sum = i*Passenger(1,1)+j*Passenger(2,1)+k*Passenger(3,1)+0.1*(i+j+k-1);

        while k<=restrict(3,1) && temp_sum<Car_carriers(1,1)

            temp = [i j k];

            k = k+1;

            temp_sum = i*Passenger(1,1)+j*Passenger(2,1)+k*Passenger(3,1)+0.1*(i+j+k-1);

        end

        A_1_2(num,:) = temp;

    end

    

end

A_1_2 = unique(A_1_2,'rows');

% 装满的所有情况(加入限制)

%1-2 的第一层所有的情况

A_2 = [];

num = 0;

%%

for i = 0:restrict(1,2)

    num = num+1;

    temp_sum = 0;

    j = 0;

    while j<=restrict(2,2) && temp_sum<Car_carriers(2,1)

        temp = [i j];

       

        j = j+1;

        temp_sum = i*Passenger(1,1)+j*Passenger(2,1)+0.1*(i+j-1);

    end

    A_2(num,:) = temp;

end

%%

%1-2 的第二层所有的情况

A_2_2 = [];

num = 0;

for i = 0:restrict(1,2)

   

   

    for j = 0:restrict(2,2)

        num = num+1;

        k = 0;

       

        temp_sum = i*Passenger(1,1)+j*Passenger(2,1)+k*Passenger(3,1)+0.1*(i+j+k-1);

        while k<=restrict(3,2) && temp_sum<Car_carriers(2,1)

            temp = [i j k];

            k = k+1;

            temp_sum = i*Passenger(1,1)+j*Passenger(2,1)+k*Passenger(3,1)+0.1*(i+j+k-1);

        end

        A_2_2(num,:) = temp;

    end

    

end

A_2_2 = unique(A_2_2,'rows')

A_2_2 =

     0     0     5

     0     1     4

     0     2     3

     0     3     2

     0     4     2

     0     5     1

     0     6     0

     1     0     4

     1     1     3

     1     2     2

     1     3     1

     1     4     1

     1     5     0

     2     0     3

     2     1     2

     2     2     1

     2     3     0

     2     4     0

     3     0     2

     3     1     1

     3     2     0

     4     0     1

     4     1     0

     5     0     0

 

相关推荐