Python эквивалент Excel Solver: получить максимальное значение, зная ограничения - PullRequest
0 голосов
/ 21 января 2019

Я довольно новичок в Python и пытаюсь найти Python, эквивалентный функции Excel Solver.Допустим, у меня есть следующие входные данные:

import math

totalvolflow=150585.6894
gaspercentvol=0.1
prodmod=1224
blpower=562.57
powercons=6

gasvolflow=totalvolflow*gaspercentvol
quantity=math.ceil(gasvolflow/prodmod)
maxpercentvol=powercons*totalvolflow*prodmod/blpower

Я хочу найти максимальное значение maxpercentvol, изменив gaspercentvol со следующим ограничением:

quantity*powercon<blpower

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Согласно:

maxpercentvol=powercons*totalvolflow*prodmod/blpower

maxpercentvol равно 1 965 802.12765274 независимо от значения gaspercentvol.

0 голосов
/ 21 января 2019

Я не опытный пользователь Excel, но, насколько я понимаю, Excel Solver - это решение для линейного / нелинейного программирования, верно?

В этом случае Python хорошо работает с хорошими библиотеками для оптимизации, такими как SciPy's optimize . Чтобы решить ваш конкретный пример, вы можете использовать что-то вроде:

import numpy as np
from scipy.optimize import minimize
import math

"""
x[0] = powercons
x[1] = totalvolflow
x[2] = prodmod
x[3] = blpower
x[4] = gaspercentvol
"""

def objective(x):
    """
    -powercons*totalvolflow*prodmod/blpower
    To maximize, we multiply our objective by -1
    """
    return -1.0*(x[0]*x[1]*x[2]/x[3])


def constraint1(x):
    """
    0 < blpower - quantity*powercon
    minimize expects constrains to be greater or equal than zero
    """
    return x[3] - (math.ceil(x[1]*x[4]/x[2])*x[0])

# Initial guess
n = 5
first_guess = np.zeros(n)
first_guess[0] = 6.0
first_guess[1] = 150585.6894
first_guess[2] = 1224
first_guess[3] = 562.57
first_guess[4] = 0.1


# constrains
constraint1_dict = {'type': 'ineq', 'fun': constraint1} 

# bounds
problem_bounds = (
    (6, 6),
    (150585.6894, 150585.6894),
    (1224, 1224),
    (562.57, 562.57),
    (0.05, 25)
)

# optimize
solution = minimize(
    objective,
    first_guess,
    bounds=problem_bounds,
    constraints=[constraint1_dict]
)

solution_values = solution.x

print(solution_values)
...