Optimizing Your Schedule II (or: When Hours Aren’t the Thing You Run Out Of)

30 June 2026 · personal data science advice

A couple of weeks ago I wrote a piece about optimizing your week: treat the seven days as a fixed budget of 168 hours, write down what you actually value, attach a weight to each thing, and let the math show you the gap between what you claim matters and what actually gets your hours. The model rested on one assumption, which I stated as if it were the only constraint that mattered: there are 168 hours in a week, and every hour you spend on one thing is an hour you did not spend on another.

A reader, Angela, replied with a great suggestion:

“Time is not the only constraint. For many of us, energy is also an important factor. An older person, a new parent, someone recovering from surgery, or someone living with a chronic condition may have plenty of hours but very little high-quality energy.”

Angela Carrington, in reply to Part I

She asked me to give it some thought and write about how I would optimize a life when energy, not time, is the thing in short supply. So this is Part II. She is right that time is the easy constraint to model. Two people can hold an identical, perfectly empty Tuesday and have wildly different Tuesdays, because one of them has the energy to use it and the other does not.

As before, there is a switch below. Flip it on if you want the equations, the code, and a working model of a depleted week you can actually run. Leave it off and this stays a plain-English essay.

nerd_mode = True
# Welcome back. We are adding a second resource.
assert your_energy > 0 # if this fails, close the laptop and go to bed

Quick jargon guide (expand)

Building on Part I’s glossary, the new terms here:

  • Resource constraint: a limit on something other than time that the solution must respect. The week now has two: hours and energy.
  • Renewable resource: a quantity that is consumed and replenished within the planning window, rather than fixed.
  • Energy balance: the requirement that energy spent across the week cannot exceed energy restored (plus any reserve you insist on keeping).
  • Binding vs. slack constraint: a constraint is binding if the solution is pressed right up against it, and slack if there is room to spare. Part I was about time binding. This part is about energy binding instead.
  • Shadow price: how much your objective would improve if you relaxed a binding constraint by one unit. The value of one more unit of energy, in other words.
  • Infeasibility: the state where no allocation satisfies every constraint at once.

A week has more than one budget

You have more than one budget

Part I treated the week as a single pot of 168 hours to be divided up. BUT, we spend hours through energy. An hour you are rested enough to use and an hour you spend staring at the wall because you are wrung out are both, on the calendar, an hour. In Part I we defined the hours summing to 168 as our only resource constraint, but now we want to consider energy.

Formally, nothing about Part I changes. The activity set \(A\), the decision variables \(x_i\) (hours on activity \(i\)), the weights \(w_i\), the bounds, the integrality, all stay. We are simply adding a second resource that each activity draws on or contributes to, and a constraint that this second resource also has to balance.

Photograph by Ken Reid
© Ken Reid.

Some hours spend energy, but some hours make it!

Time only ever runs in one direction: you cannot do something that gives you back an hour. But energy is two-directional. Some of what you do drains you. Some of it fills you back up. Sleep, obviously. Genuine rest. For some people, exercise, or time with the right person, or an hour of the work they love. The same activity can even flip sign depending on the week: a dinner with friends is a deposit when you are well and a withdrawal when you are flattened, or depending if that friend is someone you can truly relax around, or someone you have to mask for.

Sleep and rest are not the indulgences left over after the real work is done. They are the activities that produce the currency every other activity spends. When you cut your sleep to buy back two hours for a project, you have not found two free hours. You have borrowed them, at interest, against tomorrow’s capacity. The model in Part I could not see this, because to it sleep was just another claimant on the hours. Here, sleep is where the energy comes from.

And the corollary, which is the one that actually changes behaviour: protecting the things that restore you is not selfish, and it is not a reward you earn after the important things are done. It is the precondition for any of the important things happening at all. You fund the producers first, or the whole budget collapses.

Give each activity \(i\) an energy rate \(e_i\): the net energy it costs or returns per hour. Consumers have \(e_i < 0\); producers have \(e_i > 0\). For the same activity set as Part I, modelling a healthy week:

Activity \(i\)\(w_i\)\(e_i\)role
family5+1mild producer
sleep4+2main producer
deep work4−3heavy consumer
exercise4−2consumer
learning3−2consumer
leisure3+2producer
paid work1−2consumer
chores1−1consumer
doomscrolling−1−1consumer

