# Python蒙特卡洛模拟工作或任务轻重缓急策略

{% tabs %}
{% tab title="关键词" %}
Python | 蒙特卡洛 | Jupyter Notebook | NumPy | Matplotlib
{% endtab %}

{% tab title="梗概" %}
像很多人一样，我的待办事项列表中有很多事情。 这就引出了一个明显的问题：如果待办事项列表上有多个任务，你应该先做哪一个？名单上的首要任务式是哪个？最容易做到的是哪个？重要的事情是哪个？或者说你需要使用哪种更复杂的方法来解决它们？

当然，若您有足够的时间来完成任务，一切都会变得轻松。若您没有足够的时间，随之而来的问题是您应该首先解决哪些，以及使用什么策略来优化您的时间？

显然，这在很大程度上取决于您要优化的目标：您是否想完成尽可能多的任务？还是尽可能多地完成高优先级任务？还是尽可能及时的完成任务？

### 建模工具

蒙特卡洛模拟通过将一系列值（概率分布）替换为具有固有不确定性的任何因素来构建可能结果的模型，从而执行风险分析。 然后它一遍又一遍地计算结果，每次都使用来自概率函数的一组不同的随机值。这就是我们将用来找出在尝试优化待办事项列表时使用的最佳策略的工具。 我们将使用 Python构建蒙特卡罗模拟，在 Jupyter Notebook 上运行。 模拟将测试各种策略，我们将通过我们设计的一组指标来衡量它们的有效性。

#### 模型

我们需要做的第一件事是建立一个模型。这很简单，我们真正需要建模的只是任务。

在大多数待办事项列表中，我们都有任务描述、一些注释和截止日期。 许多还具有附加到任务的优先级。 作为任务建模的一部分，我们还需要指出任务花费的时间以及任务完成的日期。

```python
from recordtype import recordtype

# weight is the priority of the task 
# duration is how long it will take to complete the task 
# due is the due date of the task 
# done is the date when the task is completed (starts with 0, 
# set to whenever the task is done)
Task = recordtype('Task', 'weight duration due done')
```

我使用记录类型来表示任务。它就像一种可变的命名元组，并且相对简单。要创建任务记录类型，我们需要有一个函数来创建任务。

#### 任务

create\_task 函数采用任务数来创建并返回任务列表。对于每项任务，我需要设置权重、截止日期、持续时间和完成日期（完成）。

```python
import numpy as np

# create todo tasks
def create_tasks(num): 
    tasks = []
    distribution = np.round(np.random.exponential(5,10000))
    for i in range(num):
        weight = np.random.randint(1,100)
        due = np.random.choice(distribution)+1
        duration = np.random.randint(0,due)
        t = Task(weight=weight, duration=duration, due=due, done=0) 
        tasks.append(t)  
    return tasks
```

#### 统计

#### 初次模拟

### 蒙特卡洛模拟

#### 算法设计

#### 模拟结果示意图

### 源代码
{% endtab %}
{% endtabs %}

{% content-ref url="../zhi-dian-mi-jin-brief" %}
[zhi-dian-mi-jin-brief](../zhi-dian-mi-jin-brief)
{% endcontent-ref %}
