Для более простой демонстрации моей проблемы я использую очень простую линейную программу. Я хочу установить в правой части одного ограничения определенное значение, которое я ввожу в поле ввода (Tkinter). Когда я нажимаю на кнопку, в метке будут отображаться переменные, не равные нулю.
Проблема: начальное значение поля ввода равно 0. Когда я изменяю его, например, на 100 я все еще получаю те же результаты. Результаты не меняют того, что я ввожу в поле ввода. Когда я жестко запрограммирую правостороннее значение ограничения на любое другое значение, результаты изменятся, но не в том случае, если я изменю его в своем поле ввода.
Похоже, что бы я ни вводил в поле ввода, Python всегда принимает начальное значение, равное 0. Он не обновляется до того, что я набрал.
import Tkinter as tk
from gurobipy import *
WIDTH = 330
HEIGHT = 500
root = tk.Tk()
canvas = tk.Canvas(root, height=HEIGHT, width=WIDTH)
canvas.pack()
conslabel = tk.Label(root, text='Constraint value')
conslabel.place(relx=0.1, rely = 0.02)
var = tk.IntVar()
entry = tk.Entry(root, textvariable=var)
entry.place(relx=0.5, rely=0.02, relwidth=0.3)
button = tk.Button(root, text = "yield result", command = lambda: [setEntryValue(), build_model(entryValue), m.optimize(), results(), m.reset()])
button.place(relx = 0.5, rely = 0.675, anchor = tk.CENTER)
outputLabel = tk.Label(root, bg='white')
outputLabel.place(relx = 0.5, rely = 0.85, anchor = tk.CENTER, relheight = 0.2, relwidth = 0.8)
entryValue = 0
def build_model(entryValue):
m = Model("lp1")
m.setParam('OutputFlag', False)
x1 = m.addVar(name="x1")
x2 = m.addVar(name="x2")
m.update()
m.setObjective(5*x1 + 4*x2, GRB.MAXIMIZE)
m.addConstr(6*x1 + 4*x2 <= 24, "constr_1")
m.addConstr(1*x1 + 2*x2 <= 6, "constr_2")
m.addConstr(-1*x1 + 1*x2 <= 1, "constr_3")
m.addConstr(x2 <= entryValue, "constr_4")
def setEntryValue():
global entryValue
entryValue = var.get()
return entryValue
def labeltext():
finalvars = ''
for v in m.getVars():
if v.x != 0:
finalvars += ' ' + str(v.varName)
return finalvars
def results():
for v in m.getVars():
print('%s: %f' % (v.varName, v.x))
print('Obj: %f' % m.objVal)
outputLabel['text'] = labeltext()
root.mainloop()
m.optimize
и это статично:x2 <= entryValue
- person stovfl   schedule 09.12.2019entryValue
– это начальное значение, которое никогда не будет привязано к цепочке. - person stovfl   schedule 09.12.2019addVar
: Можем ли мы сделать:.addVar(name="entry")
и позже(x2 <= entry.get()
- person stovfl   schedule 09.12.2019setEntryValue()
, которая простоentryValue = int(entry.get())
: это не будет работать по двум причинам: 1.entryValue
являетсяlocal
дляdef setEntryValue
и бесполезно. 2. Согласно update-the-model-after-editing После того как вы вызываетеModel.addConstr()
, он использует значенияentryValue
для создания ограничения без какой-либо ссылки наentryValue
- person stovfl   schedule 09.12.2019lambda:
. Использованиеlambda
примет начальное значение, равное0
, и передаст егоbuild_model(entryValue)
. Удалите параметр, используйтеdef build_model()
- person stovfl   schedule 09.12.2019