Note that \(w_i\) and \(e_i\) are independent. Deep work and exercise both score 4 on value, but deep work costs more energy per hour. Doomscrolling is the worst of both worlds: negative value and negative energy, which is exactly why it feels like rest and isn’t. These numbers are mine, and they are rough, and like the weights they are meant to be argued with. The point is that you now have to write down a second number for each activity, and writing it down is most of the work.

The new constraint is an energy balance. Sum the energy across the week, and require it to come out non-negative, or better, to leave a reserve \(R\) in the bank:

\[ \sum_{i \in A} e_i \, x_i \;\ge\; R \]

Energy produced minus energy consumed, across the whole week, must be at least \(R\). With \(R = 0\) you finish empty; with \(R > 0\) you insist on ending the week with something left over.

Time is the constraint \(\sum x_i = 168\). Energy is the constraint \(\sum e_i x_i \ge R\). A week has to satisfy both at once, and which one binds, which one you are pressed up against with no room left, is the thing that decides what your week is allowed to look like.

The metric changes

When time is what’s scarce, the instinct is to ask of each activity: is this worth the hour? That is the right question for a busy, healthy week. But when energy is what’s scarce, the question changes to something subtler and more useful: is this worth the energy? Two things can cost the same hour and wildly different amounts of you. An energy-limited week is one long, mostly unconscious triage of which activities give the most back per unit of the thing you are actually short of.

This is why two activities you value identically can meet completely different fates in a hard week. If learning a language and a hard gym session both matter to you the same amount, but one leaves you able to function afterwards and the other puts you on the sofa for the rest of the day, then in a depleted week they are not equivalent at all, no matter what your priority list says. The cheaper-to-run one wins, not because you value it more, but because you can afford it.

When time binds, the solver ranks activities by value per hour, which is just \(w_i\). When energy binds, the relevant ratio becomes value per unit of energy consumed, roughly \(w_i / |e_i|\) for the consumers. Deep work and exercise both have \(w_i = 4\), but deep work costs \(e_i = -3\) against exercise’s \(-2\), so per unit of scarce energy exercise delivers more value. Hold that ratio in mind, because in a moment the solver is going to act on it without being told to, and cut exactly the activity you would least expect a “productivity” model to cut.

The model, with energy added

Here is the whole thing. It is Part I’s model with one extra constraint and one extra column of data:

\[ \begin{aligned} \max_{x} \quad & \sum_{i \in A} w_i \, x_i \\[4pt] \text{s.t.} \quad & \sum_{i \in A} x_i = 168 && \text{(time)} \\[2pt] & \sum_{i \in A} e_i \, x_i \ge R && \text{(energy)} \\[2pt] & \ell_i \le x_i \le u_i && \forall \, i \in A \\[2pt] & x_i \in \mathbb{Z}_{\ge 0} && \forall \, i \in A \end{aligned} \]

Same objective and same bounds as Part I. The new line is the energy balance. \(R\) is the dial we are going to turn: \(R = 0\) is a healthy week that just needs to break even; a large \(R\) is a depleted week that has to claw back a reserve.

And in code, again with PuLP so it runs as-is after pip install pulp. The only additions over Part I are the energy column and the balance constraint, with the reserve \(R\) as a single tunable knob.

The model in Python (PuLP)
import pulp

# --- Data: Part I's values grid, plus an energy rate per hour ----------------
# weight       = how much an hour is worth to you (the "matters" column)
# (low, high)  = the floor you won't drop below and the pointless-beyond ceiling
# energy       = net energy per hour: positive restores, negative drains
activities = {
    #               weight  low  high  energy
    "family":      ( 5,     14,   28,   +1),
    "sleep":       ( 4,     49,   56,   +2),   # the main regenerator
    "deep_work":   ( 4,      0,   15,   -3),   # meaningful, but expensive
    "exercise":    ( 4,      0,   10,   -2),
    "learning":    ( 3,      0,   10,   -2),
    "leisure":     ( 3,      0,   20,   +2),   # genuine rest restores
    "paid_work":   ( 1,     40,   40,   -2),   # fixed by contract
    "chores":      ( 1,      7,   14,   -1),
    "doomscroll":  (-1,      0,  168,   -1),   # negative value AND negative energy
}

