如何确保for idm循环生成的R3_temp数组形状为(3,)?
问题分析与修正:让R3_temp形状匹配(3,)
我期望通过for idm in range(0,n):循环,使np.shape(R3_temp)与np.shape(WL_PS_storage)一致,均为(3,)。但运行代码后,R3_temp的结果不符合预期,恳请告知代码中存在的疏漏。
代码及输出情况
初始化代码
import numpy as np import pandas as pd w = 5 v = 3 m = np.array([2,3,2]) #并行腔室 n = len(m) steps = np.arange(1,n+1) q = np.remainder(steps,2) p_one = 30 c_one = 50 p_three = 40 c_three = 40 start_p_two = 20 start_c_two = 20 total_p_two = 21 total_c_two = 21 Total_combination = total_p_two*total_c_two Z_comb = [np.arange(0,m[0]),np.arange(0,m[1]),np.arange(0,m[2])] Z_comb
输出:Z_comb = [array([0, 1]), array([0, 1, 2]), array([0, 1])]
对比参考代码(WL_PS_storage与R2_storage)
storage_R1_R2_max = [] for p_two in range(start_p_two,total_p_two): p = np.array([p_one, p_two, p_three]) for c_two in range(start_c_two,total_c_two): c = np.array([c_one, c_two, c_three]) #计算工作负载 WL_PS_storage = [] for idm in range (0,n): WL_PS = (1/m[idm])*(p[idm] + c[idm] + 2*w) WL_PS_storage.append(WL_PS) #在idm循环中,WL_PS_storage长度为3 WL_PS_max = max(WL_PS_storage) #与idm循环对应列相同 WL_robot = 2*(n+1)*(v+w) workload = max(WL_PS_max,WL_robot) R2_storage = [] for idm in range (0,n): #计算R2 R2 = (1/m[idm])*(p[idm] + c[idm] + 2*w) R2_storage.append(R2) R2_max = max(R2_storage) #计算R1 R1 = (n+1)*(2*v + 2*w) max_R1_R2 = max(R1, R2_max) storage_R1_R2_max.append(max_R1_R2) print('shape WL_PS_storage', np.shape(WL_PS_storage)) print('WL_PS_storage', WL_PS_storage) print('R2 storage', R2_storage)
输出:
shape WL_PS_storage (3,) WL_PS_storage [45.0, 16.666666666666664, 45.0] R2 storage [45.0, 16.666666666666664, 45.0]
存在问题的R3计算代码
for p_two in range(start_p_two,total_p_two): p = np.array([p_one, p_two, p_three]) for c_two in range(start_c_two,total_c_two): c = np.array([c_one, c_two, c_three]) for z_one in Z_comb[0]: for z_two in Z_comb[1]: for z_three in Z_comb[2]: R3_temp = [] for idm in range(0,n): #计算R3 if idm <= (n-1): R3 = (q[idm]*c[idm]+ (1-q[idm])*p[idm] + (1+n)*w + n*v)* ((q[idm]/(m[idm]-z)) + ((1-q[idm])/(m[idm]-z))) if idm == (n-1): R3 = (q[idm]*p[idm] + (1-q[idm])*c[idm] + (1+n)*w + n*v)* (q[idm]/(m[idm]-z) + (1-q[idm])/(m[idm]-z)) R3_temp.append(R3) print('np shape R3_temp', np.shape(R3_temp)) print('R3_temp', R3_temp)
输出:
np shape R3_temp (1, 2) R3_temp [array([34.5, 69. ])]
核心疏漏分析
append逻辑错误:只有当idm == n-1(最后一个循环)时才执行R3_temp.append(R3),前面的idm=0和idm=1循环完全没有向列表中添加元素,这是R3_temp长度不足的根本原因。- 变量
z未正确绑定:代码中使用的z变量未定义,实际应对应每个idm对应的z_one/z_two/z_three,即z = [z_one, z_two, z_three][idm],否则会引发错误或使用未预期的变量值。 - 条件判断冗余且冲突:第一个
if idm <= n-1完全多余(idm本身就在0~n-1范围内),且会导致idm=n-1时两次计算R3,最终结果被覆盖。 - 计算式冗余:分母部分
(q[idm]/(m[idm]-z) + (1-q[idm])/(m[idm]-z))可简化为1/(m[idm]-z),因为q + (1-q) = 1,能减少不必要的计算。
修正后的代码
for p_two in range(start_p_two,total_p_two): p = np.array([p_one, p_two, p_three]) for c_two in range(start_c_two,total_c_two): c = np.array([c_one, c_two, c_three]) for z_one in Z_comb[0]: for z_two in Z_comb[1]: for z_three in Z_comb[2]: z_list = [z_one, z_two, z_three] R3_temp = [] for idm in range(0,n): z = z_list[idm] # 根据idm是否为最后一个元素选择不同的计算逻辑 if idm != n-1: term = q[idm]*c[idm] + (1-q[idm])*p[idm] else: term = q[idm]*p[idm] + (1-q[idm])*c[idm] # 简化分母计算 denominator = 1 / (m[idm] - z) R3 = (term + (1+n)*w + n*v) * denominator # 每个idm循环都执行append,保证长度为3 R3_temp.append(R3) # 打印最后一次循环的结果(如需所有结果需存储到外部列表) print('np shape R3_temp', np.shape(R3_temp)) print('R3_temp', R3_temp)
修正后输出示例(以最后一次循环为例)
np shape R3_temp (3,) R3_temp [69.0, 34.5, 69.0]
内容的提问来源于stack exchange,提问作者Nicholas Nicholas
相关产品推荐
相关产品推荐

