2017-03-15 4 views
0

ソルバーから4つの一連のループ(それぞれ15回の反復)を使用して60回の最適化を実行するコードを作成しました。コードは素晴らしいですが、それは(1時間以上)実行するために永遠に取っています。それぞれの最適化は、私が見ている月を変えるだけの単純な線形モデルです(グローバルな解が見つかります)。Excel VBAソルバーループが長すぎます

問題設定:容量不足という制約を受けて、摂取量を満たす労働者/テストリグの数を最小限に抑えようとしています。

私はそれをもっと速くする方法がわかりませんが、これを他の人に送信して使用することはできません。誰か提案はありますか?以下は

は私のコードです:

Sub Optimization() 

Application.ScreenUpdating = False 

'Unlocks workbook to allow updating 
Call Unlock_Workbook 

'Makes visible and selects the tab where the optimization problem is set up 
Sheets("Optimization").Visible = True 
Sheets("Optimization").Select 

'Clear variable ranges that solver will change 
Range("Worker_All[[1]:[15]]").Clear 
Range("TestRig_All[[1]:[15]]").Clear 
Range("Worker_787[[1]:[15]]").Clear 
Range("TestRig_787[[1]:[15]]").Clear 

'Install the Add-in for users who have no done this already 
AddIns("Solver Add-in").Installed = True 


'Optimized All Workers 

For i = 1 To 15 

'Cell address for objective 
Min = Cells(3, 2 + i).Address 
'Cell adress for variable 
Variable = Range("Worker_All[" & i & "]").Address 
'Cell address for constraint range 
ConstraintRange = Range("IntakeHours_NonKeyWO[" & i & "]").Address 
'Cell address for constrants 
Constraint = Range("IntakeHours_NonKeyWOC[" & i & "]").Address 

SolverReset 

SolverOk SetCell:=Min, MaxMinVal:=2, ValueOf:=0, ByChange:=Variable, _ 
    Engine:=2, EngineDesc:="Simplex LP" 
SolverAdd CellRef:=ConstraintRange, Relation:=1, FormulaText:=Constraint 
SolverSolve True 

Next i 

'Optimized All Test Rigs 

For i = 1 To 15 

Min = Cells(4, 2 + i).Address 
Variable = Range("TestRig_All[" & i & "]").Address 
ConstraintRange = Range("IntakeHours_NonKeyMO[" & i & "]").Address 
Constraint = Range("IntakeHours_NonKeyMOC[" & i & "]").Address 

SolverReset 

SolverOk SetCell:=Min, MaxMinVal:=2, ValueOf:=0, ByChange:=Variable, _ 
    Engine:=2, EngineDesc:="Simplex LP" 
SolverAdd CellRef:=ConstraintRange, Relation:=1, FormulaText:=Constraint 
SolverSolve True 

Next i 

'Optimized 787 Workers 

For i = 1 To 15 

Min = Cells(5, 2 + i).Address 
Variable = Range("Worker_787[" & i & "]").Address 
ConstraintRange = Range("IntakeHours_Key787WO[" & i & "]").Address 
Constraint = Range("IntakeHours_Key787WOC[" & i & "]").Address 

SolverReset 

SolverOk SetCell:=Min, MaxMinVal:=2, ValueOf:=0, ByChange:=Variable, _ 
    Engine:=2, EngineDesc:="Simplex LP" 
SolverAdd CellRef:=ConstraintRange, Relation:=1, FormulaText:=Constraint 
SolverSolve True 

Next i 

'Optimized 787 Test Rigs 

For i = 1 To 15 

Min = Cells(6, 2 + i).Address 
Variable = Range("TestRig_787[" & i & "]").Address 
ConstraintRange = Range("IntakeHours_Key787MO[" & i & "]").Address 
Constraint = Range("IntakeHours_Key787MOC[" & i & "]").Address 

SolverReset 

SolverOk SetCell:=Min, MaxMinVal:=2, ValueOf:=0, ByChange:=Variable, _ 
    Engine:=2, EngineDesc:="Simplex LP" 
SolverAdd CellRef:=ConstraintRange, Relation:=1, FormulaText:=Constraint 
SolverSolve True 

Next i 

Sheets("Cell Summary").Select 
Sheets("Optimization").Visible = False 

Call Lock_Workbook 

Application.ScreenUpdating = True 

End Sub 
+0

ここで質問することをお勧めします:http://codereview.stackexchange.com/help/on-topic – Adam

+0

'Engine:= 1'を試してみませんか? –

+0

をデバッガで実行して、ボトルネックを見つけたり、異なるセクションにタイマーを設定して、それらのセクションに到達するまでの時間をdebug.printにしてください。 –

答えて

0

は、その理由を考え出しました。私のワークシートには何百ものvlookupやその他の反応機能が含まれていました。これは、ワークシートが各反復を再計算し、それを大幅に減速させる原因となっていました。これらの値をハードコードすることで、私は<に2分の時間を得ることができました。

関連する問題