2017-04-18 12 views
0

파이썬에서 COIN-OR을 사용하여 선형 프로그래밍 문제를 해결하려고합니다. 나는 모든 작업을 수행했지만 식별 할 수없는 오류가있는 것으로 보입니다. 강제로 시행하려는 제약에 따라 솔루션이 실행 불가능하거나 올바르지 않은 경우가 종종 있습니다. 이진 변수의 값도 ~ 0.1^10 또는 ~ 0.999 .....실행 불가능한 솔루션, Python에서 펄프, COIN-OR 사용

오류를 찾거나 문제를 해결하는 데 도움을주십시오.

나는

  • zip 파일 (엑셀의 코드 + 입력 데이터 파일)
  • 워드 문서를 부착하고있다. 수학 공식을 위해서

Model1 메인 클래스는 입력을 받아 새로운 출력 파일을 만든 다음 PanelTwo 클래스 메서드가 Distance 행렬과 Njg 행렬을 만듭니다.

이 theLP를 구축하고, 변수 및 제약 조건을 선언하는 LP에게

Here is the zip file

코드를 해결 MODEL1 클래스의 생성자 메서드에 오류가있는 것 같습니다가 있습니다

M = 100000 * prob.schoolNum

sModel = [] 
    for i in range(prob.schoolNum): 
     sModel.append(i) 
    gModel = [] 
    for i in xrange(prob.gradeNum): 
     gModel.append(i) 
    Beta = [] 

    for i in xrange(prob.schoolNum): 
     temp = 0 
     for j in xrange(prob.gradeNum): 
      temp = temp + prob.Njg[i][j] 
     if temp < prob.Nmax: 
      Beta.append(0) 
     else: 
      Beta.append(1) 


    # x = students of grade g transfer from school i to j 
    x = LpVariable.matrix("x_igj_", (sModel, gModel, sModel), 0, 1, LpBinary) 
    y = LpVariable.matrix("status of school", (sModel), 0, 1, LpBinary) 
    # o = resulting students in grade in school 
    o = LpVariable.matrix("o", (sModel, gModel), 0, None, LpInteger) 

    # oHelper = summation of o for all g rades 
    oHelper = LpVariable.matrix("oH", (gModel), 0, None, LpInteger) 
    #Njg_Helper = Total students in a particular school 
    Njg_helper = LpVariable.matrix("NH", (sModel), 0, None, LpInteger) 






    formulation = LpProblem("School Consolidation Model", LpMinimize) 

    formulation += lpSum(((prob.Njg[i][g] * x[i][g][j] for j in sModel) for g in gModel) for i in sModel) 

    for i in sModel: 
     for j in sModel: 
      for g in gModel: 
       formulation += x[i][g][j] * prob.D[i][j] <= prob.d1 

    for i in sModel: 
     for j in sModel: 
      for g in gModel: 
       formulation += x[i][g][j] <= y[j] 
    for i in sModel: 
     for g in gModel: 
      formulation += lpSum(x[i][g][j] for j in sModel) <= 1 - y[i] 

    for j in sModel: 
     formulation += ((lpSum(prob.Njg[j][g] for g in gModel) - prob.Nmax) * (1 - y[j])) <= 0 

    for i in sModel: 
     for j in sModel: 
      if i != j and Beta[i] * Beta[j] != 1: 
       formulation += (prob.D[i][j] - prob.d2) >= (y[i] + y[j] - 2) * M 

    for g in gModel: 
     formulation += lpSum(o[j][g] for j in sModel) == oHelper[g] 
     formulation += lpSum(prob.Njg[i][g] for i in sModel) == oHelper[g] 
     for j1 in sModel: 
      formulation += lpSum(prob.Njg[i1][g]*x[i1][g][j1] for i1 in sModel) == o[j1][g]-prob.Njg[j1][g]*y[j1] 

    formulation.solve() 
+0

당신은 당신이 아니라 zip 파일에 링크보다, 질문 자체에 오류를 발견하고 코드를 복사 할 경우 더 유용한 정보를 얻을 가능성이있어. – bouteillebleu

+0

조언 해 주셔서 감사합니다. 몇 가지 해결책을 얻을 수 있습니까? – Ujjawal107

답변

0

모델에 버그가있을 수 있습니다. 나는 다음을 시도합니다 :

  • 빌드 최소 모델을 모든 기능. 즉, 생성 할 수있는 모델을 인간이 읽을 수 있도록 만들 수있는 가장 작은 모델 (장난감 예제)을 먼저 빌드하십시오. 하나 또는 두 명의 학생, 두 곳만 있습니다. 모델을 사용하면 솔루션을 손으로 계산할 수 있습니다.
  • Pulp 함수를 사용하여 모델을 포함하는 LP 파일을 만듭니다.
  • 다른 솔버를 사용하여 모델을 실행하여 이 적합하지 않은지 확인하십시오. 예를 들어 상용 프로젝트가 아닌 경우 SCIP를 시도하십시오. 결과.
  • lp 파일을 읽고 모델의 버그를 확인하거나 찾으십시오. 도움이되기를 바랍니다 -
+0

도움과 배려에 감사드립니다. 마침내 솔루션을 찾을 수있게되었습니다. – Ujjawal107

-1
import wx 
import wx.xrc 

class WelcomeScreen(wx.Frame): 
    def __init__(self, parent): 
     wx.Frame.__init__(self, parent, id=wx.ID_ANY, title=u"Stock Cutting", pos=wx.DefaultPosition, 
          size=wx.Size(448, 395), style=wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL) 

     self.Bind(wx.EVT_CLOSE, self.OnClose) 

     # prevent resizing of the window 
     self.SetSizeHintsSz(wx.Size(448, 394), wx.Size(448, 395)) 

     bSizer1 = wx.BoxSizer(wx.VERTICAL) 

     #create image object using the jpg file stored in the root directory 
     self.m_bitmap1 = wx.StaticBitmap(self, wx.ID_ANY, wx.Bitmap(u"test.jpg", wx.BITMAP_TYPE_ANY), 
             wx.DefaultPosition, wx.DefaultSize, 0) 

     bSizer1.Add(self.m_bitmap1, 0, wx.ALL, 5) 

     self.m_button1 = wx.Button(self, wx.ID_ANY, u"START", wx.DefaultPosition, wx.DefaultSize, 0) 
     self.m_button1.SetFont(wx.Font(15, 71, 90, 92, False, wx.EmptyString)) 
     self.m_button1.Bind(wx.EVT_BUTTON, self.next, self.m_button1) 
     bSizer1.Add(self.m_button1, 1, wx.ALL | wx.EXPAND, 5) 

     self.SetSizer(bSizer1) 
     self.Layout() 
     self.Centre(wx.BOTH) 
     self.Show(True) 

    def OnClose(self, event): 
     dlg = wx.MessageDialog(self, 
           "Do you really want to close this application?", 
           "Confirm Exit", wx.OK | wx.CANCEL | wx.ICON_QUESTION) 
     result = dlg.ShowModal() 
     dlg.Destroy() 
     if result == wx.ID_OK: 
      self.Destroy() 

    # function to go to the next screen to enter the data 
    def next(self, event): 
     self.Show(False) 
#  start = home.HomeScreen(None, prob) 

# main method to start the application 
if __name__ == "__main__": 
    app = wx.App() 
    WelcomeScreen = WelcomeScreen(None) 
    app.MainLoop()