Blending Problem#

This problem is taken from PuLP case studies.

This example shows some basic usage of OptFlow similar to other modeling languages (CVXPY, PuLP, Pyomo, etc.), such as flow.Variable, flow.Input and flow.Constant, and how NumPy arrays np.ndarray can be used as constants in OptFlow.

# Author: Anonymized for paper review
# Case Study: The Blending problem
# https://coin-or.github.io/pulp/CaseStudies/a_blending_problem.html

import optflow as flow

x_1 = flow.Variable(flow.continuous)
x_2 = flow.Variable(flow.continuous)
obj = 0.013 * x_1 + 0.008 * x_2

constraints = [
    x_1 + x_2 == 100.0,
    0.1 * x_1 + 0.2 * x_2 >= 8.0,
    0.08 * x_1 + 0.1 * x_2 >= 6.0,
    0.001 * x_1 + 0.005 * x_2 <= 5.0,
    0.002 * x_1 + 0.005 * x_2 <= 0.4
]

prob = flow.Problem(objective=obj, constraints=constraints, sense=flow.minimize)
opt_obj = prob.solve(solver=flow.programming)
print(opt_obj)
print(x_1.optimized_value)
print(x_2.optimized_value)
# Author: Anonymized for paper review
# Case Study: The Blending problem
# https://coin-or.github.io/pulp/CaseStudies/a_blending_problem.html

import optflow as flow
import numpy as np

N = 2
x = flow.Variable(flow.continuous, shape=(N, ))
cost = flow.Input(dtype=flow.float64, shape=(N, ))
percentage = flow.Constant(dtype=flow.float64, shape=(4, N),
                           value=np.array([[0.1, 0.2], [0.08, 0.1], [0.001, 0.005], [0.002, 0.005]]))
obj = sum(cost[i] * x[i] for i in range(N))

constraints = [
    x[0] + x[1] == 100.0,
    percentage[0, 0] * x[0] + percentage[0, 1] * x[1] >= 8.0,
    percentage[1, 0] * x[0] + percentage[1, 1] * x[1] >= 6.0,
    percentage[2, 0] * x[0] + percentage[2, 1] * x[1] <= 5.0,
    percentage[3, 0] * x[0] + percentage[3, 1] * x[1] <= 0.4
]

prob = flow.Problem(objective=obj, constraints=constraints, sense=flow.minimize)
opt_obj = prob.solve(solver=flow.programming, inputs={cost: np.array([0.013, 0.008])})
print(opt_obj)
print(x[0].optimized_value)
print(x[1].optimized_value)
# Author: Anonymized for paper review
# Case Study: The Blending problem (with input)
# https://coin-or.github.io/pulp/CaseStudies/a_blending_problem.html

import optflow as flow

x_1 = flow.Variable(cat=flow.continuous)
x_2 = flow.Variable(cat=flow.continuous)
cost_chicken = flow.Input(dtype=flow.float32)
cost_beef = flow.Input(dtype=flow.float32)
protein_lb = flow.Input(dtype=flow.float32)
fat_lb = flow.Input(dtype=flow.float32)
fibre_ub = flow.Input(dtype=flow.float32)
salt_ub = flow.Input(dtype=flow.float32)
obj = cost_chicken * x_1 + cost_beef * x_2

constraints = [
    x_1 + x_2 == 100.0,
    0.1 * x_1 + 0.2 * x_2 >= protein_lb,
    0.08 * x_1 + 0.1 * x_2 >= fat_lb,
    0.001 * x_1 + 0.005 * x_2 <= fibre_ub,
    0.002 * x_1 + 0.005 * x_2 <= salt_ub
]

prob = flow.Problem(objective=obj, constraints=constraints, sense=flow.minimize)
opt_obj = prob.solve(solver=flow.programming, inputs={
    cost_chicken: 0.013, cost_beef: 0.008, protein_lb: 8., fat_lb: 6., fibre_ub: 2., salt_ub: .4})
print(opt_obj)
print(x_1.optimized_value)
print(x_2.optimized_value)

[Run Online Demo] (password: )