整数の最適化

英語で中国の非直接的な翻訳を、しかし処理のメモの後、英語だけが彼らの専門的なプレゼンテーションを記録学ぶために:注意してください。

混合整数プログラミング

可変部分(すべてではない)である整数の問題は、混合整数計画を混合整数計画(MIP)を解くために使用することができます。MIPはまた、混合整数線形計画問題、混合整数線形計画(MILP)と呼ぶことができます。

MIPソルバー

OR-ツールバラエティーMIPソルバー、デフォルトのオープンソルバーコイン型または分枝カット(CBC)。あなたは、ソースからインストールする場合は、次のような他のサードパーティのソルバーを使用することができます。

  • Shcif
  • Grlarfk
  • Gurobi

ステップ:

  • インポートソルバー
  • 声明ソルバー
  • コールソルバー

例えば:

  • 目標:(X + 10Y)を最大化
  • 制約:
    • X + 7と≤17.5
    • X≤3.5
    • X≥0
    • Y≥0
    • x、yは整数であり、
from ortools.linear_solver import pywraplp

def main():
    # Create the mip solver with the CBC backend.
    solver = pywraplp.Solver('simple_mip_program',
                             pywraplp.Solver.CBC_MIXED_INTEGER_PROGRAMMING)

    infinity = solver.infinity()
    # x and y are integer non-negative variables.
    x = solver.IntVar(0.0, infinity, 'x')
    y = solver.IntVar(0.0, infinity, 'y')

    print('Number of variables =', solver.NumVariables())

    # x + 7 * y <= 17.5.
    solver.Add(x + 7 * y <= 17.5)

    # x <= 3.5.
    solver.Add(x <= 3.5)

    print('Number of constraints =', solver.NumConstraints())

    # Maximize x + 10 * y.
    solver.Maximize(x + 10 * y)

    result_status = solver.Solve()
    # The problem has an optimal solution.
    assert result_status == pywraplp.Solver.OPTIMAL

    # The solution looks legit (when using solvers others than
    # GLOP_LINEAR_PROGRAMMING, verifying the solution is highly recommended!).
    assert solver.VerifySolution(1e-7, True)

    print('Solution:')
    print('Objective value =', solver.Objective().Value())
    print('x =', x.solution_value())
    print('y =', y.solution_value())

    print('\nAdvanced usage:')
    print('Problem solved in %f milliseconds' % solver.wall_time())
    print('Problem solved in %d iterations' % solver.iterations())
    print('Problem solved in %d branch-and-bound nodes' % solver.nodes())


if __name__ == '__main__':
    main()

ラン

  • solver.NumVar 実変数
  • solver.IntVar Integer型の変数

線形および整数計画の比較

私は、整数計画ソリ​​ューションは、線形計画に近いかもしれないと思いますが、それはそうではありません。

あなたは、整数問題に対する解決策は、線形解に最も近い可能領域における整数点であろうと推測するかもしれない - つまり、ポイントのx = 0、yが2を=しかし、あなたは次の見るように、これはそうではありません。

などの制約を交換してください

    infinity = solver.infinity()
    x = solver.NumVar(0, infinity, 'x')
    y = solver.NumVar(0, infinity, 'y')

    print('Number of variables =', solver.NumVariables())

整数の最適化へのCPアプローチ

伝統的な最適化理論とは異なり、制約付き最適化(CP)は、それが制約と変数ではなく、目的関数が心配です。いくつかの問題が、CPは速くMIPソルバーよりも最適解を見つけることができます。

  • 標準整数計画問題実行可能な点に関しては、すべての制約を満たす必要があり、MIPは速く解きます。この場合には、実現可能なセットは凸状である:セット内の任意の2点のために、完全コレクションでそれらを結ぶ線分。

  • 非常に非凸問題は、実現可能なセットであるために、CP-SATソルバーは、MIPソルバーよりも一般的に高速です。実現可能なセット「又は」は制約が接続手段の複数によって定義されている場合にのみ制約することができる点を満たす必要があります。

例えば:非整数制約を変換します

計算を高速化するために、CP-SATは、整数上の元のCPソルバーの計算をソルバ

制約の一部が非整数条件を持っている問題を解決するには、最初に十分に大きな整数を乗じて、これらの制約を変換する必要があります。

例えば:

  • 目標:最大化(2X + 2Y + 3Z)
  • 制約:

\開始{整列} X + \ FRAC {7} {2}、Y +、\ FRAC {3} {2} Z \ leq25 \端\ {整列}開始{ALIGN} 3X - 5Y + 7Z \当量45 \端{整列} \ {整列開始\ X、Y、Z整数{整列}端\ {整列} {整列} X、Y、Zの\のGEQ 0 \端開始\ {整列} 6Z \当量37 \エンド - {整列} 5X + 2Yを開始}

おすすめ

転載: www.cnblogs.com/xrszff/p/10985749.html