在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

遞歸算法實踐--到倉合單助力京東物流提效增收

京東云 ? 來源:京東物流 李碩 ? 作者:京東物流 李碩 ? 2025-01-09 14:57 ? 次閱讀

作者:京東物流 李碩

一、背景

京東物流到倉業務「對商家」為了減少商家按照京東采購單分貨備貨過程,對齊行業直接按照流向交接,提升商家滿意度;「對京東」攬收操作APP提效;到倉合單功能應運而生;

二、問題

一次批量采購單(一次50或者100個采購單)需要根據不同的規則合并成多個訂單;

每一個采購單可以是不同的來源類型(自營和非自營)、不同的收貨類型,每一個采購單會有多個SKU,同一個SKU只有一個等級,一批采購單會有多個SKU,同一個SKU會有多個等級;

合單規則:

1.自營和非自營不能合;

2.實物收貨和單據收貨的采購單不能合并;

3.相同收獲倉和配送中心的采購單可以合并;

4.兩個采購單如果合并之后同一個SKU擁有多個等級,則不可以合單;

三、打法

A、思路

1.首先認為這一批單子可以合單,后續就是根據合單規則將不符合規則轉換成拆單的過程;

2.根據合單規則1、2、3可以將這一批單子拆成多個需要執行規則4的待合單集合List;

3.舉個極端例子,規則1、2、3這些采購單都是相同的,則該List數量為1,這100個單子進行后續根據SKU+等級維度的合單;

4.由于相同SKU不同等級不可以合單,我們可以先找出這100個采購單中包含最多等級的SKU,比如skuA 包含最多的7個等級, 根據skuA進行按等級進行分堆,分成7堆之后,由于并不是所有的采購單都包含skuA, 則這100個采購單可能還會剩下一些單子不在這7堆之內,也就是剩下的這些單子如果只是基于skuA維度進行分堆,可以跟這7堆任何一堆進行合單,這時候需要將這些剩下的單子分別加入到這7堆里面,得到第一次合單后的結果,這里很重要,也是納入遞歸算法的基礎;

5.得到的7堆再分別進行第四步的操作,直到當前這一堆的sku不包含不同等級為止(這里是遞歸結束的條件);

6.由于分堆里面包含了重復的訂單,所以有些單子組合會被重復計算,這時候需要維護一個列表將計算過的單據進行保存,這樣可以將重復的列表進行剪枝,這樣可以保證整個算法的時間復雜度不是指數級增長;

7.針對最終全部遞歸之后的結果將合單的列表進行由多到少進行排序,然后進行排重,這里如果排重之后只有一個采購單了可以先釋放,但不要加到排重列表里面,因為后面可能還會出現可合并的集合,很重要,不然得到的合單結果會變少,得到最終的合單后的結果;

B、算法

??遞歸算法是一種通過重復將問題分解為同類的子問題來解決問題的方法?; 特點是函數或子程序在運行過程中直接或間接調用自身;常見的遞歸算法包括?Fibonacci函數、?Hanoi問題和?階乘計算等;

C、解決方案

1. 遞歸代碼塊

/**
 * 指定不同等級不能合單
 *
 * @param poNoSet       采購單號Set
 * @param poMainInfoMap 采購單詳情
 * @param calculatedSet 計算過的采購單據列表的集合
 * @return
 */
private List> doMergeClassDifferent(Set poNoSet, Map poMainInfoMap, Set calculatedSet) {
    // 如果該set已經計算過則不重復計算
    List> resultList = new ArrayList();
    String calculatedPoNoKey = buildCalculatedPoNoKey(poNoSet);
    if (calculatedSet.contains(calculatedPoNoKey)) {
        return resultList;
    } else {
        calculatedSet.add(calculatedPoNoKey);
        resultValue.incrementAndGet();
    }

    // 以sku為key的集合
    Set skuSet = new HashSet();
    // 以sku 為key, 值為poNos
    Map> skuMap = new HashMap();
    // 存放同一個sku下有多少個不同等級的集合
    Map> skuToskuLevelMap = new HashMap();

    // 以sku+level 為key的集合
    Set skuLevelSet = new HashSet();
    // 以sku+level 為key, 值為poNos
    Map> skuLevelMap = new HashMap();

    for (String poNo : poNoSet) {
        PoOrderFacadeResponse.PoMainInfo poMainInfo = poMainInfoMap.get(poNo);
        // 采購單條目
        List poItemInfos = poMainInfo.getPoItemInfos();
        for (PoOrderFacadeResponse.PoItemInfo poItemInfo : poItemInfos) {

            String skuKey = poItemInfo.getGoodsNo();
            String skuLevelKey = buildSkuLevelKey(poItemInfo);
            skuSet.add(skuKey);
            setKeyMap(skuKey, skuMap, poNo);
            // 存放同一個sku下有多少個不同等級的集合
            Set stringSet = skuToskuLevelMap.get(skuKey);
            if (CollectionUtils.isEmpty(stringSet)) {
                stringSet = new HashSet();
                skuToskuLevelMap.put(skuKey, stringSet);
            }
            stringSet.add(skuLevelKey);
            skuLevelSet.add(skuLevelKey);
            setKeyMap(skuLevelKey, skuLevelMap, poNo);
        }
    }

    if (skuSet.size() == skuLevelSet.size()) {
        // 此處sku的數量和sku+level的數量相同,不需要再進行遞歸運算
        // 方法結束的出口
        resultList.add(poNoSet);
        return resultList;
    } else {
        // 同一個sku下最多等級個數
        int high = MagicCommonConstants.NUM_1;
        // 最多等級個數的對應sku
        String maxLevelSku = "";
        for (String sku : skuToskuLevelMap.keySet()) {
            Set strings = skuToskuLevelMap.get(sku);
            if (strings.size() > high) {
                high = strings.size();
                maxLevelSku = sku;
            }
        }
        if (high > MagicCommonConstants.NUM_1) {
            // 獲取該sku下的poNos
            Set strings = skuMap.get(maxLevelSku);
            // 差集
            Set chaJiSet = poNoSet;
            chaJiSet.removeAll(strings);

            Set skuLevels = skuToskuLevelMap.get(maxLevelSku);
            for (String skuLevel : skuLevels) {
                Set poNoTempSet = skuLevelMap.get(skuLevel);
                poNoTempSet.addAll(chaJiSet);
                // 遞歸計算
                List> clist = doMergeClassDifferent(poNoTempSet, poMainInfoMap, calculatedSet);
                if (CollectionUtils.isNotEmpty(clist)) {
                    resultList.addAll(clist);
                }
            }
        }
    }

    return resultList;
}

