【问题标题】:Iterating Swap Algorithm Python迭代交换算法 Python
【发布时间】:2014-01-12 21:23:00
【问题描述】:

我有一个算法。如果尊重某些条件成为第一个解决方案,我想要算法的最后一个解决方案。就我而言,我有这个:

  1. 第一部分

将多维数组 q 分成两部分

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. 第二段

然后我再次将数组分成两部分:

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]

现在我将 T 中的 1 个随机数组与 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

编辑: 我这里有一个例子(这部分在我上面写的代码之前)

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

【问题讨论】:

  • 在我们讨论算法之前,您有以下问题:您定义 DivideRandom 然后调用 Divide;您实际上并没有 return 子功能中的值;并且if d&gt;UB 缺少结束冒号:。当vuT 的值发生变化时,您永远不会更新d,因此循环将永远不会运行(d &gt; UB)或永远运行(d &lt;= UB)。
  • 我修复了解决方案,谢谢。它有效

标签: python numpy iteration


【解决方案1】:

您可以使用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

你的第一个问题是类似的;循环,测试,重置适当的变量。

【讨论】:

  • 对于第一部分我需要:如果 v[0,0]-u[0,0]+T[-1,3]UB 我要重新计算: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) #我从 T 中随机选择一个数组 v=random.sample(T2[:],1) #从 T2 中随机选择一个数组 u=array(u) v=array(v) 并计算新的: v[0,0]-u[0,0]+T[-1,3] 再次验证
  • 是的,没关系。你是说你需要进一步的帮助吗?
  • 是的,我真的不知道怎么写@jonrsharpe
  • 我试过了: 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
  • 除法(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])
猜你喜欢
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2016-06-11
  • 1970-01-01
  • 2016-06-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多