کارافرین

کار

۱ مطلب با کلمه‌ی کلیدی «p-median» ثبت شده است

کد پایتون برای مسئله p-median و الگوریتم لاگرانژین

g=[[0,210,360,240,60],[350,0,80,420,100],[450,60,0,360,140],[200,210,240,0,40],[150,150,280,120,0]]

f=[200,100,100,100,100]

ub=2000000

lb=0

import copy

m=5

n=5

p=2


y=[0,0,0,0,0]

while ub!=lb :

    you=[]

    s=copy.deepcopy(g)

    for j in range(0,m):

       for i in range(0,n):

            if s[j][i]-f[i]<0 :

               s[j][i]=s[j][i]-f[i]

            else :

                s[j][i]=0

    

    v=[]

    for j in range(0,m):

        num=0

        for i in range(0,n):

            num=num+s[j][i]

        v.append(num)

    

    for j in range(0,m):

        y[j]=0

    v1=copy.deepcopy(v)

    for j in range(0,p):

        r=v1.index(min(v1))

        you.append(r)

        y[r]=1

        v1[r]=1000000000000000000000000000000

    

    x=copy.deepcopy(g)

    for j in range(0,m):

        if y[j]==1:

            for i in range(0,n):

                if s[j][i]<0 :

                    x[j][i]=1

                else :

                    x[j][i]=0

        else :

            for i in range(0,n):

                x[j][i]=0

    

    z1=0

    z11=0

    z12=0

    for j in range(0,m):

        z11=z11+(v[j]*y[j])

    for i in range(0,n):

        z12=z12+f[i]

    z1=z12+z11

    z2=0

    lb=max(lb,z1)

    

    e=copy.deepcopy(x)

    for i in range(0,n):

        for j in range(0,m):

            e[j][i]=0

    

    for i in range(0,n):

        ver=copy.deepcopy(g[you[0]][i])

        per=i

        cer=you[0] 

        for j in  range(0,p):

            if g[you[j]][i] < ver :

                 ver=g[you[j]][i]

                 per=i

                 cer=you[j]

        e[cer][per] = 1

    

    for i in range(0,n):

        for j in  range(0,m):

            z2=z2+(e[j][i]*g[j][i])

    

    ub=min(z2,ub)

    print(f,ub,lb)

    t1=0

    for i in range(0,n):

        t2=0

        for j in range(0,m):

            t2=t2+x[j][i]

            

        t1=t1+((t2-1)**2)

        

    

    t=(1*(ub-lb))/t1

    for i in range(0,n):

        w=0

        for j in range(0,m):

            w=w+x[j][i]

        f[i]=max(0,f[i]-t*(w-1))

< برگرفته شده از صدای نور