WEEK = 168
RESERVE = 0          # energy left in the bank at week's end. Turn this up to deplete.

# --- Model -------------------------------------------------------------------
m = pulp.LpProblem("optimize_my_energy", pulp.LpMaximize)

x = {
    name: pulp.LpVariable(name, lowBound=lo, upBound=hi, cat="Integer")
    for name, (w, lo, hi, e) in activities.items()
}

# Objective: total weighted value (unchanged from Part I)
m += pulp.lpSum(w * x[name] for name, (w, lo, hi, e) in activities.items())

# Constraint 1: the week is finite and fully allocated
m += pulp.lpSum(x.values()) == WEEK

# Constraint 2 (new): energy must balance, leaving RESERVE in the bank
m += pulp.lpSum(e * x[name] for name, (w, lo, hi, e) in activities.items()) >= RESERVE

# --- Solve -------------------------------------------------------------------
m.solve(pulp.PULP_CBC_CMD(msg=False))

print("Status:", pulp.LpStatus[m.status])
for name in activities:
    print(f"  {name:11s} {int(x[name].value()):>4d} h")
print(f"Weighted score: {int(pulp.value(m.objective))}")

What the solver says when energy gets tight

Run it with RESERVE = 0 and you get the Part I result. Family, sleep, and deep work pinned to their ceilings; doomscrolling at zero; objective 547. The energy constraint is satisfied with twelve units to spare, which is to say it is slack: it isn’t doing anything. For a healthy week, time is the objective. That is the privilege Angela named.

Now make the week a hard one. Same person, same 168 hours, same values, same bounds. The only thing that changes is that you can no longer afford to finish on empty: a body recovering, a newborn, a flare-up, a stretch of grief or stress all mean you have to end the week with energy actually banked, not borrowed. Set RESERVE = 50 and solve again. Here are the two weeks the solver returns, side by side:

Activity Healthy
(R = 0)
Depleted
(R = 50)
Δ
family28280
sleep56560
deep work157−8
exercise10100
learning000
leisure1220+8
paid work40400
chores770
doomscrolling000
Weighted score547539−8

Both weeks are 168 hours and both solve to Optimal. The energy balance is slack in the healthy week (+12 to spare) and binding in the depleted one (exactly +50, the reserve). Every hour the model moves comes out of one row and lands in another.

Look at what moved, and what didn’t. It did not touch your sleep, your family, your paid work, or your chores. It reached straight for deep work, the meaningful work you would do even unpaid, and cut it almost in half, pouring those eight hours into leisure. The model gave them to rest because, once energy has to balance with a reserve, deep work is the most expensive thing you value, the worst ratio of value to energy among everything you care about, and so it is the first thing a constrained week sacrifices.

The energy-limited week does not lose the trivial things first. It loses the meaningful-but-costly things first, and it keeps going. Push the reserve to 60 and deep work falls to zero entirely, the model declining to spend a single hour on the work you love because it cannot afford the energy, even though the hours are sitting right there. Push it to 80 and the solver stops returning a schedule at all:

Solver output, RESERVE = 80
Status: Infeasible

Infeasible means no arrangement of the 168 hours can satisfy every constraint at once: you cannot hold a forty-hour contract, keep the floors you set, and bank that much energy, all in the same week. The model is not broken. It is telling you that the week as specified is not survivable, and that something you labelled non-negotiable is going to have to move whether you like it or not. Cut the contract hours, drop a floor, get help with the chores, lower the reserve and accept a slower recovery. This converts “why can’t I keep up” into “here is the specific constraint that has to give,” which is a question with useful answers.

An energy audit

Part I had you build a values grid: list what you actually spend the week on, score how much each thing matters, and note the hours it currently gets. The energy version adds one column, and it is the column that explains your worst weeks. For each activity, mark whether it gives you energy or takes it, and roughly how much, on a small scale from, say, −2 to +2.

What's nice about doing this is it forces you to come to some realizations: sometimes activities you enjoy, or really want to do, are the biggest drains. For me, I consider exercise to be a drain on my energy but I've found the opposite: I'm often energized after working out (though I modelled it as my original below).

