# -*- coding: utf-8 -*-
from typing import Any
[ドキュメント]def oil1(**kwds: Any) -> None:
"""油田問題(目的関数・変数・制約)"""
from pysimple import Problem, Variable
problem = Problem(name='油田問題1')
# 油田X,Yの運転日数/週(変数)
x = Variable(lb=0, ub=5, name='油田Xの運転日数')
y = Variable(lb=0, ub=5, name='油田Yの運転日数')
# 運転コスト(目的関数)
problem += 180*x + 160*y, '全運転コスト'
# 製品ノルマ
problem += 6*x + y >= 12, '重油ノルマ/週'
problem += 4*x + 6*y >= 24, 'ガスノルマ/週'
# 各油田の日数制約
# problem += 0 <= x, '油田Xの週あたりの運転日数制約(下限)'
# problem += x <= 5, '油田Xの週あたりの運転日数制約(上限)'
# problem += 0 <= y, '油田Yの週あたりの運転日数制約(下限)'
# problem += y <= 5, '油田Yの週あたりの運転日数制約(上限)'
# 求解
print(problem)
problem.solve(**kwds)
# 結果出力
print(x.val)
print(y.val)
print(problem.objective.val)
[ドキュメント]def oil2(**kwds: Any) -> None:
"""油田問題(定数)"""
from pysimple import Problem, Variable, Parameter
problem = Problem(name='油田問題2')
# 油田X,Yの運転日数/週(変数)
x = Variable(lb=0, ub=5, name='油田Xの運転日数')
y = Variable(lb=0, ub=5, name='油田Yの運転日数')
costX = Parameter(value=180, name='油田Xの運転コスト')
costY = Parameter(value=160, name='油田Xの運転コスト')
# costX = Parameter(value=100, name='油田Xの運転コスト')
# costY = Parameter(value=170, name='油田Xの運転コスト')
# 運転コスト(目的関数)
problem += costX*x + costY*y, '全運転コスト'
# 製品ノルマ
problem += 6*x + y >= 12, '重油ノルマ/週'
problem += 4*x + 6*y >= 24, 'ガスノルマ/週'
# 求解
print(problem)
problem.solve(**kwds)
# 結果出力
print(x.val)
print(y.val)
print(problem.objective.val)
[ドキュメント]def oil3(**kwds: Any) -> None:
"""油田問題(集合・添字)"""
from pysimple import Problem, Element, Parameter, Variable
problem = Problem(name='油田問題3')
# 油田を表す添字
i = Element(value=[0, 1], name='油田')
# # 油田集合
# OilField = Set(value=[0, 1], name='油田集合')
# i = Element(set=OilField)
# 製品を表す添字
j = Element(value=['重油', 'ガス'], name='製品')
# # 製品集合
# Product = Set(value=['重油', 'ガス'], name='製品集合')
# j = Element(set=Product)
# 油田 i の運転コスト/日
costX = Parameter(index=i, value={0: 180, 1: 160}, name='油田運転コスト')
# 製品 j のノルマ/週
norma = Parameter(index=j, value={'重油': 12, 'ガス': 24}, name='製品ノルマ')
# 油田 i の運転日数(変数)
x = Variable(lb=0, ub=5, index=i, name='油田の運転日数')
print(costX)
print(norma)
# 運転コスト/週(目的関数)
problem += costX[0]*x[0] + costX[1]*x[1], '全運転コスト'
# 製品ノルマ
problem += 6*x[0] + x[1] >= norma['重油'], '重油ノルマ/週'
problem += 4*x[0] + 6*x[1] >= norma['ガス'], 'ガスノルマ/週'
# 求解
print(problem)
problem.solve(**kwds)
# 結果出力
print(x.val)
print(problem.objective.val)
[ドキュメント]def oil4(**kwds: Any) -> None:
"""油田問題(集約・複数の添字)"""
from pysimple import Problem, Element, Parameter, Variable, Sum
problem = Problem(name='油田問題4')
# 油田を表す添字
i = Element(value=[0, 1], name='油田')
# 製品を表す添字
j = Element(value=['重油', 'ガス'], name='製品')
# 油田 i の運転コスト/日
costX = Parameter(index=i, value={0: 180, 1: 160}, name='油田運転コスト')
# 製品 j のノルマ/週
norma = Parameter(index=j, value={'重油': 12, 'ガス': 24}, name='製品ノルマ')
# 油田 i の製品 j 生産量/日
prodXvalue = {(0,'重油'): 6, (0,'ガス'): 4,
(1,'重油'): 1, (1,'ガス'): 6}
prodX = Parameter(index=(i,j), value=prodXvalue, name='油田の生産量')
# 油田 i の運転日数(変数)
x = Variable(lb=0, ub=5, index=i, name='油田の運転日数')
print(costX)
print(norma)
print(prodX)
# 運転コスト/週(目的関数)
problem += Sum(costX[i]*x[i], i), '全運転コスト'
# 製品ノルマ
problem += Sum(prodX[i,j]*x[i], i) >= norma[j], '製品ノルマ'
# 求解
print(problem)
problem.solve(**kwds)
# 結果出力
print(x.val)
print(problem.objective.val)
[ドキュメント]def oil5(**kwds: Any) -> None:
"""油田問題(式)"""
from pysimple import Problem, Element, Parameter, Variable, Sum
problem = Problem(name='油田問題5')
# 油田を表す添字
i = Element(value=[0, 1], name='油田')
# 製品を表す添字
j = Element(value=['重油', 'ガス'], name='製品')
# 油田 i の運転コスト/日
costX = Parameter(index=i, value={0: 180, 1: 160}, name='油田運転コスト')
# 製品 j のノルマ/週
norma = Parameter(index=j, value={'重油': 12, 'ガス': 24}, name='製品ノルマ')
# 油田 i の製品 j 生産量/日
prodXvalue = {(0,'重油'): 6, (0,'ガス'): 4,
(1,'重油'): 1, (1,'ガス'): 6}
prodX = Parameter(index=(i,j), value=prodXvalue, name='油田の生産量')
# 油田 i の運転日数(変数)
x = Variable(lb=0, ub=5, index=i, name='油田の運転日数')
print(costX)
print(norma)
print(prodX)
# 運転コスト/週(目的関数)
problem += Sum(costX[i]*x[i], i), '全運転コスト'
# 製品ノルマ
prod = Sum(prodX[i,j]*x[i], i)
prod.name = '製品の生産量'
problem += prod >= norma[j], '製品ノルマ'
# 求解
print(problem)
problem.solve(**kwds)
# 結果出力
print(x.val)
print(prod.val)
print(problem.objective.val)
[ドキュメント]def oil6(**kwds: Any) -> None:
"""油田問題(整数変数)"""
from pysimple import Problem, Element, Parameter, IntegerVariable, Sum
problem = Problem(name='油田問題6')
# 油田を表す添字
i = Element(value=[0, 1], name='油田')
# 製品を表す添字
j = Element(value=['重油', 'ガス'], name='製品')
# 油田 i の運転コスト/日
costX = Parameter(index=i, value={0: 180, 1: 160}, name='油田運転コスト')
# 製品 j のノルマ/週
norma = Parameter(index=j, value={'重油': 12, 'ガス': 24}, name='製品ノルマ')
# 油田 i の製品 j 生産量/日
prodXvalue = {(0,'重油'): 6, (0,'ガス'): 4,
(1,'重油'): 1, (1,'ガス'): 6}
prodX = Parameter(index=(i,j), value=prodXvalue, name='油田の生産量')
# 油田 i の運転日数(変数)
x = IntegerVariable(lb=0, ub=5, index=i, name='油田の運転日数')
print(costX)
print(norma)
print(prodX)
# 運転コスト/週(目的関数)
problem += Sum(costX[i]*x[i], i), '全運転コスト'
# 製品ノルマ
prod = Sum(prodX[i,j]*x[i], i)
prod.name = '製品の生産量'
problem += prod >= norma[j], '製品ノルマ'
# 求解
print(problem)
problem.solve(**kwds)
# 結果出力
print(x.val)
print(prod.val)
print(problem.objective.val)
[ドキュメント]def oil7(**kwds: Any) -> None:
"""油田問題(結果出力関数)"""
from pysimple import Problem, Element, Parameter, IntegerVariable, Sum, Printf
problem = Problem(name='油田問題7')
# 油田を表す添字
i = Element(value=[0, 1], name='油田')
# 製品を表す添字
j = Element(value=['重油', 'ガス'], name='製品')
# 油田 i の運転コスト/日
costX = Parameter(index=i, value={0: 180, 1: 160}, name='油田運転コスト')
# 製品 j のノルマ/週
norma = Parameter(index=j, value={'重油': 12, 'ガス': 24}, name='製品ノルマ')
# 油田 i の製品 j 生産量/日
prodXvalue = {(0,'重油'): 6, (0,'ガス'): 4,
(1,'重油'): 1, (1,'ガス'): 6}
prodX = Parameter(index=(i,j), value=prodXvalue, name='油田の生産量')
# 油田 i の運転日数(変数)
x = IntegerVariable(lb=0, ub=5, index=i, name='油田の運転日数')
print(costX)
print(norma)
print(prodX)
# 運転コスト/週(目的関数)
problem += Sum(costX[i]*x[i], i), '全運転コスト'
# 製品ノルマ
prod = Sum(prodX[i,j]*x[i], i)
prod.name = '製品の生産量'
problem += prod >= norma[j], '製品ノルマ'
# 求解
print(problem)
problem.solve(**kwds)
# 結果出力
Printf('油田 {} の最適運転日数 = {:.0f}', i, x[i].val)
print(prod.val)
print(problem.objective.val)
PROBLEMS = oil1, oil2, oil3, oil4, oil5, oil6, oil7
if __name__ == '__main__':
from sys import argv
if argv[1:]:
for arg in argv[1:]:
getattr(__import__(__name__), arg)()
else:
for PROBLEM in PROBLEMS:
PROBLEM()