[英]PuLP optimization
我正在嘗試使用PuLP庫創建一個程序,當您按下按鈕時,它可以解決線性問題並輸出值。 但是我不能使它工作。 它只寫了我的““輸入更多值”“並且不想解決。 也許我在輸入值方面有一些問題,但我不確定。
這是我的代碼:
from tkinter import*
from pulp import*
def problem(a_val, b_val, c_val, d_val, e_val, f_val, g_val):
prob=LpProblem("problem", LpMaximize)
x1=LpVariable("x1", lowBound=0)
x2=LpVariable("x2", lowBound=0)
x3=LpVariable("x3", lowBound=0)
prob+= a_val*x1 +b_val*x2 +c_val*x3,
prob+= d_val*x1 +e_val*x2 + f_val*x3 <= g_val,
prob.solve ()
print("status:", LpStatus[prob.status])
for v in prob.variables():
print (v.name, "=", v.varValue)
print("objective=%s$" % value(prob.objective))
root =Tk()
root.title("System")
root.geometry("1300x500+0+0")
a=Entry(Top, font=("arial", 10, "bold"), bd=8)
a.grid(row=1, column=1)
b=Entry(Top, font=("arial", 10, "bold"), bd=8)
b.grid(row=1, column=2)
c=Entry(Top, font=("arial", 10, "bold"), bd=8)
c.grid(row=1, column=3)
d=Entry(Top, font=("arial", 10, "bold"), bd=8)
d.grid(row=2, column=1)
e=Entry(Top, font=("arial", 10, "bold"), bd=8)
e.grid(row=2, column=2)
f=Entry(Top, font=("arial", 10, "bold"), bd=8)
f.grid(row=2, column=3)
g=Entry(Top, font=("arial", 10, "bold"), bd=8)
g.grid(row=3, column=1)
def inserter (value):
w.delete("0.0", "end")
w.insert("0.0", value)
def handler():
try:
g_val = float(g.get())
a_val = float(a.get())
b_val = float(b.get())
c_val = float(c.get())
d_val = float(d.get())
e_val = float(e.get())
f_val = float(f.get())
inserter(problem(a_val,b_val,c_val,d_val,e_val,f_val, g_val))
except ValueError:
inserter("Enter more values")
w=Text(Top, font=("arial", 10, "bold"), bd=6)
w.grid(row=4, column=1)
info6=Button(Top, font=("arial", 10,"bold"), text="Optimize", bd=8, command=handler)
info6.grid(row=4, column=0)
root.mainloop()
根據PuLP文檔,您需要在函數語句的末尾放置一個短字符串。
變量prob現在開始使用+ =運算符收集問題數據。 在邏輯上,首先在邏輯上輸入目標函數,並在語句末尾加一個重要的逗號,並用短字符串說明該目標函數是什么:
# The objective function is added to 'prob' first prob += 0.013*x1 + 0.008*x2, "Total Cost of Ingredients per can"
因此,您需要:
prob+= a_val*x1 +b_val*x2 +c_val*x3, "whats this"
prob+= d_val*x1 +e_val*x2 + f_val*x3 <= g_val, "something here too"
此外,您的函數問題不會返回任何內容(無),您正嘗試將其放入“文本”小部件中。 您將需要在函數內進行插入(或添加return語句)。 例如:
def problem(a_val, b_val, c_val, d_val, e_val, f_val, g_val):
...
w.delete("0.0", "end") # Clear the Text widget
print("status:", LpStatus[prob.status])
for v in prob.variables():
print (v.name, "=", v.varValue)
print("objective=%s$" % value(prob.objective))
w.insert(END, str(v.name) + "=" + str(v.varValue) + '\n' ) # Insert data at the END (rather then at the beginning)
w.insert(END, "objective=%s$" % value(prob.objective) + '\n' )
如果您決定執行以下操作(不使用return語句),請確保刪除您的自定義插入調用:
#inserter(problem(a_val,b_val,c_val,d_val,e_val,f_val, g_val)) #instead of this
problem(a_val,b_val,c_val,d_val,e_val,f_val, g_val) #do this
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.