Blending Problem#

Importing Modules#

The gamspy Python package is loaded in order to access GAMSPy syntax.

[1]:
from gamspy import Container, Set, Parameter, Variable, Equation, Model, Sum, Sense
import numpy as np

Data#

[2]:
m = Container()

# Set
alloy = Set(
    container=m, name="alloy", records=["a", "b", "c", "d", "e", "f", "g", "h", "i"]
)
elem = Set(container=m, name="elem", records=["lead", "zinc", "tin"])

# Data
compdat = Parameter(
    container=m,
    name="compdat",
    domain=[elem, alloy],
    records=np.array(
        [
            [10, 10, 40, 60, 30, 30, 30, 50, 20],
            [10, 30, 50, 30, 30, 40, 20, 40, 30],
            [80, 60, 10, 10, 40, 30, 50, 10, 50],
        ]
    ),
)
price = Parameter(
    container=m,
    name="price",
    domain=alloy,
    records=np.array([4.1, 4.3, 5.8, 6.0, 7.6, 7.5, 7.3, 6.9, 7.3]),
)
rb = Parameter(container=m, name="rb", domain=elem, records=np.array([30, 30, 40]))

# Variable
v = Variable(container=m, name="v", domain=alloy, type="Positive")

Model#

[3]:
pc = Equation(container=m, name="pc", domain=elem)
mb = Equation(container=m, name="mb")

pc[elem] = Sum(alloy, compdat[elem, alloy] * v[alloy]) == rb[elem]
mb[...] = Sum(alloy, v[alloy]) == 1
[4]:
b1 = Model(
    container=m,
    name="b1",
    equations=[pc],
    problem="LP",
    sense=Sense.MIN,
    objective=Sum(alloy, price[alloy] * v[alloy]),
)
[5]:
b2 = Model(
    container=m,
    name="b2",
    equations=[pc, mb],
    problem="LP",
    sense=Sense.MIN,
    objective=Sum(alloy, price[alloy] * v[alloy]),
)

Solve#

[6]:
report = Parameter(container=m, name="report", domain=[alloy, "*"])
[7]:
b1.solve()
report[alloy, "blend-1"] = v.l[alloy]
[8]:
b2.solve()
report[alloy, "blend-2"] = v.l[alloy]

Reporting#

[9]:
report.pivot()
[9]:
blend-1 blend-2
b 0.6 0.6
d 0.4 0.4