簡體   English   中英

如何 - 使用 Python w/Gekko 為具有多個約束的許多矩陣中的變量找到解決方案?

[英]How to - finding solution for variables in many matrices with multiple constraints using Python w/ Gekko?

這是我在此的頭一篇博文。

我有一個現實生活中的財務預算問題。

在我的 scope 加上 4 個季度中,每個國家/地區的 30 個國家/地區的業務單位的總預算值,我需要為每個國家/地區的每個國家/地區總數的多個(最多 30 個)產品線分配(查找)正確值。 我也有每個國家全年的目標值。 正確的值由約束定義:

  1. 每個國家/地區的每個季度總計為總 BusinessUnit(列,簡單總和)- 約束

  2. 每個產品線對一個國家/地區的總和為 FullYear(行,簡單總和)- 約束

  3. 對於這 30 個國家/地區的每個產品線總計(簡單總和),我們計算季節性 (Quarter[n] / FullYear),它也應該等於給定的約束。

  4. 最后,我正在尋找的所有值都需要總結為最終總約束值(准確率約為 99%)= 明年的總預算目標 - 約束

  5. 請檢查我在 excel 輸入文件中的數據示例結構的屏幕截圖。

變量和約束的示例結構

多年來,我一直在使用 excel 求解器工具,非常成功。 今年復雜性增長如此顯着 excel 求解器不再工作 - 變量和約束太多。 當我每天使用 python 和 pandas 時,我決定使用這些工具查找解決方案,但由於我沒有線性編程/解決方案查找/決策等方面的經驗。我真的不太了解文檔。 查看 Gekko package 教程我認為它可能對解決問題很有用,但我不知道如何應用 Gekko 包含的任何功能。

我還在尋找的是在此練習中使用 Pandas 來復制/粘貼大塊數據(io excel / jupyter notebook)並輕松創建矩陣/字典(無論如何我都能做到)以與建議的解決方案一起使用.

任何人都可以在這里提供幫助嗎? 不一定是 Gekko,但一般來說 - 你能告訴我如何使用 Python 來解決這個問題嗎? 我可以使用什么工具/庫來找到正確的數字分布? 如果可能,請建議片段...謝謝!

先感謝您

在 Gekko 中有幾個使用矩陣的例子:

還有一個使用 Gekko 變量的矩陣運算和使用 test_arrays.py 的Numpy的示例。

import numpy as np
from gekko import GEKKO

m = GEKKO(remote=False)

# Random 3x3
A = np.random.rand(3,3)
# Random 3x1
b = np.random.rand(3,1)
# Gekko array 3x3
p = m.Array(m.Param,(3,3))
# Gekko array 3x1
y = m.Array(m.Var,(3,1))

# Dot product of A p
x = np.dot(A,p)
# Dot product of x y
w = np.dot(x,y)
# Dot product of p y
z = np.dot(p,y)
# Trace (sum of diag) of p
t = np.trace(p)

# solve Ax = b
s = m.axb(A,b)
m.solve()

這是test_matrix.py的另一個示例:

from gekko import GEKKO
import numpy as np
m = GEKKO(remote=False)
ni = 3; nj = 2; nk = 4
# solve AX=B
A = m.Array(m.Var,(ni,nj),lb=0)
X = m.Array(m.Var,(nj,nk),lb=0)
AX = np.dot(A,X)
B = m.Array(m.Var,(ni,nk),lb=0)
# equality constraints
m.Equations([AX[i,j]==B[i,j] for i in range(ni) \
                             for j in range(nk)])
m.Equation(5==m.sum([m.sum([A[i][j] for i in range(ni)]) \
                                    for j in range(nj)]))
m.Equation(2==m.sum([m.sum([X[i][j] for i in range(nj)]) \
                                    for j in range(nk)]))
# objective function
m.Minimize(m.sum([m.sum([B[i][j] for i in range(ni)]) \
                                 for j in range(nk)]))
m.solve()
print(A)
print(X)
print(B)

Pandas DataFrames 可用於初始化矩陣初始猜測或矩陣輸入參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM