-1

ネットワーク/グラフ全体でのパケットの損失が最小限になるように、グラフの端にパケット容量を割り当てる Python の最小化問題を解決しています。パケットは、ポアソン分布に従ってノードで生成されます。問題は、 scipy.optimize.minimize() が目的関数loss_obj(x)への入力として整数のみを受け入れることができないことです。制約を満たすすべての float 値に対して動作します。メソッドfind_loss()は、 kをその容量と仮定してエッジeの損失を検出します。元のコードが300行を超えているため、最適化関数のみを以下に貼り付けます。

#here we find loss of an edge e of the graph 
def find_loss(e,lmd,q,k): 
    edge_pmf=find_final_dist(e,lmd,q) 
    l_e=sum(edge_pmf[k+1:])
    return l_e       

net_cap=12 #this is the net capacity to be allocated over the edges

#The minimization function 
x0=[1]*a  
for i in range(a):
    x0[i]=net_cap/a

#x=[c1,c2,c3,...]
def loss_obj(x):
    s=0 
    for i in range(len(x)):
       l=find_loss(edge_enum[i],lamd,q,m.floor(x[i]))  
       s+=l 
    return s 
print('Initial guess ',x0)    
def constraint(x):
    b=sum(x[0:]) 
    return b-net_cap 

con={'type':'eq','fun':constraint}   
b=(0,net_cap)
bounds=[]
for i in range(a):
    bounds.append(b)    
cap_op=minimize(loss_obj,x0,method='SLSQP',constraints=con,bounds=bounds)
print('\n',cap_op.x)

これは示されている出力です:

Initial guess  [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]

 [0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5
 0.5 0.5 0.5 0.5 0.5 0.5]

ここでは問題を示すためだけに 24 要素のみのベクトルを示しましたが、私のネットワークには 104 個のエッジがあるため、システムが大きすぎる配列を処理できないため、scipy.optimize.brute() または itertools.combinations() では解決できません。Memory Errorを返します。線形計画問題は私が目指しているものではないので、PuLP は良い解決策ではありません。誰かが整数入力関数を最小化する方法を見つけてくれませんか?

4

1 に答える 1