2. 去重代碼塊

/**
 * 去重 合單之后的采購單號
 *
 * @param sets
 * @param dooModel
 */
private List> uniqueRepeatPoNo(List> sets, DooModel dooModel) {
    sets.sort(new Comparator>() {
        @Override
        public int compare(Set o1, Set o2) {
            return o2.size() - o1.size();
        }
    });

    List> resultList = new ArrayList();
    Set allMergedSet = new HashSet();

    Set allSet = new HashSet();
    for (Set set : sets) {
        Set tempSet = new HashSet();
        for (String poNo : set) {
            if (!allSet.contains(poNo)) {
                tempSet.add(poNo);
                allMergedSet.add(poNo);
            }
        }
        if (!tempSet.isEmpty()) {
            if (tempSet.size() > 1) {
                allSet.addAll(tempSet);
                resultList.add(tempSet);
            }
            // 此處的單條后面不一定不能合單
        }
    }

    // 差集
    allMergedSet.removeAll(allSet);
    if (allMergedSet.size() > 0) {
        for (String poNo: allMergedSet) {
            putPoNoToSet(dooModel, poNo);
        }
    }
    return resultList;
}

四、價值

目前上線之后剛推廣,功能上線45天,已經在浙江、 河南、上海、江蘇、安徽、天津、四川、北京22個客戶使用,增收500萬整體運營平穩,且在大促期間合單收貨功能優勢更加凸顯:「對商家」減少商家按照京東采購單分貨備貨過程,對齊行業直接按照流向交接,商家滿意度提升。「對京東」 攬收操作APP提效30%,分貨、入庫交倉效率提升10%,整體TC轉運效率更快;

五、總結

難點:將根據SKU分堆之后剩下的采購單分別加到不同的分堆中,這個方案也是思考了好久之后想到的,然后構造成遞歸進行計算,最終進行去重;

性能:遞歸算法中大部分計算都是重復的,但是經過記錄中間計算結果,將計算過的采購單集合直接剪枝,計算時間就不會隨著采購單的數量增長而指數增長,真實情況也是隨著單據數量的增加、SKU和等級的種類增多依然健壯;

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 算法
    +關注

    關注

    23

    文章

    4622

    瀏覽量

    93060
  • 遞歸
    +關注

    關注

    0

    文章

    29

    瀏覽量

    9039
