头歌 众包任务定价优化方案建模在线实验闯关 答案

博主本来也是想偷懒用CV大法,找了半天竟然发现没有找到相关的答案,索性就自己写一篇答案。

目录

第1关:基于经纬度地理坐标数据的指标计算Z1-Z5

任务描述:

过关代码:

第2关:基于经纬度地理坐标数据的指标计算Z6-Z12

任务描述:

过关代码:

第3关:任务定价模型的构建

任务描述:

过关代码:

第4关:任务定价模型的应用

任务描述:

过关代码:

第5关:任务定价调整方案评价

任务描述:

过关代码:


第1关:基于经纬度地理坐标数据的指标计算Z1-Z5

任务描述:

本关任务:编写一个程序完成任务数量、任务平均定价、会员数量、会员平均信誉值、会员可预订任务总量共5个指标数据 

过关代码:

# -*- coding: utf-8 -*-

# 根据读取的附件,构造任务指标Z1、Z2、Z3、Z4、Z5
# 将计算得到的指标存放到数组Z当中

def return_values():
    import pandas as pd
    import numpy as np
    import math

    # 读取任务和会员数据
    A = pd.read_excel('附件一:已结束项目任务数据.xls')
    B = pd.read_excel('附件二:会员信息数据.xlsx')

    # 预定义数组Z,用于存放所有任务的指标:
    # 列0为任务编号,列1~5依次为Z1~Z5
    Z = np.zeros((len(A), 6))

    # 遍历每一个任务,计算其在5公里范围内的指标
    for t in range(len(A)):
        # 第t个任务的经纬度
        A_Wt = A.iloc[t, 1]  # 纬度
        A_Jt = A.iloc[t, 2]  # 经度

        # 距离数组
        D1 = np.zeros(len(A))  # 任务到任务距离
        D2 = np.zeros(len(B))  # 任务到会员距离

        # 计算第t个任务与所有任务的距离
        for i in range(len(A)):
            A_Wi = A.iloc[i, 1]
            A_Ji = A.iloc[i, 2]
            D1[i] = 111.19 * math.sqrt(
                (A_Wt - A_Wi) ** 2 +
                (A_Jt - A_Ji) ** 2 * math.cos((A_Wt + A_Wi) * math.pi / 180) ** 2
            )

        # 计算第t个任务与所有会员的距离
        for k in range(len(B)):
            B_Wk = B.iloc[k, 1]
            B_Jk = B.iloc[k, 2]
            D2[k] = 111.19 * math.sqrt(
                (A_Wt - B_Wk) ** 2 +
                (A_Jt - B_Jk) ** 2 * math.cos((A_Wt + B_Wk) * math.pi / 180) ** 2
            )

        # 填充Z矩阵
        Z[t, 0] = t
        # Z1: 任务数量
        idx_tasks = D1 <= 5
        Z[t, 1] = np.sum(idx_tasks)
        # Z2: 任务平均价格
        if Z[t, 1] > 0:
            Z[t, 2] = A.iloc[idx_tasks, 3].mean()
        else:
            Z[t, 2] = 0

        # Z3: 会员数量
        idx_members = D2 <= 5
        Z[t, 3] = np.sum(idx_members)
        # Z4: 会员平均信誉值
        if Z[t, 3] > 0:
            Z[t, 4] = B.iloc[idx_members, 5].mean()
        else:
            Z[t, 4] = 0
        # Z5: 会员可预订任务总量
        Z[t, 5] = B.iloc[idx_members, 3].sum()

    return Z

第2关:基于经纬度地理坐标数据的指标计算Z6-Z12

任务描述:

本关任务:编写针对每个任务,计算其在5公里区域范围内在6:30、6:33~6:45、6:48~7:03、7:06~7:21、7:24~7:39、7:42~7:57、8:00,每个时段的会员可预订任务量,共7个指标数据的程序。注意,数组第0列是任务标号,第1~第7列是对应指标

过关代码:

# -*- coding: utf-8 -*-
# 根据任务与会员数据,计算每个任务在5公里范围内各时段会员可预订任务量指标Z6~Z12

def find_I(h1, m1, h2, m2, D2, B):
    """
    返回指定时间段内且距离<=5km的会员逻辑索引
    h1,m1: 时段开始小时、分钟
    h2,m2: 时段结束小时、分钟
    D2: 当前任务到各会员的距离数组
    B: 会员数据,列4为会员可预约时间(datetime.time类型)
    """
    import datetime
    import numpy as np
    # 将会员时间列提取为python time对象列表
    times = B.iloc[:, 4].apply(lambda x: x if isinstance(x, datetime.time) else x.time())
    # 构造逻辑索引
    start = datetime.time(h1, m1)
    end = datetime.time(h2, m2)
    I1 = times >= start
    I2 = times <= end
    I3 = D2 <= 5
    # 三者取交集
    mask = np.array(I1 & I2 & I3)
    return mask


def return_values():
    import pandas as pd
    import numpy as np
    import math
    # 读取任务与会员数据
    A = pd.read_excel('附件一:已结束项目任务数据.xls')
    B = pd.read_excel('附件二:会员信息数据.xlsx')

    # 初始化指标矩阵:len(A)行、8列(0:任务编号,1~7:各时段指标Z6~Z12)
    Z = np.zeros((len(A), 8))

    # 遍历每个任务
    for t in range(len(A)):
        # 任务经纬度
        lat_t = A.iloc[t, 1]
        lon_t = A.iloc[t, 2]
        # 计算任务到所有会员的距离数组D2
        D2 = np.zeros(len(B))
        for k in range(len(B)):
            lat_k = B.iloc[k, 1]
            lon_k = B.iloc[k, 2]
            D2[k] = 111.19 * math.sqrt(
                (lat_t - lat_k) ** 2 +
                (lon_t - lon_k) ** 2 * math.cos((lat_t + lat_k) * math.pi / 180) ** 2
            )
        # 填充任务编号
        Z[t, 0] = t
        # 各时段可预订任务量(列3为可预订任务数)
        Z[t, 1] = B.iloc[find_I(6, 30, 6, 30, D2, B), 3].sum()
        Z[t, 2] = B.iloc[find_I(6, 33, 6, 45, D2, B), 3].sum()
        Z[t, 3] = B.iloc[find_I(6, 48, 7, 3, D2, B), 3].sum()
        Z[t, 4] = B.iloc[find_I(7, 6, 7, 21, D2, B), 3].sum()
        Z[t, 5] = B.iloc[find_I(7, 24, 7, 39, D2, B), 3].sum()
        Z[t, 6] = B.iloc[find_I(7, 42, 7, 57, D2, B), 3].sum()
        Z[t, 7] = B.iloc[find_I(8, 0, 8, 0, D2, B), 3].sum()

    return Z

第3关:任务定价模型的构建

任务描述:

本关任务:将第一关和第二关计算的指标数据水平集成,获得各任务12个指标完整数据集,同时将该数据集分成两部分:一部分是已完成的任务数据,另一部分为未完成的任务数据。已完成的任务假设定价是合理的,能被广大会员接受。未完成的任务假设定价不合理,需要重新进行定价。请以完成的任务12个指标数据作为自变量X,其定价作为因变量Y,构建定价模型,并以未完成的任务12个指标数据作为定价模型输入变量,输出即为重新定价结果。

过关代码:

# -*- coding: utf-8 -*-

def return_values():
    import pandas as pd
    import numpy as np
    from sklearn.preprocessing import StandardScaler
    from sklearn.decomposition import PCA
    from sklearn.linear_model import LinearRegression
    from sklearn.neural_network import MLPRegressor

    # 1. 加载指标数据并预处理
    Z = np.load('Z.npy')  # shape: (n_tasks, 13)
    Data = pd.DataFrame(Z[:, 1:])  # 去掉第0列任务编号,保留12个指标
    # 1.1 空值处理:将NaN填充为0
    Data = Data.fillna(0)
    # 1.2 相关性分析(可选打印或检查)
    R = Data.corr()
    # 1.3 标准化
    scaler = StandardScaler()
    data_std = scaler.fit_transform(Data.values)
    # 1.4 主成分分析:累积贡献率90%
    pca = PCA(n_components=0.9)
    x_pca = pca.fit_transform(data_std)  # shape: (n_tasks, n_components)

    # 2. 加载任务原始数据,用于获取定价和执行状态
    A = pd.read_excel('附件一:已结束项目任务数据.xls')
    # 假设第4列为执行标志(1:已执行,0:未执行),第3列为定价
    executed_flag = A.iloc[:, 4].values
    y = A.iloc[:, 3].values.reshape(-1, 1)

    # 3. 划分已执行与未执行任务数据
    x_completed = x_pca[executed_flag == 1]
    y_completed = y[executed_flag == 1]
    x_uncompleted = x_pca[executed_flag == 0]

    # 4. 构建多元线性回归模型
    lr = LinearRegression()
    lr.fit(x_completed, y_completed)
    Slr = lr.score(x_completed, y_completed)  # 判定系数 R^2

    # 5. 构建神经网络回归模型
    clf = MLPRegressor(solver='lbfgs', alpha=1e-5,
                       hidden_layer_sizes=(300, 5), random_state=1)
    # 注意:MLPRegressor 接受一维目标数组
    clf.fit(x_completed, y_completed.ravel())
    rv1 = clf.score(x_completed, y_completed)  # 拟合优度

    # 6. 对未执行任务进行重新定价(可选)
    # y_pred = clf.predict(x_uncompleted)

    return Slr, rv1

第4关:任务定价模型的应用

任务描述:

本关任务:以第三关各任务12个指标完整数据集和附件一定价数据作为自变量X,任务完成情况作为因变量Y,构建分类模型。以未完成的任务12个指标数据和重新定价结果作为模型输入,输出即为重新定价后任务的完成情况。

过关代码:

# -*- coding: utf-8 -*-

def return_values():
    import pandas as pd
    import numpy as np
    from sklearn.model_selection import train_test_split
    from sklearn import svm
    from sklearn.preprocessing import StandardScaler
    from sklearn.decomposition import PCA
    from sklearn.neural_network import MLPRegressor

    # 1. 加载任务及指标数据
    A = pd.read_excel('附件一:已结束项目任务数据.xls')  # 原始任务数据
    Z = np.load('Z.npy')  # 任务12指标矩阵,shape (n_tasks, 13)

    # 2. 构建标签 Y(任务完成情况)和特征矩阵 X(12指标 + 原定价)
    executed_flag = A.iloc[:, 4].values  # 1 完成, 0 未完成
    y = executed_flag.reshape(-1, 1)

    # 指标部分:填充 NaN/Inf
    indicators = Z[:, 1:]  # shape (n_tasks, 12)
    indicators = np.nan_to_num(indicators, nan=0.0, posinf=0.0, neginf=0.0)

    # 原定价部分:填充可能的 NaN
    original_price = A.iloc[:, 3].values.reshape(-1, 1)
    original_price = np.nan_to_num(original_price, nan=0.0, posinf=0.0, neginf=0.0)

    # 合并为特征矩阵 X
    X = np.hstack((indicators, original_price))  # shape (n_tasks, 13)

    # 3. 拆分训练/测试集,构建 SVM 分类模型
    xx_train, xx_test, yy_train, yy_test = train_test_split(
        X, y, test_size=0.2, random_state=4
    )
    clf = svm.SVC(kernel='rbf', class_weight='balanced', random_state=4)
    clf.fit(xx_train, yy_train.ravel())
    # 训练集准确率
    rv2 = clf.score(xx_train, yy_train)
    # 测试集准确率
    yy_pred = clf.predict(xx_test)
    rv3 = np.mean(yy_pred.reshape(-1, 1) == yy_test)

    # 返回测试准确率 rv3
    return rv3

第5关:任务定价调整方案评价

任务描述:

本关任务:编写一个对未完成的任务重新定价效果从两个方面评估:成本增加额和新增任务完成量。请给出具体程序计算实现,其中成本增加额=新定价总和-原定价总和,新增任务完成量=8.5模型输出为1的数量*模型准确率小程序。

过关代码:

# -*- coding: utf-8 -*-
#Z为计算得到的十二个指标数据以.npy文件保存读取出来的结果
#对得到的Z进行空值处理
#判断指标之间是否存在较强的相关性
#进行标准化处理标准化
#进行主成分分析处理
#构建多元线性回归模型
#非线性神经网络模型构建任务定价模型
#根据上面的模型计算成本增加额R1和任务完成增加量R2
def return_values():
#根据计算出指标Z,以及构建的定价模型重新对任务重新定价
    import pandas as pd     #导入pandas库
    import numpy as np      #导入nmypy库
    import math             #导入数学函数模
    import fun              #导入定义的函数
    A=pd.read_excel('附件一:已结束项目任务数据.xls')
    Z=np.load('Z.npy')
    Data=pd.DataFrame(Z[:,1:])#将数据转化成数据框
    #空值处理
    Data=Data.fillna(0)
    #指标之间是否存在较强的相关性
    R=Data.corr()
    #均值-方差标准化
    from sklearn.preprocessing import StandardScaler
    scaler = StandardScaler()
    data=Data#.as_matrix() #数据框转化为数组形式
    scaler.fit(data) 
    data=scaler.transform(data)  
    #主成分分析
    from sklearn.decomposition import PCA
    pca=PCA(n_components=0.9) #累计贡献率提取90%以上
    pca.fit(data)
    x=pca.transform(data)  #返回主成分
    tzxl=pca.components_    #特征向量          
    tz=pca.explained_variance_      #特征值   
    gxl=pca.explained_variance_ratio_  #累计贡献率 
    A4=A.iloc[:,4].values
    x_0=x[A4==0,:] #未执行任务主成分数据
    x_1=x[A4==1,:] #执行任务主成分数据
    y=A.iloc[:,3].values
    y=y.reshape(len(y),1)
    y_0=y[A4==0]#未执行任务定价数据
    y_1=y[A4==1]#执行任务定价数据
    #构建多元线性回归模型
    from sklearn.linear_model import LinearRegression as LR
    lr = LR()    #创建线性回归模型类
    lr.fit(x_1, y_1) #拟合
    Slr=lr.score(x_1,y_1)   # 判定系数 R^2
    c_x=lr.coef_        # x对应的回归系数
    c_b=lr.intercept_   # 回归系数常数项
    #非线性神经网络模型构建任务定价模型
    from sklearn.neural_network import MLPRegressor 
    #两个隐含层300*5
    clf = MLPRegressor(solver='lbfgs', alpha=1e-5,hidden_layer_sizes=(300,5), 
    random_state=1) 
    clf.fit(x_1, y_1);   
    rv1=clf.score(x_1,y_1)#拟合优度
    y_0r=clf.predict(x_0) #对未执行的任务,利用神经网络定价模型重新预测定价
    xx=pd.concat((Data,A.iloc[:,[3]]),axis=1) #12个指标+任务定价,自变量
    xx=xx#.as_matrix()                         #转化为数组
    yy=A4.reshape(len(A4),1)                  #任务执行情况,因变量
    #对自变量与因变量按训练80%、测试20%随机拆分
    from sklearn.model_selection import train_test_split
    xx_train, xx_test, yy_train, yy_test = train_test_split(xx, yy, test_size=0.2, random_state=4)
    from sklearn import svm
    #用高斯核,训练数据类别标签作平衡策略
    clf = svm.SVC(kernel='rbf',class_weight='balanced')  
    clf.fit(xx_train, yy_train) 
    rv2=clf.score(xx_train, yy_train);#模型准确率
    yy1=clf.predict(xx_test)
    yy1=yy1.reshape(len(yy1),1)
    r=yy_test-yy1
    rv3=len(r[r==0])/len(r) #预测准确率
    xx_0=np.hstack((Z[A4==0,1:],y_0r.reshape(len(y_0r),1)))#预测自变量
    t=pd.DataFrame(xx_0)
    P=clf.predict(xx_0)   #预测结果,1-执行,0-未被执行
    p=P
    #8.6
    R1=sum(y_0r)-sum(y_0)
    R2=len(p[p==1])
    R2=int(R2*rv2)
    return(R1,R2)

最后也是狠狠拿下。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值