單設施選址 重心法 Matlab

2021-09-27 08:55:31 字數 3759 閱讀 7843

題目 :

有a,b,c,d四個零售點,現給出需求

w

jw_}

wj​/(噸),

a

ja_}

aj​/(每公里運費),且已知各點座標,現要求根據四個零售店去確定乙個倉庫的位置。

零售點w

jw_}

wj​a

ja_}

aj​(xi

,yi)

(,)(x

i​,y

i​)a

25(2,2)b3

5(11,3)

c2.5

5(10,8)d1

5(4,9)

現根據重心法定義編寫matlab**求解如下:

主函式

clc;clear all;

zuobiao=[2

,2;11

,3;10

,8;4

,9];

w=[2,

3,2.5,1]

;a=[5

,5,5

,5];

num=1;

%計算初始座標及運費

[x0,y0,

a0,dis]

=new_zuobiao

(zuobiao,w,a)

;disp([

'初始重心座標為:('

,num2str

(x0)

,','

,num2str

(y0)

,')'])

;q_yunfei=a0;

%上一次計算的運費

h_yunfei=0;

%迭代後計算的運費

while

1%計算迭代後的座標及運費

[xi,yi,

a,dis_i]

=diedai_zuobiao

(zuobiao,w,a,dis,num)

;disp([

'第',

num2str

(num)

,'次迭代重心座標為:('

,num2str

(xi)

,','

,num2str

(yi)

,')'])

;h_yunfei=a;

num=num+1;

dis=dis_i;

%判斷是否滿足運費條件

if(h_yunfei>q_yunfei)

break

;end

q_yunfei=h_yunfei;

end

function

[x0,y0,

a0,dis]

=new_zuobiao

(zuobiao,w,a)

%初始化引數

n=size

(zuobiao,1)

;he1=

zeros

(n,1);

he2=

zeros

(n,1);

he3=

zeros

(n,1);

dis=

zeros

(n,1);

a=zeros

(n,1);

%計算重心座標

for i=1:n

he1(i)=

a(i)*w

(i)*

zuobiao

(i,1);

he2(i)=a

(i)*

w(i)

;he3

(i)=

a(i)*w

(i)*

zuobiao

(i,2);

endx0=

sum(he1)

/sum

(he2)

;y0=

sum(he3)

/sum

(he2)

;%計算運距以及運費

for i=1:n

dis(i)

=sqrt

((x0-

zuobiao

(i,1))

^2+(y0-

zuobiao

(i,2))

^2);

a(i)=a

(i)*

w(i)

*dis

(i);

disp([

'第',

num2str

(i),

'個地點的初始運距:'

,num2str

(dis

(i))])

;enda0=

sum(a)

;disp([

'初始運費:'

,num2str(a0

)]);

end

function

[xi,yi,

a,dis_i]

=diedai_zuobiao

(zuobiao,w,a,dis,num)

%初始化引數

n=size

(zuobiao,1)

;he1=

zeros

(n,1);

he2=

zeros

(n,1);

he3=

zeros

(n,1);

dis_i=

zeros

(n,1);

ai=zeros

(n,1);

%計算迭代後的座標

for i=1:n

he1(i)=

a(i)*w

(i)*

zuobiao

(i,1)/

dis(i)

;he2

(i)=

a(i)*w

(i)/

dis(i)

;he3

(i)=

a(i)*w

(i)*

zuobiao

(i,2)/

dis(i)

;end

xi=sum

(he1)

/sum

(he2)

;yi=

sum(he3)

/sum

(he2)

;%計算運距以及運費

for j=1:n

dis_i

(j)=

sqrt

((xi-

zuobiao

(j,1))

^2+(yi-

zuobiao

(j,2))

^2);

ai(j)=a

(j)*

w(j)

*dis_i

(j);

disp([

'第',

num2str

(j),

'個地點第'

,num2str

(num)

,'次迭代運距:'

,num2str

(dis_i

(j))])

;enda=

sum(ai)

;disp([

'第',

num2str

(num)

,'次迭代運費:'

,num2str(a

)]);

end

運算迭代43次後結果如下: