补充4 利用决策树评估网络设计决策(决策树算法)——基于java的实现

  

目录

一、贴现现金流

案例:我思物流公司

二、决策树分析的基础知识

三、评估我思公司的柔性

四、评估现货市场方案

 五、总结        


        决策者设计全球供应链网络时,应考虑到一系列的战略选择,比如等待、建立过剩产能、建立柔性产能、签订长期合同、从现货市场采购等。在任何一个全球供应链中,需求、价格、汇率和其他一些因素都是不确定的,且很可能在任何供应链觉得的影响时间范围内发生波动。因此,应在未来不确定的背景下对各种备选方案进行评估,未考虑不确定性的设计方法通常会低估柔性选择方案的价值。其结果往往是,如果所有的事情都按计划进行,则供应链表现良好,但如果发生意想不到的事情,则供应链成本会飙升。

一、贴现现金流

        全球供应链设计决策应当给予决策实施期间所发生的一系列现金流来进行评估。这就需要对未来现金流进行评估,以考虑全球供应链中可能出现的风险和不确定性。首先,先介绍以下评估未来现金流的基础知识。

        一连串现金流的现值是指这串现金流折算为当前时点美元的价值。贴现现金流(discounted cash flow,DCF)分析法是评估任意一串现金流的现值,以使管理者能够对两组现金流的财物价值进行比较。贴现现金流分析法是基于“进的的1美元比明天的1美元更值钱”这一基本前提,因为今天的1美元可以通过投资获得额外的回报。这一前提为比较未来不同时间段发生的现金流的相对价值提供了一个基本工具。

        未来现金流的现值是使用贴现因子计算得出的。

        贴现因子=1/(1+k)

        回报率k也称贴现率(discount rate)、最低资本回报率(hurdle rate)或资本机会成本(opportunity cost of capital)。假定未来T个时期的一连串现金流为C0,C1,...,CT,回报率为k,那么该串现金流的净现值(NPV)为:

        制定供应链决策时应该对不同选择方案的净现值进行比较。一个方案的净现值表示该方案将会给供应链带来损失。净现值的最高的决策方案将给供应链带来最高的财务回报。

案例:我思物流公司

        假如你是我思公司的经理,面临这样的情况。你预测未来三年每年需要100000平方英尺的仓储空间,储存100000单位的需求。在这里假设,这里的唯一成本是仓库成本。假如没满足一个单位需求可获得1.22美元的收入。你必须决定签一份为期三年的租赁合同,还是每年从现货市场租用仓储空间。若签订三年合同则每年每平方英尺的成本为1.00美元,从现货市场则为1.20美元。我思公司的贴现率k=0.1,你会怎样进行选择?

        基于上述分析,你可能会选择三年的租约。然而,这并不是最终的结果,因为还没有考虑现货价格的不确定性,也没有考虑到使用现货市场能够为企业提供更大柔性以应对不确定性

二、决策树分析的基础知识

        决策树(decision tree)是一种在不确定环境下评价决策的图形工具。贴现现金流的决策树可以用来评估当需求、价格、汇率以及通货膨胀等存在不确定性时的供应链设计决策。

        决策树分析的方法归纳如下:

        1.确定每个时期的长度以及要评估决策的时期数T。

        2.确定未来T期需要考虑的波动因素,如需求、价格和汇率等。

        3.确定每种因素的不确定性的表述,也就是说,用那种分布来描述不确定性。

        4.确定每一时期的贴现率k。

        5.用每一时期所定义的状态及两个相邻时期的状态之间的转换概率来描述决策树。

        6.从周期T开始,并逐步返回到第0期,确定每一步的最优决策及期望现金流。给定时期的每种状态的期望现金流在并入前一时期时应予折现。

三、评估我思公司的柔性

        我们用决策树分析法分析前面的问题。考虑到需求和仓储空间的现货价格存在不确定性。你有以下三种方案:

        1.在需要时从现货市场获得所有仓储空间。

        2.签订一份为期三年的固定仓储空间租约,并从现货市场获得另外所需的空间。

        3.签订一个约定最低费用的柔性租约,允许在某个上限内灵活使用仓储空间,其它所需空间则从现货市场获得。

        现在来讨论在考虑不确定下你如何评估每一个决策。

        你预测,从某一年到下一年,需求可能上升20%(概率为0.5),也可能下降20%(概率为0.5)。这两种结果发生的概率彼此独立,且在各年之间保持不变。

        你可以接受每年每平方英尺1美元的价格签订为期三年的租约。目前现货市场上仓储空间每年每平方英尺的租金时1.20美元。从某一年到下一年,仓储空间的现货价格可能上升10%(概率为0.5),也可能下降10%(概率为0.5)。这两种结果发生的概率彼此独立,且在各年之间保持不变。

        你也相信仓储空间价格的波动与产品需求的波动这两者之间时相互独立的。每一个单位需求能赚1.22美元的收入,我思公司三年中每年的贴现率k=0.1。

        假设所有成本都是在每年年初发生,因此构建一个T=2的决策树。如下图所示。因为价格和需求是相互独立的,所以每一次的转移概率为0.5*0.5=0.25。

四、评估现货市场方案

        利用上图中的决策树,首先分析不签订租约而从现货市场获得所有仓储空间的方案。从时期2开始,计算该公司在每个节点的利润。在节点(D=144,p=1.45),公司在时期2必须满足144000单位的需求,仓储空间每平方英尺的现货市场价格为1.45美元。在时期2,公司在节点(D=144,p=1.45)所产生的成本表示为C(D=144,p=1.45,2),计算如下:

C(D=144,p=1.45,2)=144000*1.45=208800(美元)

        在时期2,公司在节点(D=144,p=1.45)所获得的利润表示为P(D=144,p=1.45,2),并计算如下:

        P(D=144,p=1.45,2)=144000*1.22-C(D=144,p=1.45,2)=175680-208800=-33120(美元)

        在时期2,公司在其他每个节点的利润可以用类似方法进行计算,如下表所示。

        再计算时期1中的节点(D=120,p=1.32)所引出的所有4中可能状态在时期2的期望利润,即EP(D=120,p=1.32,1),计算结果如下:

        EP(D=120,p=1.32,1)=0.25[P(D=144,p=1.45,2)+P(D=144,p=1.19,2)+P(D=96,p=1.45,2)+P(D=96,p=1.19,2)]=0.25*(-33120+4320-22080+2880)=-12000(美元)

        该期望利润在时期1的现值计算如下:

        PVEP(D=120,p=1.32,1)=EP(D=120,p=1.32,1)/(1+k)=-12000/1.1=-10909(美元)

        此时,就可以计算出时期1的节点(D=120,p=1.32)的总期望利润P(D=120,p=1.32,1),等于该节点在时期1的利润与未来的期望利润的现值之和,即:

        P(D=120,p=1.32,1)=120000*1.22-120000*1.32+PVEP(D=120,p=1.32,1)=-12000-10909=-22909(美元)

        在时期1,公司在其他每个节点的利润可以用类似方法进行计算,如下表所示.

        对于时期0(基期),其利润P(D=100,p=1.20,0)等于时期0的利润与时期1中所有4个节点的期望利润的现值之和,计算如下:

        EP(D=100,p=1.20,0)=0.25*(-22909+32073-15273+21382)=3818(美元)

        PVEP(D=100,p=1.20,0)=3818/1.1=3471(美元)

        P(D=100,p=1.20,0)=100000*1.22-100000*1.20+PVEP(D=100,p=1.20,0)

                                       =2000+3471=5471(美元)

        因此,不签租约而从现货市场获得所有仓储空间这一方案的预期净现值为:

    NPV(现货市场)=5471(美元)

        以下是java代码的实现,由于精度问题,可能和上面结果稍许不同:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class TreeNode {
    private int id;
    private double demand;
    private double cost;
    private double[] side;
    private List<TreeNode> children = new ArrayList<>();;
    private final double discountFactor=1.1;
    private final double price=1.22;

    public TreeNode(int id, double demand, double cost) {
        this.id = id;
        this.demand = demand;
        this.cost = cost;
    }

    public TreeNode(int id, double demand, double cost, double[] side) {
        this.id = id;
        this.demand = demand;
        this.cost = cost;
        this.side = side;
    }

    public int getId() {
        return id;
    }

    public double getDemand() {
        return demand;
    }

    public double getCost() {
        return cost;
    }

    public double[] getSide() {
        return side;
    }

    public List<TreeNode> getChildren() {
        return children;
    }

    public double getDiscountFactor() {
        return discountFactor;
    }

    public double getPrice() {
        return price;
    }

    public void addChildren(TreeNode child) {
        this.children.add(child);
    }

    @Override
    public String toString() {
        return "TreeNode{" +
                "id=" + id +
                ", demand=" + demand +
                ", cost=" + cost +
                ", side=" + Arrays.toString(side) +
                ", children=" + children +
                ", discountFactor=" + discountFactor +
                ", price=" + price +
                '}';
    }

    //获取当前节点的期望利润
    public double getExpectedProfit(){
        double profit = 0;
        if(children.size()==0){
            profit = (demand * price - demand * cost);
            return profit;
        } else {
            for (int i = 0; i < children.size(); i++) {
                profit = profit + side[i]*children.get(i).getExpectedProfit();
            }
            System.out.println("EP=   "+profit);
            profit = (profit + demand*price-demand*cost)/discountFactor;
            System.out.println("PEVP=   "+profit);
            return profit;
        }
    }
}
public class Test {
    public static void main(String[] args) {
        //node后面第一个数字表示时期,第二个表示可能出现的情况
        //以下为时期2的情况
        TreeNode node21 = new TreeNode(21,144,1.45);
        TreeNode node22 = new TreeNode(22,144,1.19);
        TreeNode node23 = new TreeNode(23,96,1.45);
        TreeNode node24 = new TreeNode(24,144,0.97);
        TreeNode node25 = new TreeNode(25,96,1.19);
        TreeNode node26 = new TreeNode(26,96,0.97);
        TreeNode node27 = new TreeNode(27,64,1.45);
        TreeNode node28 = new TreeNode(28,64,1.19);
        TreeNode node29 = new TreeNode(29,64,0.97);
        //以下为时期1的情况
        double[] side = {0.25,0.25,0.25,0.25};
        TreeNode node11 = new TreeNode(11,120,1.32,side);
        node11.addChildren(node21);
        node11.addChildren(node22);
        node11.addChildren(node23);
        node11.addChildren(node25);
        TreeNode node12 = new TreeNode(12,120,1.08,side);
        node12.addChildren(node22);
        node12.addChildren(node24);
        node12.addChildren(node25);
        node12.addChildren(node26);
        TreeNode node13 = new TreeNode(13,80,1.32,side);
        node13.addChildren(node23);
        node13.addChildren(node25);
        node13.addChildren(node27);
        node13.addChildren(node28);
        TreeNode node14 = new TreeNode(14,80,1.08,side);
        node14.addChildren(node25);
        node14.addChildren(node26);
        node14.addChildren(node28);
        node14.addChildren(node29);
        //以下为时期0的情况
        TreeNode node0 = new TreeNode(0,100,1.2,side);
        node0.addChildren(node11);
        node0.addChildren(node12);
        node0.addChildren(node13);
        node0.addChildren(node14);
        //计算npv
        double npv = node0.getExpectedProfit();
        System.out.println("==========================");
        System.out.println("NPV="+npv);
    }
}

        运行结果如下:

 五、总结        

        由于时间问题,剩下两种情况可以自己思考。固定方案NPV=38364,柔性租约方案为NPV=46545。结果显示,柔性合同对公司是最有力的。

        上述问题决策树解决的一个问题,决策树在企业决策运用的非常广泛,比如选择在案或离岸的方案等。

        在实践中,企业使用决策树面临的情况比上述要复杂得多,这类分析面临的一个典型挑战是明确输入信息。当获取一个准确的输入信息需要花费大量时间时,那么对需输入的信息使用一个估计值通常要快的多。在有敏感性分析支持的情况下,使用估计值是可以的。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值