收藏 人收藏

    評論

    相關推薦

    京東雙十一“無人”首度曝光 無縫結合全程無人值守

    10月26日消息,雙11大促海量訂單產生的物流環節巨大壓力,不僅是物流行業面臨的難題,更會影響消費者的購物體驗。今天早些時候,京東X事業部智慧物流實驗室第一次揭開神秘的面紗,展現了由機
    發表于 10-27 11:34 ?1562次閱讀

    JD雙十一“無人”首度曝光,完全自動化操控全程無人值守,過程太流弊了!

    大載荷量和±0.05mm高精度的特點。名詞解析:京東“無人”“無人”是京東自主研發的定制化、系統化整體物流解決方案,掌握了核心智慧
    發表于 10-27 11:31

    2017年京東智慧物流黑科技視頻曝光!

    科技范兒的說法,就是京東智慧物流系統收到了你的訂單指令,指揮無人各位物流機器人“機不停蹄”的忙碌起來——揀貨、貼標簽、分揀、集貨,再到自動裝上無人傳站車。無人傳站車在智能分揀系統的指
    發表于 02-17 15:38

    LabVIEW中使用遞歸算法

    LabVIEW中使用遞歸算法LabVIEW支持遞歸嗎?如何在LabVIEW中創建遞歸的VI?LabVIEW確實支持遞歸。按照下面的步驟來創建
    發表于 04-17 20:11

    遞歸算法的設計模式與調試

    文中提出一種通用遞歸算法的設計模式,并結合實例說明該模式的應用方法和有效性,為研究遞歸算法提供了有效的解決方案,可推廣性強。同時給出了遞歸
    發表于 11-03 15:04 ?24次下載

    不止無人機 京東欲將“物流無人化”演繹極致?

    京東物流業務連續五年的虧損一直令業內浮想聯翩,然而京東卻一直頂著壓力不斷地曝出以京東無人機為代表的黑科技來建立獨有的物流模式。難道
    發表于 11-26 11:35 ?788次閱讀

    科捷物流聯手深圳極智能,打造首個立體高密度機器人智能

    據報道,近日,神州控股旗下科捷物流位于北京平谷的BotHive Systems標桿試驗正式啟動。科捷物流與深圳極智能有限公司合作,應用BotHive Systems技術,采用“貨
    發表于 08-31 15:42 ?1117次閱讀

    京東全國規模最大的機器人群投入使用 不同層級無人數量達到50個

    11月8日,京東物流公布數據顯示,今年11.11全球好物節期間,京東全國規模最大的機器人群已經投入使用,不同層級的無人數量達到50個,分
    發表于 11-09 10:26 ?2103次閱讀

    機器人融入正是京東無人的重要特色之一

    京東正著力打造的智慧物流中心里,從入庫、在庫揀貨、分揀、裝車的完整過程都無需人力參與,讓庫房擁有極高的效率和出色的靈活性。負責京東智慧物流
    發表于 11-12 11:50 ?1355次閱讀

    C++的實驗教程之函數的遞歸算法資料免費下載

    函數的遞歸算法 1.范例:求組合數, 一、實驗目的1. 學會解決簡單的遞歸算法。2. 掌握函數的嵌套調用。
    發表于 01-29 10:51 ?2次下載
    C++的實驗教程之函數的<b class='flag-5'>遞歸</b><b class='flag-5'>算法</b>資料免費下載

    物流業是物聯網的最佳應用場景,京東再刷新紀錄

    談到物流行業的物聯網應用及京東的物聯網發展情況,申元慶表示:“我們知道物流是物聯網最佳應用場景之一。今年618購物節,我們京東交出了非常棒的成績
    的頭像 發表于 08-26 15:45 ?3799次閱讀

    從“敲鑼人”看京東物流IPO后的“新謀略”

    /股,較發行價40.36港元上漲 14.1%,總市值約為2805億港元。 京東配一體物流體系從“自給自足”“改革開放”再到“全面開放”,用了10年: 2007年,
    的頭像 發表于 05-29 09:27 ?2349次閱讀

    如何求遞歸算法的時間復雜度

    那么我通過一道簡單的面試題,模擬面試的場景,來帶大家逐步分析遞歸算法的時間復雜度,最后找出最優解,來看看同樣是遞歸,怎么就寫成了O(n)的代碼。
    的頭像 發表于 07-13 11:30 ?2279次閱讀

    如何求遞歸算法的時間復雜度

    相信很多同學對遞歸算法的時間復雜度都很模糊,那么這篇Carl來給大家通透的講一講。
    的頭像 發表于 07-13 11:33 ?1624次閱讀

    京東物流與銳捷網絡合作再深化,共啟智慧物流新紀元

    轉型。 基于雙方合作的堅實基礎,京東物流將在物流領域,依托自身在物流管理上的專業知識和豐富經驗,為銳捷網絡提供包括物流運輸服務、
    的頭像 發表于 10-29 16:04 ?167次閱讀
    <b class='flag-5'>京東</b><b class='flag-5'>物流</b>與銳捷網絡合作再深化,共啟智慧<b class='flag-5'>物流</b>新紀元
    主站蜘蛛池模板: 黄色录像欧美| 操美女大逼逼| 欧美成人区| 天天好b| 成人在线91| 黄色视屏免费在线观看| 色综合激情| 高h视频网站| 欧美成人午夜毛片免费影院| 在线观看黄日本高清视频| 狠狠色丁香六月色| 欧美高清视频一区| 日本三级成人中文字幕乱码| 天天看片天天操| 在线视频亚洲欧美| 午夜欧美在线| 一区二区三区在线观看免费| avhd101天天看新片| 国产真实灌醉美女疯狂弄| 免费 在线播放| 免费一看一级毛片全播放| 波多野结衣50连精喷在线| 国产精品露脸脏话对白| 国产最好的精华液网站| 酒色影院| 又黄又湿又爽| 亚洲综合日韩欧美一区二区三| 中韩日欧美电影免费看| 中文字幕在线看精品乱码| 五月激情久久| 特级黄毛片| 色香蕉色香蕉在线视频| 毛片在线网| 国产美女在线精品观看| 黄色大片a级| 午夜小福利| 美女久久久久久| 一区视频在线| 天堂网www最新版在线资源| 免费看的一级毛片| 好男人社区www的视频免费|