2014-01-12 99 views
0

我有一個算法。如果尊重某些條件成爲第一個解決方案,我想要算法的最後一個解決方案。在我來說,我有這樣的:迭代交換算法Python

  1. 第一部分

分割兩個部分

split_at = q[:,3].searchsorted([1,random.randrange(LB,UB-I)]) 
D = numpy.split(q, split_at) 

更改並重新命名分裂矩陣的多維數組問:

S=B[1] 
SF=B[2] 
S2=copy(SF) 
S2[:,3]=S2[:,3]+I 

定義一個函數f:

f=sum(S[:,1]*S[:,3])+sum(S2[:,1]*S2[:,3]) 

第一部分是一個義務的通道。

  1. 第二通道

然後我再次分裂陣列中的2個部分:

split_at = q[:,3].searchsorted([1,random.randrange(LB,UB-I)]) 
D = numpy.split(q, split_at) 

我重命名和改變矩陣的部件(例如在第一通道:

T=D[1] 
TF=D[2] 
T2=copy(TF) 
T2[:,3]=T2[:,3]+I 

u=random.sample(T[:],1) #I random select an array from T 
v=random.sample(T2[:],1) #random select an array from T2 
u=array(u) 
v=array(v) 

這是我的第一個問題:我只想在v [0,0] -u [0,0] + T [-1,3] < = UB,如果不是,我想重複第二遍,直到條件被驗證。

現在我交換1個隨機陣列在T與另一個從T2:

x=numpy.where(v==T2)[0][0] 
y=numpy.where(u==T)[0][0] 
l=np.copy(T[y]) 
T[y],T2[x]=T2[x],T[y] 
T2[x],l=l,T2[x] 

我修改和在基質中重新計算一些:

E=np.copy(T) 
E2=np.copy(T2) 
E[:,3]=np.cumsum(E[:,0]) 
E2[:,3]=np.cumsum(E2[:,0])+I 

定義F2:

f2=sum(E[:,1]*E[:,3])+sum(E2[:,1]*E2[:,3]) 

這裏是我的第二個和最後一個問我需要迭代這個算法。如果f-f2 < 0我的新開始解決方案必須是E和E2,並且我的新f必須是f2並且不包括最後一個選擇的算法(重新計算新的f和f2)。 謝謝你的耐心。我是一個小白:d

編輯: 我這裏有一個例子(這個部分去我已經寫在上面的代碼之前)

import numpy as np 
import random 

p=[ 29, 85, 147, 98, 89, 83, 49, 7, 48, 88, 106, 97, 2, 
     107, 33, 144, 123, 84, 25, 42, 17, 82, 125, 103, 31, 110, 
     34, 100, 36, 46, 63, 18, 132, 10, 26, 119, 133, 15, 138, 
     113, 108, 81, 118, 116, 114, 130, 134, 86, 143, 126, 104, 52, 
     102, 8, 90, 11, 87, 37, 68, 75, 69, 56, 40, 70, 35, 
     71, 109, 5, 131, 121, 73, 38, 149, 20, 142, 91, 24, 53, 
     57, 39, 80, 79, 94, 136, 111, 78, 43, 92, 135, 65, 140, 
     148, 115, 61, 137, 50, 77, 30, 3, 93] 
w=[106, 71, 141, 134, 14, 53, 57, 128, 119, 6, 4, 2, 140, 
     63, 51, 126, 35, 21, 125, 7, 109, 82, 95, 129, 67, 115, 
     112, 31, 114, 42, 91, 46, 108, 60, 97, 142, 85, 149, 28, 
     58, 52, 41, 22, 83, 86, 9, 120, 30, 136, 49, 84, 38, 
     70, 127, 1, 99, 55, 77, 144, 105, 145, 132, 45, 61, 81, 
     10, 36, 80, 90, 62, 32, 68, 117, 64, 24, 104, 131, 15, 
     47, 102, 100, 16, 89, 3, 147, 48, 148, 59, 143, 98, 88, 
     118, 121, 18, 19, 11, 69, 65, 123, 93] 
p=array(p,'double') 
w=array(w,'double') 
r=p/w 
LB=12 
UB=155 
I=9 
j=p,w,r 
j=transpose(j) 
k=j[j[:,2].argsort()] 
c=np.cumsum(k[:,0]) 
q=k[:,0],k[:,1],k[:,2],c 
q=transpose(q) 
o=sum(q[:,1]*q[:,3]) 
split_at = q[:,3].searchsorted([1,UB-I]) 
B = numpy.split(q, split_at) 
S=B[1] 
SF=B[2] 
S2=copy(SF) 
S2[:,3]=S2[:,3]+I 
f=sum(S[:,1]*S[:,3])+sum(S2[:,1]*S2[:,3]) 
split_at = q[:,3].searchsorted([1,random.randrange(LB,UB-I)]) 
D = numpy.split(q, split_at) 
T=D[1] 
TF=D[2] 
T2=copy(TF) 
T2[:,3]=T2[:,3]+I 
u=random.sample(T[:],1) 
v=random.sample(T2[:],1) 
u=array(u) 
v=array(v) 
x=numpy.where(v==T2)[0][0] 
y=numpy.where(u==T)[0][0] 
l=np.copy(T[y]) 
T[y],T2[x]=T2[x],T[y] 
T2[x],l=l,T2[x] 
E=np.copy(T) 
E2=np.copy(T2) 
E[:,3]=np.cumsum(E[:,0]) 
E2[:,3]=np.cumsum(E2[:,0])+I 
f2=sum(E[:,1]*E[:,3])+sum(E2[:,1]*E2[:,3]) 

我想:

def DivideRandom(T,T2): 
    split_at = q[:,3].searchsorted([1,random.randrange(LB,UB-I)]) 
    D = numpy.split(q, split_at) 
    T=D[1] 
    TF=D[2] 
    T2=copy(TF) 
    T2[:,3]=T2[:,3]+I 
Divide(T,T2) 
def SelectJob(u,v): 
    u=random.sample(T[:],1) 
    v=random.sample(T2[:],1) 
    u=array(u) 
    v=array(v) 
SelectJob(u,v)  
d=v[0,0]-u[0,0]+T[-1,3] 
def Swap(u,v): 
    x=numpy.where(v==T2)[0][0] 
    y=numpy.where(u==T)[0][0] 
    l=np.copy(T[y]) 
    T[y],T2[x]=T2[x],T[y] 
    T2[x],l=l,T2[x] 
    E=np.copy(T) 
    E2=np.copy(T2) 
    E[:,3]=np.cumsum(E[:,0]) 
    E2[:,3]=np.cumsum(E2[:,0])+I 
    f2=sum(E[:,1]*E[:,3])+sum(E2[:,1]*E2[:,3]) 
while True: 
    if d<=UB 
     Swap(u,v) 
     if d>UB 
      DivideRandom(T,T2) 
      SelectJob(u,v) 
      if d<UB: 
       break 
+0

那麼,在我們甚至得到算法之前,你有以下問題:*定義*'DivideRandom'然後*調用*'Divide';你實際上不會從你的子功能中返回值;和'如果d> UB'缺少結尾冒號':'。當'v','u'和'T'的值改變時,你永遠不會更新'd',所以循環將永遠不會運行('d> UB')或永遠運行('d <= UB')。 – jonrsharpe

+0

我修復瞭解決方案,謝謝。它工作 – Charlienoob

回答

0

你可以使用while True無限循環,然後停止,只要您的條件滿足使用break

count = 0 
while True: 
    count += 1 
    if count == 10: 
     break 

所以你的第二個例子中,你可以嘗試:

while True: 
    ... 
    if f - f2 < 0: 
     # use new variables 
     f, E = f2, E2 
    else: 
     break 

你的第一個問題是相似的;循環,測試,重置適當的變量。

+0

對於第一部分我需要:如果v [0,0] -u [0,0] + T [-1,3] <= UB我想繼續如果v [0,0] -u [ 0,0] + T [-1,3]> UB我想recalcultate:split_at = q [:,3] .searchsorted([1,random.randrange(LB,UB-I)]) D = numpy。 split(q,split_at) T = D [1] TF = D [2] T2 =副本(TF) T2 [:,3] = T2 [:,3] + I u = random.sample (1)#隨機從T中選擇一個數組 v = random.sample(T2 [:],1)#random從T2中選擇一個數組 u = array(u) v = array(v) 並計算新:v [0,0] -u [0,0] + T [-1,3]並再次驗證 – Charlienoob

+0

是的,沒關係。你是說你需要進一步的幫助嗎? – jonrsharpe

+0

是的請我真的不知道怎麼寫它@jonrsharpe – Charlienoob