Скрипт  позволяет решить известную в исследовании операций транспортную задачу. Используемая графическая оболочка имитирует транспортную таблицу.Прежде всего наполняем списки Servers и Clients в соответствии с производственным заданием.Для обновления дисплея активно используем джойстик(клавиши left,right,up,down).Стоимости перевозок вводим после нажатия клавиши backspace в каждой подсвеченной ячейке. Перевозку вносим в подсвеченную ячейку после нажатия клавиши enter.Балансировка задачи осуществляется в автоматическом режиме.После получения допустимого плана проверяем его на оптимальность последовательным нажатием клавиш '*' и '1' с последующим 'ручным' обновлением дисплея.

import appuifw,e32
from key_codes import*

appuifw.app.screen='full'
c=appuifw.Canvas()
appuifw.app.body=c
f=appuifw.Form([(u'Servers','text'\
,u'[,]'),(u'Clients','text',u'[,]')],appuifw.FFormDoubleSpaced)
f.execute()
e32.ao_yield()
ls,lc=eval(f[0][2]),eval(f[1][2])
ss=reduce(lambda i,j:i+j,ls)
sc=reduce(lambda i,j:i+j,lc)
ads=adc=0
if ss-sc>0:
  lc.append(ss-sc)
  adc=1
if sc-ss>0:
  ls.append(sc-ss)
  ads=1
ms,nc=len(ls),len(lc)
m,n=max(ms,nc),min(ms,nc)
hl,hw=280/m,200/n

class K:
  def __init__(self,x,y):
    self.x,self.y=x,y
    self.hl,self.hw=hl,hw
    self.c,self.tc,self.tcr=c,u'',u''
    self.tl,self.tr=u'',u''
  def dron(self):
    self.c.rectangle((self.x,self.y,\
self.x+self.hw,self.y+self.hl),\
0x000000,width=3)
    self.c.text((self.x+self.hw/4,\
self.y+15),self.tc)
    self.c.text((self.x+.7*self.hw,\
self.y+15),self.tcr)
    self.c.text((self.x+7,\
self.y+self.hl-5),self.tl)
    self.c.text((self.x+self.hw-25,\
self.y+0.75*self.hl),self.tr)
  def sign(self):
    self.c.rectangle((self.x,self.y,\
self.x+self.hw,self.y+self.hl),\
0xff0000,width=3)
    

lk,l=[],[]
for i in range(m+1):
  for j in range(n+1):
    l.append(K(j*hw,i*hl))
  lk.append(l)
  l=[]

if m==ms and m>n:
  for i in range(m):
    lk[i][n].tl=unicode(ls[i])
  if ads:
    lk[m-1][n].tc=u'+'
  for j in range(n):
    lk[m][j].tc=unicode(lc[j])
  if adc:
    lk[m][n-1].tcr=u'+'
if m==nc and m>n:
  for i in range(m):
    lk[i][n].tl=unicode(lc[i])
  if adc:
    lk[m-1][n].tc=u'+'
  for j in range(n):
    lk[m][j].tc=unicode(ls[j])
  if ads:
    lk[m][n-1].tcr=u'+'
if m==n:
  for i in range(m):
    lk[i][n].tl=unicode(lc[i])
  if adc:
    lk[m-1][n].tc=u'+'
  for j in range(n):
    lk[m][j].tc=unicode(ls[j])
  if ads:
    lk[m][n-1].tcr=u'+'
 
i=j=0
def move(x,y):
  global i,j
  i+=x;j+=y
  if i<0:
    i=0
  if j<0:
    j=0
  if i>m:
    i=m
  if j>n:
    j=n
  lk[i][j].sign()
  e32.ao_sleep(0.1)
  lk[i][j].dron()

def enter1():
  u=appuifw.query(u'Trans\
port','text',u'0')
  e32.ao_yield()
  if lk[i][j].tc:
    if eval(lk[i][j].tc)+eval(u):
      lk[i][j].tc=unicode(\
eval(lk[i][j].tc)+eval(u))
    else:
      lk[i][j].tc=u''
  else:
    lk[i][j].tc=u
  lk[i][n].tl=unicode(eval(lk[i][n].tl)\
-eval(u))
  lk[m][j].tc=unicode(eval(lk[m][j].\
tc)-eval(u))
  for a in range(m+1):
    for b in range(n+1):
      if b!=n:
        lk[a][b].tl=u''
      lk[a][b].dron()
 
def enter2():
  u=appuifw.query(u'Cost','text',u'0')
  e32.ao_yield()
  lk[i][j].tr=u
  for a in range(m+1):
    for b in range(n+1):
      lk[a][b].dron()

def enter3():
  counter=0
  account=0
  U,V=[0],[]
  for p in range(1,m):
    U.append(u'')
  for q in range(n):
    V.append(u'')
  lt=[(i,j,lk[i][j].tr) for i in range(m)\
 for j in range(n) if lk[i][j].tc!=u'']
  while True:
    for a in lt:
      if U[a[0]]!=u'':
        V[a[1]]=eval(a[2])-U[a[0]]
        del lt[lt.index(a)]
        continue
      if V[a[1]]!=u'':
        U[a[0]]=eval(a[2])-V[a[1]]
        del lt[lt.index(a)]
        continue
    if u'' in U or u'' in V:
      print 'U=',U, '\nV=',V
      continue
    else:
      print 'U=',U, '\nV=',V
      break
  for i in range(m):
    for j in range(n):
      if lk[i][j].tc:
        account+=eval(lk[i][j].tc)*\
eval(lk[i][j].tr)
      if eval(lk[i][j].tr)-U[i]-V[j]<0:
        counter+=1
        lk[i][j].tl=\
unicode(eval(lk[i][j].tr)-U[i]-V[j])
        lk[i][j].dron()
  if counter:
    appuifw.note(u'Transports\
 failed','error')
  else:
    appuifw.note(u'Transports\
 optimal','conf')
  e32.ao_yield()
  print 'Amount=',account

c.bind(EKeyRightArrow, lambda: move(0,1))
c.bind(EKeyUpArrow,    lambda: move(-1,0))
c.bind(EKeyLeftArrow,  lambda: move(0,-1))
c.bind(EKeyDownArrow,  lambda:move(1,0))
c.bind(EKeySelect,enter1)
c.bind(EKeyBackspace,enter2)
c.bind(EKeyStar and \
EKey1,enter3)

def exit():
    app_lock.signal()
appuifw.app.exit_key_handler=\
exit
app_lock=e32.Ao_lock()
app_lock.wait()

Создать бесплатный сайт с uCoz