Here is the worked example, my own, the same grid from Part I with the energy column filled in.

Activity Matters (1–5) Energy (−2…+2) What the pairing tells me
Family & close relationships5+1High value and restorative.
Sleep4+2The factory that makes the currency.
Meaningful work / craft4−3What I value most among the costly things, so the first casualty of a low-energy week.
Exercise4−2Costs energy now, builds capacity later.
Learning3−2Valued, but expensive and easy to drop. It always goes early.
Genuine rest / leisure3+2A producer, not a treat. This is a requirement to be productive.
Paid work (fixed)1−2Drains and can’t be moved — which is why a bad week has so little slack.
Chores & admin1−1Low value, low-ish drain, stubborn minimum. The grind that never restores.
Doomscrolling−1−1Negative on both. Feels like rest, costs like a tax. The cleanest thing to cut.

Two columns side by side do something one column can’t. Run your eye down them together and the structure of a bad week appears: the high-value, high-drain rows (the craft, the learning, the exercise) are the ones that vanish when energy is short, and the negative-negative rows are the ones that expand to fill the space they leave. That is the shape of burnout, drawn in two columns. Knowing the shape is most of how you interrupt it!

This grid is, again, almost exactly the model’s input. The “matters” column is the weights \(w_i\); the new column is the energy rates \(e_i\); the activities are the set \(A\). The only thing the table doesn’t show is the bounds and the reserve \(R\), and those are the two things worth playing with once you’ve typed your own numbers in.

Photograph by Ken Reid
© Ken Reid.

The limits (this model lies in new ways!)

Part I came with a list of ways its model failed to be reality, and adding energy adds its own failures.

Energy is not one substance. I have modelled it as a single scalar, but anyone who has been wrung out emotionally while still physically fine, or bodily exhausted but mentally wired, knows it is at least three different budgets: physical, emotional, cognitive. A faithful model would have a separate balance for each, and an activity would draw on them in different mixes.

The energy rates are not constants. I wrote \(e_i\) as a fixed number per activity, but the truth is the rate depends on the level: the first hour of rest restores far more than the fifth, and the tenth hour of deep work costs far more than the first. Energy, like value, has diminishing returns and worsening costs, and a linear coefficient is a polite fiction that the bounds are again papering over.

And the regeneration rate itself is not yours to set. For an older person, someone unwell, someone recovering, the producer activities simply return less: their sleep restores less, their rest restores less, the same hours yield less energy. In the model that is a smaller \(e_i\) on the producers, which shrinks the feasible region, which is the mathematics of why the same life is so much harder for some people through no failure of theirs. That's ignoring variability and unknown error: what if you wake up and just have zero energy? It can't be predicted so how do you model it? You can't, of course. But this can help you learn about what brings your energy levels back up.

Most of all, the thing that refills you most is often the thing you cannot schedule: the unplanned conversation, the morning the weather and your mood happen to align, the rest that only works when it isn’t prescribed. You can only leave room for it, which the model, to its credit, does by leaving slack.

The point, again, isn’t the schedule

Part I argued that the value of the exercise was not the optimized week but everything you had to admit in order to build it. The same is true here: filling in the energy column forces a confession that the reason the important thing didn’t happen often wasn’t time, and wasn’t character, but a second budget we never costed and then blamed ourselves for overrunning.

If you are one of the people Angela described, with plenty of hours and very little high-quality energy, I hope the reframing is at least a small kindness. The meaningful work that didn’t get done this week was not a failure of will. It was the most expensive thing you value running into a budget that wouldn’t stretch to it, and the humane response is not to push harder but to protect the producers, lower a floor you thought was fixed, and forgive the casualties. Rest is not what you do when the important things are finished. For a great many people, rest is the important thing, because it is the only thing that makes the rest of it possible.

Angela, thank you for the challenge, and for being right. You asked how I would optimize a life when energy is the thing that runs out, and the answer the model keeps giving is: you stop trying to win the week, you fund the things that refill you first, and you treat the work you love not as a duty you are failing but as a luxury you spend energy on when you can afford it. Some weeks you can. Some weeks one hour of it is the whole victory, and that, as I said last time, is still one hour more than none.


Back to all posts