Yun981128 发表于 2022-3-24 10:47

2022华为软件精英挑战赛初赛 代码分享

没有算法,单纯平均分配带宽,找出符合约束的方案!!!
以下是主函数文件 其他文件在附件里
# -*- coding: utf-8 -*-
# @Time : 2022年03月20日 18时43分
# @Email : yun981128@gmail.com
# @AuThor : 王从赟
# @Project :HuaWei
# @file : main.py
# @notice :
import numpy as np
from np_load_data import load_demand, load_qos, load_site_bandwidth, logger
from func import duplicate_data, Get_Sum, Constraint

# 读取数据
DataDemand = load_demand()# 时间序列内流量需求
DataQos = load_qos()# qos (处理后的qos 不显示数值 只返回True、False 指向是否可用)
DataBandwidth = load_site_bandwidth()# 每个边缘节点最大带宽

# 处理数据
TNumber = DataDemand.shape# 时间序列长度
NNumber, MNumber = DataQos.shape# NNumber:边缘节点数量MNumber:客户节点数量

T = range(DataDemand.shape)# 时间序列
N = range(DataQos.shape)# 边缘节点
M = range(DataQos.shape)# 客户节点

DupDataQos = duplicate_data(np.expand_dims(DataQos, axis=0), 100)
DupDataBandwidth = duplicate_data(DataBandwidth.T, 100)

# 设置变量
X = np.zeros((TNumber, NNumber, MNumber))# 流量分配方案 𝑋 指在T时刻第m个客户节点像第n个边缘节点分配的带宽
Y: np.ndarray = DataQos.copy()
Y = np.insert(Y, Y.shape, values=Y.sum(axis=1), axis=1)
Y = np.insert(Y, Y.shape, values=Y.sum(axis=0), axis=0)
np.savetxt("DataQos.csv", Y, fmt="%d")

# 第i个客户节点和第j个边缘节点是否符合分配要求,是的话值为1,否则0;
# 且横纵的行列计算出第j个边缘节点可分配的客户节点个数和第i个客户节点可使用的边缘节点个数


# 目标
# min(Sum)

# 初始化X
logger.info("初始化X,平均分配带宽")
# 100*10
for t in T:
    for m in M:
      avg = DataDemand // Y[-1, m]
      remainder = DataDemand % Y[-1, m]
      Z = np.zeros((TNumber, NNumber, MNumber))
      K = DataQos[:, m] * avg
      K[:remainder]] = avg + 1
      Z = K
      X = X + Z



logger.info("优化方案")


def optimization(X):
    # 找出不符合要求的位置
    NodeBandwidth = np.sum(X, axis=2)
    t, n = np.where(NodeBandwidth > DupDataBandwidth)
    if t.shape == 0:
      logger.info("优化完成")
      return X
    # 取出其中第一个超带宽位置及超出的带宽
    t, n = t, n# t时刻第n个节点超带宽
    beyond_bandwidth = (NodeBandwidth) - \
                     (DupDataBandwidth)

    logger.info(f"在第{t}时刻第{n}个节点超出带宽{beyond_bandwidth},该节点支持的客户端数量为:{Y}")
    avg = beyond_bandwidth // (Y)
    remainder = int(beyond_bandwidth % (Y))
    logger.info(f"该节点支持的客户端平均减少{avg}带宽,前{remainder}个客户端额外减少1带宽")

    Z = np.zeros((TNumber, NNumber, MNumber))
    K = DataQos * avg
    K[(np.where((DataQos) > 0))[:remainder]] = avg + 1
    Z = K
    X = X - Z
    logger.info(f"在第{t}时刻,减少带宽的客户端及减少的带宽为:{K}")
    for m, reduce_bandwidthin in enumerate(K):
      logger.info(f"对于第{t}时刻的第{m}个客户端减少的{int(reduce_bandwidthin)}带宽平均分配至第{t}时刻第{m}个客户端除第{n}个节点外的节点")
      avg = int(reduce_bandwidthin // (Y[-1, m] - 1))
      remainder = int(reduce_bandwidthin % (Y[-1, m] - 1))
      logger.info(f"在第{t}时刻第{n}个客户端缺少带宽{reduce_bandwidthin},该客户端支持的节点数量为:{Y[-1, m] - 1}")
      DataQos_tmp = DataQos.copy()
      Z = np.zeros((TNumber, NNumber, MNumber))
      DataQos_tmp = 0
      K = DataQos_tmp[:, m] * avg
      K > 0)[:remainder]] = avg + 1
      Z = K
      # logger.info(f"在第{t}时刻为第{n}个客户端增加带宽的节点为:{K}")
      X = X + Z
    return optimization(X)


X = optimization(X)

logger.info("检查约束")
cons = Constraint(DupDataQos, DataDemand, DupDataBandwidth)

logger.info(f"𝑋tnm 为非负整数:{'符合约束' if cons.constraint_X1(X) == 0 else '不符合约束'}")
logger.info(f"客户节点带宽需求只能分配到满足 QoS 约束的边缘节点:{'符合约束' if cons.constraint_X2(X) == 0 else '不符合约束'}")
logger.info(f"客户节点带宽需求必须全部分配给边缘节点:{'符合约束' if cons.constraint_X3(X) == 0 else '不符合约束'}")
logger.info(f"边缘节点接收的带宽需求不能超过其带宽上限:{'符合约束' if cons.constraint_X4(X) == 0 else '不符合约束'}")

logger.info("保存带宽分配方案")
for index, layer in enumerate(X): np.savetxt(f"result/T{index}.csv", layer, fmt="%d")

PLFJOB 发表于 2022-3-24 12:04

谢谢分享,学习学习

sjklmzc 发表于 2022-3-24 12:08

牛人真多啊,我啥也不懂 啊!

wuq 发表于 2022-3-24 13:49

学习学习

15028352577 发表于 2022-3-24 14:47

谢谢分享 大佬
页: [1]
查看完整版本: 2022华为软件精英挑战赛初赛 代码分享