python random.choice 多个_python – 有效地生成numpy.random.choice的多个实例而无需替换...

创建一个指定形状的随机数组,然后沿着要保持限制的轴排序,从而为我们提供矢量化且非常有效的解决方案.这将基于

smart answer至

MATLAB randomly permuting columns differently.这是实施 –

样品运行 –

In [122]: N = 10

In [123]: np.argsort(np.random.rand(8,N),axis=0)+1

Out[123]:

array([[7, 3, 5, 1, 1, 5, 2, 4, 1, 4],

[8, 4, 3, 2, 2, 8, 5, 5, 6, 2],

[1, 2, 4, 6, 5, 4, 4, 3, 4, 7],

[5, 6, 2, 5, 8, 2, 7, 8, 5, 8],

[2, 8, 6, 3, 4, 7, 1, 1, 2, 6],

[6, 7, 7, 8, 6, 6, 3, 2, 7, 3],

[4, 1, 1, 4, 3, 3, 8, 6, 8, 1],

[3, 5, 8, 7, 7, 1, 6, 7, 3, 5]], dtype=int64)

运行时测试 –

In [124]: def sortbased_rand8(N):

...: return np.argsort(np.random.rand(8,N),axis=0)+1

...:

...: def rand_M(N):

...: M = np.zeros(shape = (8, N))

...: for i in range (0, N):

...: M[:, i] = np.random.choice(8, size = 8, replace = False) + 1

...: return M

...:

In [125]: N = 5000

In [126]: %timeit sortbased_rand8(N)

100 loops, best of 3: 1.95 ms per loop

In [127]: %timeit rand_M(N)

1 loops, best of 3: 233 ms per loop

因此,等待120倍的加速!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
import deap import random from deap import base, creator, tools, algorithms import numpy as np import pandas as pd # 参数 stations = 30 start_end_stations = [1, 2, 5, 8, 10, 14, 17, 18, 21, 22, 25, 26, 27, 30] min_interval = 108 min_stopping_time = 20 max_stopping_time = 120 passengers_per_train = 1860 min_small_loop_stations = 3 max_small_loop_stations = 24 average_boarding_time = 0.04 # 使用 ExcelFile ,通过将 xls 或者 xlsx 路径传入,生成一个实例 stations_kilo1 = pd.read_excel(r'D:\桌面\附件2:区间运行时间(1).xlsx', sheet_name="Sheet1") stations_kilo2 = pd.read_excel(r'D:\桌面\附件3:OD客流数据(1).xlsx', sheet_name="Sheet1") stations_kilo3 = pd.read_excel(r'D:\桌面\附件4:断面客流数据.xlsx', sheet_name="Sheet1") print(stations_kilo1) print(stations_kilo2) print(stations_kilo3) # 适应度函数 def fitness_function(individual): big_loop_trains, small_loop_trains, small_loop_start, small_loop_end = individual small_loop_length = small_loop_end - small_loop_start if small_loop_length < min_small_loop_stations or small_loop_length > max_small_loop_stations: return 1e9, cost = (big_loop_trains + small_loop_trains) * (stations - 1) * min_interval + average_boarding_time * passengers_per_train * (big_loop_trains + small_loop_trains) return cost, # 创建适应度和个体类 creator.create("FitnessMin", base.Fitness, weights=(-1.0,)) creator.create("Individual", list, fitness=creator.FitnessMin) # 注册初始化函数 toolbox = base.Toolbox() toolbox.register("big_loop_trains", random.randint, 1, 10) toolbox.register("small_loop_trains", random.randint, 1, 10) toolbox.register("small_loop_start", random.choice, start_end_stations) toolbox.register("small_loop_end", random.choice, start_end_stations) toolbox.register("individual", tools.initCycle, creator.Individual, (toolbox.big_loop_trains, toolbox.small_loop_trains, toolbox.small_loop_start, toolbox.small_loop_end), n=1) toolbox.register("population", tools.initRepeat, list, toolbox.individual) # 注册遗传算法操作 toolbox.register("mate", tools.cxTwoPoint) toolbox.register("mutate", tools.mutUniformInt, low=[1, 1, min(start_end_stations), min(start_end_stations)], up=[10, 10, max(start_end_stations), max(start_end_stations)], indpb=0.5) toolbox.register("select", tools.selBest) toolbox.register("evaluate", fitness_function) # 设置遗传算法参数 population_size = 100 crossover_probability = 0.8 mutation_probability = 0.2 num_generations = 100 # 初始化种群 population = toolbox.population(n=population_size) # 进化 for gen in range(num_generations): offspring = algorithms.varAnd(population, toolbox, cxpb=crossover_probability, mutpb=mutation_probability) fits = toolbox.map(toolbox.evaluate, offspring) for fit, ind in zip(fits, offspring): ind.fitness.values = fit population = toolbox.select(offspring, k=len(population)) # 找到最佳个体 best_individual = tools.selBest(population, k=1)[0] # 解码最佳个体 big_loop_trains, small_loop_trains, small_loop_start, small_loop_end = best_individual # 输出结果 print("Big Loop Trains:", big_loop_trains) print("Small Loop Trains:", small_loop_trains) print("Small Loop Start Station:", small_loop_start) print("Small Loop End Station:", small_loop_end)分析代码
04-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值