OR-도구 출시 노트

이 페이지에는 새로운 기능, 버그 수정, 코드 및 설치 절차 개선사항을 비롯하여 OR-도구의 변경사항이 나와 있습니다.

OR-Tools를 설치하는 데 문제가 있으면 OR-Tools 설치 안내의 문제 해결 섹션을 참고하세요. 문제가 목록에 없는 경우 GitHub의 문제를 확인하거나 언제든지 새 문제를 제기해 주세요. 최선을 다해 도와드리겠습니다.

다음은 OR-도구의 출시 노트로, 최신 출시 버전부터입니다.

2024년 5월

OR-Tools v9.10 출시 발표

OR-Tools v9.10이 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 관련 섹션을 참조하세요.

GitHub에서 출시 노트를 확인할 수 있습니다.

2024년 3월

OR-Tools v9.9 출시 발표

OR-Tools v9.9가 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 관련 섹션을 참조하세요.

GitHub에서 출시 노트를 확인할 수 있습니다.

2023년 11월

OR-Tools v9.8 출시 발표

OR-Tools v9.8이 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 관련 섹션을 참조하세요.

플랫폼 변경사항

  • Python 3.12를 추가합니다.
  • Ubuntu 23.10 지원 추가

선형 솔버

  • ModelBuilder을 .Net으로 포팅합니다.
  • SAT LogCallback과의 충돌을 방지하기 위해 LogCallback의 이름을 MbLogCallback로 바꿉니다.
  • ModelBuilder API를 확장합니다.
    • 표시기 제약 조건을 추가합니다.
    • 힌팅 지원을 추가합니다.
    • 모델 클론을 추가합니다.

수학 최적화

  • 심층적인 재작업.

라우팅

  • ROUTING_OPTIMAL 상태를 추가합니다.
  • RoutingModel를 복사 또는 이동이 불가능하게 합니다.
  • 지역 검색 연산자의 일부 무한 루프를 수정합니다.
  • PickupDeliveryPosition 내부 구조체를 추가합니다.
  • IsPickup()IsDelivery() 메서드를 추가합니다.

  • 대규모 모델의 메모리 공간을 줄입니다.
  • 예약 검색이 개선되었습니다.
  • packing_previousnces_lns를 추가합니다.
  • 실행 가능성 점프를 최적화하고 수정합니다
  • 선형 presolve를 최적화하고 presolve 로깅을 개선해야 합니다.
  • int_abs, int_mod, int_prod, lin_max의 presolve를 개선합니다.
  • Panda 지원 개선
  • 버그가 거의 수정되었습니다.

GitHub 변경 로그

2023년 8월

OR-Tools v9.7 출시 발표

OR-Tools v9.7이 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 관련 섹션을 참조하세요.

플랫폼 변경사항

  • Centos-8 (EOL)을 드롭합니다.
  • Debian 10을 삭제합니다.
  • Fedora [33, 36] (EOL)를 드롭합니다.
  • Ubuntu 18.04 LTS (EOL)를 삭제합니다.
  • Python 3.7 (EOL)을 중단합니다.
  • CMake (EOL)에서 netcore3.1 지원을 사용 중지합니다.

모델 빌더 Python

  • Pandas DataFrame 및 계열을 사용하여 변수를 만들도록 허용합니다.
  • 정보 입력 완료

개인 정보 보호 표준 DLP

  • 확인할 수 있습니다

CP-SAT

  • 성능이 개선되었습니다. (실행 가능성_점프, lin_max)
  • 컷 관리 개선
  • 목표의 하한값을 개선하기 위한 새로운 goal_shave_search 작업자 (최소화 시)
  • Python cp_model.py의 주석 입력
  • cp_model.py의 Pandas를 실험용으로 부분적으로 지원합니다.
  • 지역 검색 위반 실험용 작업자:
    • 다음 매개변수로 사용 설정됨: num_violation_ls:xxx
    • 선형 모델에 최적화됨 (linear, bool_or, bool_and, at_most_one, exactly_one)
    • lin_max, product, Division과 함께
    • no_overlap, 누적, 회선, 경로 지원
    • no_overlap_2d로 사용 중지됨
    • 권장 ls 작업자 수: num_workers -> num_violation_ls: (8, 1), (16, 2) (24, 3), (32, 4)

GitHub 변경 로그

2023년 3월

OR-Tools v9.6 출시 발표

OR-Tools v9.6이 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 관련 섹션을 참조하세요.

플랫폼 변경사항

  • Fedora 37, 38 지원을 추가합니다.
  • Python 3.6을 삭제합니다 (protobuf에서 지원하지 않음).
  • macOS에 Python 3.7을 드롭합니다 (scipy에서 지원하지 않음).
  • CMake에 net7.0 지원 추가 (-DUSE_DOTNET_7=ON 사용)
  • nuget .org 패키지의 netcore3.1 삭제

종속 항목

  • SCIP v801 -> v803 (참고: 이제 SCIP는 OSI 호환 라이선스를 사용함)
  • 요약 20220623.1 -> 20230105.0
  • Protobuf v21.5 -> v21.12
  • 스위그 4.1.1
  • 자바 JNA 5.11.0 -> 5.12.1

Bazel

  • pybind11 지원을 추가합니다.
  • 자바 래퍼 지원을 추가합니다.

문제 해결사

  • PDLP: dd python 래퍼입니다.
  • CP-SAT: 성능이 개선되었습니다.
  • GLOP: presolve를 조정합니다.
  • ModelBuilder: Python: NumPy 지원을 개선합니다.
  • 경로: 성능 개선 (지역 검색)

알려진 문제:

  • CP-SAT: pseudo_costs 서브콜버를 무시하면 잘못된 매개변수가 반환됩니다(#3706 참고).

2022년 11월

OR-Tools v9.5 출시 발표

OR-Tools v9.5가 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 관련 섹션을 참조하세요.

플랫폼 변경사항

  • Debian SID 지원을 추가합니다.
  • Fedora 35, 36 지원을 추가합니다.
  • Ubuntu 22.10 지원을 추가합니다.
  • macOS에서 Python 3.6을 드롭합니다.
  • Python 3.11 지원을 추가합니다.

종속 항목 업데이트

  • Protobuf v19.4 -> v21.5
  • SCIP 문제 해결사 v800 -> v801

CP-SAT

  • Presolve 개선사항: max(배열), 부울 제약 조건, 선형 제약 조건
  • 인터리브 검색은 병렬로 확정적이어야 합니다.
  • 선형 절단: 정사각형 및 int_prod 컷을 정리하고 컷 파이프라인을 다시 작성합니다.
  • 지문 입력 모델 및 솔루션 (로그에 표시됨)
  • 일정 예약이 개선되었습니다.
  • 일반적인 버그 수정 (presolve 도중 비정상 종료, 컷에서 비정상 종료, 실행할 수 없는 솔루션, LNS에서 모델 실행 불가)

글로프

  • 피벗 선택 규칙뿐만 아니라 선형 대수도 다시 작성하여 속도를 높이세요.

선형 솔버

  • knapsack_interface.cc를 추가합니다.
  • model_builder API를 linear_solver 디렉터리 (헤더 및 샘플) 아래로 이동합니다.
  • Gurobi 10 지원을 추가합니다.

라우팅

  • 다양한 라우팅 문제를 해결하기 위해 몇 개의 파서를 해제합니다.

2022년 8월

OR-Tools v9.4 출시 발표

OR-Tools v9.4가 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 관련 섹션을 참조하세요.

플랫폼

  • Debian-10 지원을 추가합니다(#3029 참조).
  • Ubuntu 22.04 LTS 지원을 추가합니다(#3276 참고). 참고: .Net 3.1은 지원되지 않습니다 (dotnet/core#7038 참고).
  • Ubuntu 21.10 지원을 삭제합니다.

기타

  • 언어별로 보관 파일을 분할하고 C++ 구성에 CMake 구성을 추가합니다 (#3200).

그래프

ortools.graph.pywrapgraph를 다음으로 분할:

  • ortools.graph.python.linear_sum_assignment.
  • ortools.graph.python.max_flow.
  • ortools.graph.python.min_cost_flow.

이렇게 하면 NumPy를 사용하여 문제를 빠르게 설정할 수 있습니다.

CP-SAT

개선사항:

  • 스케줄링 (전파, 컷, 하한)입니다.
  • MaxSAT (presolve, core 기반 휴리스틱)
  • MIP 성능 (presolve, cuts)

2022년 3월

OR-Tools v9.3 출시 발표

OR-Tools v9.3이 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 관련 섹션을 참조하세요.

플랫폼 변경사항

  • Debian-10 지원을 중단합니다.
  • Ubuntu-16.04 지원을 중단합니다.
  • .NET Framework 4.5.2를 삭제합니다.

종속 항목 업데이트

  • Eigen 3.4.0를 추가합니다.
  • Google re2 2021-11-01를 추가합니다.
  • Protobuf 3.19.1 -> 3.19.4
  • SCIP 7.0.1 -> v800

Python

  • pybind11을 추가합니다.

기능

  • PDLP를 실험용으로 추가합니다.
  • MathOpt를 실험용으로 추가합니다.

CP-SAT

  • 일관성을 위해 일부 API의 이름을 바꿨습니다(예: LinearExpr.ScalProd. -> LinearExpr.WeightedSum.).
  • AddAtLeastOne/AddAtMostOne/AddExactlyOne 메서드를 추가합니다.
  • 모든 언어로 AddMultiplicationConstraint(z, x, y) 추가
  • 모든 언어로 AddMultipleCircuit() 추가

C++

  • 명시적 ctor IntVar(BoolVar).
  • LinearExpr::Add*를 삭제하고 연산자(예: LinearExpr +=)로 대체했습니다.
  • 선형 표현식에 산술 연산자를 추가합니다.
  • LinearExpr::BooleanSum/BooleanScalProd를 삭제했습니다. Sum/WeightedSum를 사용하세요.
  • 변수의 도메인을 단일 값으로 덮어쓰는 CpModelBuilder::FixVariable()를 추가합니다.

Java

  • LinearExpr를 다시 작성하고 증분 빌더 클래스 LinearExpr.newBuilder().add(x).addSum(<array of variables>).build()를 추가합니다.
  • C++ API 준수: 이제 Circuit, MultipleCircuit, Cumulative, Reservoir, AllowedAssignment, ForbiddenAssignment가 증분 API를 사용하는 특수 클래스를 반환하여 새 변수, 조건, 수요를 추가합니다.

C

  • 모든 메서드를 문서화합니다.
  • C++ API 준수: 이제 Circuit, MultipleCircuit, Cumulative, Reservoir, AllowedAssignment, ForbiddenAssignment가 증분 API를 사용하는 특수 클래스를 반환하여 새 변수, 조건, 수요를 추가합니다.
  • LinearExprBuilder 클래스를 추가하여 표현식을 점진적으로 빌드합니다.

빌드 시스템

CMake

  • CMake 3.18 이상이 필요합니다.

제조업체

  • 이제 내부적으로 CMake 기반 빌드를 사용합니다.

2021년 12월

OR-Tools v9.2 출시 발표

OR-Tools v9.2가 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 관련 섹션을 참조하세요.

플랫폼 변경사항

  • Ubuntu 21:10 (마지막 롤아웃 출시) 지원이 추가되었습니다.

종속 항목 업데이트

  • .Net TFM update net5.0 -> net6.0(.Net SDK 6.0 LTS 및 .Net SDK 3.1 LTS 필요)
  • abseil-cpp 20210324.2 -> 20211102.0
  • Protobuf 3.18.0 -> 3.19.1
  • Googletest 1.10.0 -> 1.11.0
  • Python: numpy >= 1.13.3을 추가합니다.
  • MacOS에서는 -O1에서 Coin-OR을 컴파일하여 실행기에서 비정상 종료를 방지합니다.

라우팅

  • 필터 개선
  • 첫 번째 솔루션 휴리스틱 개선
  • 휴식 시간 게재위치를 개선합니다.

CP-SAT

브레이킹 체인지

  • 기본 프로토콜 버퍼가 이전 버전과 호환되지 않습니다. 저장된 프로토콜 버퍼는 업데이트된 빌더 API (C++, Python, 자바, .NET에서)로 다시 생성해야 합니다.
  • 특히 이전 필드(start, size, end)를 삭제하고 삭제된 필드의 이름을 사용하도록 새 필드 (_view 사용)의 이름을 변경하면서 간격 protobuf가 정리되었습니다.

새로운 기능

  • all_different, reservoir, modulo, multiplication, division 제약조건은 정수 변수가 필요한 모든 곳에서 아핀 표현식 (a * var + b)을 허용합니다.
  • 목표는 부동 소수점 계수를 허용합니다. C++/Java/.NET의 DoubleLinearExpr 클래스를 참고하세요. Python의 knapsack_2d_sat.py 예를 참고하세요.
  • no_overlap_2d 제약 조건은 선택적 간격을 지원합니다.
  • C++ API는 +* 연산자를 구현하여 표현식을 작성합니다.

개선 사항

  • presolve 코드가 개선되었습니다.
  • 더욱 엄격한 모델 검사기.
  • 저장소 제약조건 재작업
  • no_overlap_2d 제약 조건에 에너지 넘치는 컷을 추가합니다.
  • 인코딩 제약 조건의 선형 완화가 개선되었습니다(literal implies var == value).

지원 중단되고 삭제된 메서드

  • C++ BooleanSumBooleanScalProd가 지원 중단되었습니다. SumScalProd만 사용하면 됩니다.
  • C++ AddLinMinEqualityAddLinMaxEquality가 삭제되었습니다. AddMinEqualityAddMaxEquality만 사용하면 됩니다.

향후 비호환성

  • 향후 언젠가는 C++ 레이어에 더 가깝게 자바 모델링 레이어를 다시 작성할 예정입니다.
  • C++ 모델링 레이어에서 IntVar(BoolVar var) ctor를 명시적으로 만듭니다.
  • python API PEP 8이 규정을 준수하도록 하는 방안을 고려하고 있습니다 (snake_case 이름 사용). 이 경우 코드를 포팅할 sed 파일이 제공됩니다.

빌드 시스템

Bazel

  • Windows 빌드를 수정합니다.

CMake

  • FETCH_PYTHON_DEPS 옵션을 추가합니다 (기본값 ON).
  • GPLK 솔버를 위한 선택적 지원을 추가합니다 (기본값 -DUSE_GLPK=OFF).

Python

  • 대부분의 CP-SAT API에서 numpy 정수를 지원합니다.
  • __version__ 누락을 수정합니다.

2021년 9월

OR-Tools v9.1 출시 발표

OR-Tools v9.1이 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 관련 섹션을 참조하세요.

플랫폼 변경사항

  • Python: manylinux2014 이미지를 사용합니다 (PEP 599 참고).
  • Python: manylinux2014_aarch64 이미지를 사용하여 aarch64 Linux 지원을 추가합니다.
  • .Net: .Net 5.0 지원을 추가합니다.

종속 항목 업데이트

  • abseil-cpp 20210324.1 -> 20210324.2
  • Protobuf 3.15.8 -> 3.18.0
  • SCIP 7.0.1 -> 마스터
  • Googletest 1.8.0 -> 1.10.0
  • python: cp_model.py에서 warning 사용 (#2530 참고).
  • python: absl-py 0.11 -> 0.13.

CMake

  • 범프 최소 버전 3.14에서 3.15가 필요합니다 (#2528 참고).
  • Python: 필요한 최소 버전 3.14에서 3.18을 범프합니다 (#2774 참고).

제조업체

Make 기반 빌드가 지원 중단되었습니다. 소스에서 빌드하려면 CMake 또는 Bazel로 이전하세요.

Java

  • 네이티브 라이브러리 로더의 견고성을 개선합니다 (#2742 참고).
  • 라우팅 모델 또는 제약 조건 솔버가 삭제될 때 JVM 가비지 컬렉터 비정상 종료 문제를 수정했습니다 (#2091 참고)(#2466 참고).
  • 여러 worker를 사용할 때 발생하는 CP-SAT 로깅 콜백 비정상 종료 문제를 수정했습니다. (#2775 참고)

CP-SAT

  • LNS 코드의 견고성을 개선합니다 (#2525 참고).
  • 일정 코드 개선: 고정된 크기 간격, 새로운 검색 휴리스틱, 개선된 presolve, 새로운 선형 컷을 만드는 새로운 팩토리 메서드.
  • 라우팅 코드 개선: 새로운 전용 LNS
  • 모델 검사기 개선 특히 잠재적 오버플로우에 대해 더 현명합니다.
  • MIP 코드 개선: presolve를 개선하고 MIP 및 CP 모델의 선형 완화를 여러 가지로 개선했습니다.
  • 검색 다양성을 개선합니다. 작업자가 13개 이상인 경우 목표 하한값을 개선하기 위한 작업자를 추가합니다.
  • 동시 로드 코드 변경: 이제 솔버가 이제 사용 가능한 모든 코어를 사용합니다. num_search_parameters를 사용하여 동시 로드 수준을 지정합니다.
  • SearchAllSolutionsSolveWithSolutionCallback가 지원 중단되었습니다.
  • Python API: model.Add() 호출 외부에서 var == ... 또는 var != ...를 사용할 때 좀 더 현명한 검사가 가능합니다.

2021년 4월

OR-Tools v9.0 출시 발표

OR-Tools v9.0이 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 관련 섹션을 참조하세요.

종속 항목 업데이트

  • Abseil-cpp 20200923.3이 20210324.1 LTS로 업데이트되었습니다.
  • Protobuf 3.15.3이 3.15.8로 업데이트되었습니다.
  • 자바: jna-platform 5.5.0이 5.8.0으로 업데이트됨

Java

버그 수정

  • CP-SAT 솔버를 사용할 때 멀티스레딩을 개선합니다 (#1588 참고).
  • std::vector&ltstd::string&gt의 Python 래퍼 지원을 수정합니다 (#2453 참고).
  • CPLEX 지원을 재작업합니다 (#2470 참고).

알려진 브레이킹 체인지

  • Python, Java, .Net에서 로거 액세스를 추가합니다 (#2245 참고).
  • 모든 맞춤 Google 유형을 cstdint에 제공된 유형으로 대체합니다.

CP-SAT

  • SearchForAllSolutions(), SearchAllSolutions(), SolveWithSolutionCallback() 메서드가 지원 중단되었습니다. 대신 Solve()를 사용하세요.
  • Python 표준 연산자 지원을 개선합니다. 이로 인해 잘못된 기존 코드가 손상될 수 있습니다.

2021년 3월

OR-Tools v8.2 출시 발표

OR-Tools v8.2가 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 관련 섹션을 참조하세요.

종속 항목 업데이트

  • Abseil-cpp 20200923.2가 20200923.3 LTS로 업데이트되었습니다.
  • Protobuf 3.14.0이 3.15.3으로 업데이트되었습니다.

라우팅

  • RoutingModel.RegisterTransitMatrix()RoutingModel.RegisterUnaryTransitVector()를 추가했습니다.
  • RoutingModel.AddVectorDimension()RoutingModel.AddMatrixDimension()의 반환을 int가 대중교통 평가자 ID인 std::pair&ltint, bool&gt로 변경합니다.

2020년 12월

OR-Tools v8.1의 출시 발표

OR-Tools v8.1이 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 관련 섹션을 참조하세요.

종속 항목 업데이트

  • Abseil-cpp 20200923이 20200923.2 LTS로 업데이트되었습니다.
  • Protobuf 3.13.0이 3.14로 업데이트되었습니다.
  • Gurobi 9.1.0 지원 추가
  • GLog 종속 항목 삭제 (abseil-cpp 플래그에 따라 맞춤 구현으로 대체됨)
  • GFlag 종속 항목 삭제 (abseil-cpp 플래그 구성요소로 대체됨)

버그 수정

  • Gurobi 플로팅 라이선스의 이중 계산을 수정합니다 (#2227 참고).
  • Windows 빌드를 수정합니다 (#2200 참고).

2020년 10월

OR-Tools v8.0 출시 발표

OR-Tools v8.0이 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 관련 섹션을 참조하세요.

플랫폼 변경사항

  • Python 3.9 지원이 추가되었습니다. (#2187)
  • Python 3.5 지원 중단 (#2186) <!-- Microsoft dotnet-sdk 지원을 기다리는 중입니다. 버전이 출시된 후 생성될 수 있습니다.
    • Ubuntu 20.10 지원이 추가되었습니다. (#2188) -->
  • Ubuntu 16.04 LTS 지원이 중단되었습니다. (#2188)
  • Ubuntu 19.10 지원이 중단되었습니다. (#2188)

종속 항목 업데이트

  • Abseil-cpp 20200225.2가 20200923 LTS로 업데이트되었습니다.
  • Protobuf 3.12.2가 3.13.0으로 업데이트되었습니다.

알려진 브레이킹 체인지

  • 이제 라우팅 및 CP-SAT 소스 코드는 일부 C++17 기능을 사용합니다. 경고: 자체 abseil-cpp 버전을 제공하는 경우 C++17에 관해서도 빌드되었는지 확인하세요.
  • MPSolver::CreateSolver 서명이 변경되었습니다. 모델 이름 인수가 삭제되었습니다.

CMake

  • -DUSE_SCIP=OFF 사용 시 SCIP 지원 사용 중지 문제를 수정합니다. (#2129 참고)
  • CMake 빌드 시스템에 샘플과 예를 통합합니다. 참고: -DBUILD_SAMPLES=OFF-DBUILD_EXAMPLES=OFF를 사용하여 사용 중지할 수 있습니다. 참고: -DBUILD_<LANG>_SAMPLES=OFF 또는 -DBUILD_<LANG>_EXAMPLES=OFF를 사용하여 특정 언어에 대해 사용 중지할 수 있습니다.
    • <LANG> 사용:
    • CXX,
    • PYTHON,
    • JAVA~
    • DOTNET.

제조업체

  • Make >= 4.3가 필요합니다 (Make eval 함수 사용).
  • CMake >= 3.14가 필요합니다 (CMake --verbose 옵션 사용).
  • -DUSE_SCIP=OFF를 사용하여 SCIP 지원을 사용 중지하는 옵션을 추가합니다 (#2134 참고).
  • -DUSE_COINOR=OFF를 사용하여 CLP 및 CBC 지원을 사용 중지하는 옵션을 추가합니다.

Java

  • OR-Tools가 Maven 패키지를 생성합니다 (#202 참고).

버그 수정

  • FreeBSD에서 C++ 및 Python 빌드를 수정합니다 (#2126 참고).
  • Windows의 디버그에서 빌드를 수정합니다 (#2077 참고).
  • Windows의 CP-SAT에서 동시에 발생하는 장기 비정상 종료를 수정합니다 (#2001, #2019 참고).

2020년 7월

OR-Tools v7.8 출시 발표

OR-Tools v7.8이 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 관련 섹션을 참조하세요.

종속 항목 업데이트

  • Gurobi 9.0.2는 이제 사전 빌드된 바이너리에 사전 통합됩니다. MAC OS X 및 Windows에서 Gurobi 설치 프로그램의 기본 설치 경로 또는 GUROBI_HOME 디렉터리에서 gurobi 90 공유 라이브러리를 검색합니다.
  • SCIP 7.0.1은 이제 사전 빌드된 바이너리에 통합됩니다. SCIP 라이선스를 사용하기 전에 규정을 준수하는지 확인하세요.
  • 선택적 Xpress Solver 8.9.0에 대한 지원이 추가되었습니다.

선형 솔버

  • 통합 선형 솔버 백엔드 지원 확인을 간소화하는 정적 LinearSolver::CreateSolver() 메서드가 추가되었습니다. 모든 언어로 이용할 수 있습니다.

버그 수정

  • FreeBSD에서 CMake 기반 빌드를 수정했습니다.
  • 누적 컷 생성에서 CP-SAT 정렬을 수정했습니다.
  • .Net 래퍼의 선형 솔버 메모리 누수를 수정했습니다.

2020년 6월

OR-Tools v7.7의 출시 발표

OR-Tools v7.7이 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 관련 섹션을 참조하세요.

종속 항목 업데이트

  • Abseil-cpp b832dce가 c51510d (LTS 20200225.2)로 업데이트되었습니다.
  • Protobuf 3.11.4가 3.12.2로 업데이트되었습니다.

새로운 기능 및 개선사항

  • CP-SAT 솔버가 이제 만족도 모델에서 즉, 목표 없이 Feasible 대신 Optimal를 반환합니다.
  • MIP 커뮤니티의 타당성 펌프 휴리스틱을 추가했습니다.

버그 수정

CP-SAT 다중 스레딩 비정상 종료 문제가 해결되었습니다 (#2005 참고).

2020년 4월

OR-Tools v7.6 출시 발표

OR-Tools v7.6이 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 관련 섹션을 참조하세요.

CP-SAT의 새로운 기능

CP-SAT 문제 해결사에 다음과 같은 새로운 기능이 추가되었습니다.

  • LP의 절단기 관리 개선
  • 디버깅 도구

종속 항목 업데이트

Abseil-cpp 8ba96a8이 b832dce (LTS 20200225)로 업데이트되었습니다.

버그 수정

  • presolve의 CP-SAT UNSAT 버그가 수정되었습니다 (#1908 참고).
  • swigwin.exe url이 수정되었습니다.
  • 자바 및 .Net용 SWIG 타입맵 관리가 수정되었습니다.

2020년 1월

OR-Tools v7.5 출시 발표

OR-Tools v7.5가 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 관련 섹션을 참조하세요.

플랫폼 변경사항

  • Python 3.8 지원이 추가되었습니다. (#1719)
  • Visual Studio 2017의 소스에서 지원 컴파일을 중단했습니다. (#1852)
  • Centos 7에서 Centos 8로 지원을 업데이트했습니다. (#1827)

종속 항목 업데이트

  • protobuf v3.10.0이 v3.11.2로 업데이트되었습니다. (#1829)

버그 수정

OR-Tools v7.5에서 다음 문제가 수정되었습니다 (전체 목록은 Milestone v7.5 참고).

구체적인 방법은 다음과 같습니다.

  • 어셈블리 로드를 수정했습니다. #1421을 참고하세요.
  • RouteIndexManager의 GetStartIndex()GetEndIndex() 메서드가 노출되었습니다. (#1843)
  • SWIG가 손상된 메서드를 삭제하도록 수정되었습니다. (#1838, #1276)

2019년 10월

OR-Tools v7.4 출시 발표

OR-Tools v7.4가 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 관련 섹션을 참조하세요.

새로운 기능 및 개선사항

  • CP-SAT 솔버가 이제 적용 리터럴을 지원하지 않는 제약 조건을 확인합니다. 이러한 제약조건에 시행 리터럴이 있는 경우 모델 검사기는 해결 전에 오류를 반환합니다.
  • 라우팅 라이브러리를 위한 더 빠르고 향상된 지역 검색
  • 이제 선형 솔버에서 서드 파티 소프트웨어 Xpress-MP를 지원합니다. 이를 사용하려면 소스에서 OR 도구를 다시 빌드해야 합니다.
  • NuGet 패키지의 아키텍처가 완전히 재작성되었습니다. 특히, 이제 Windows 플랫폼에서 4 .5.2 이상의.NET 프레임워크를 지원합니다.

지원 중단된 플랫폼

2019년 7월 출시 노트에 공지된 바와 같이 OR-Tools는 더 이상 Python 2.7을 지원하지 않습니다.

종속 항목 업데이트

Protobuf 3.9.0이 3.10.0으로 업데이트되었습니다.

2019년 8월

OR-Tools v7.3의 출시 발표

OR-Tools v7.3이 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 관련 섹션을 참조하세요.

지원 중단된 플랫폼

Google에서 Python 3로 이전함에 따라 Python 2.7에 대한 지원이 중단됩니다. 이는 Python 2.7을 지원하는 OR-Tools의 마지막 출시입니다.

종속 항목 업데이트

Protobuf 3.8.0이 3.9.0으로 업데이트되었습니다.

버그 수정

다음 문제가 OR-Tools v7.3에서 수정되었습니다. 전체 목록은 Kanban v7.3을 참고하세요.

구체적인 방법은 다음과 같습니다.

  • Java에서 init/int64 전송 문제가 해결되었습니다. (#1448)
  • 빈 누적 제약 조건을 처리할 때 presolve 검사가 수정되었습니다.

2019년 7월

OR-Tools v7.2 출시 발표

OR-Tools v7.2가 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 관련 섹션을 참조하세요.

플랫폼 변경사항

  • Google에서 Python 3로 이전함에 따라 Python 2.7에 대한 지원이 중단됩니다. Python 2.7을 지원하는 OR-Tools는 최대 1개의 버전만 추가로 출시될 예정입니다.
  • Ubuntu 18.10이 Ubuntu 19.04로 업데이트되었습니다.
  • Visual Studio 2019에서 소스에서 컴파일하는 기능이 지원됩니다.
  • Windows에서는 Python 3.5가 더 이상 지원되지 않습니다. Python 3.6 이상을 사용하세요.

종속 항목 업데이트

  • 이제 CBC 2.10.3을 타겟팅합니다.
  • 이제 Protobuf 3.8.0을 타겟팅합니다.

CP-SAT

  • 검색, 동시 로드, 선형 완화를 여러 가지로 개선했습니다.
  • Python에 LinearExpr.Sum()LinearExpr.ScalProd() API가 추가되었습니다.
  • C#에서 IntVar[].Sum()IntVar[].ScalProd() API가 지원 중단되었습니다.
  • C++: SolveCpModel()의 중복이므로 SolveWithModel()를 삭제했습니다.
  • Java API에 CpModel.addGreaterThan()CpModel.addLessThan() 메서드가 추가되었습니다.

선형 문제 해결사

  • Python, Java, C#용 MPSolver.SetHint()가 추가되었습니다(SCIP 및 Gurobi에서 지원됨).
  • Python, Java, C#용 MPSolver.SetNumThreads()가 추가되었습니다(CBC, Gurobi, SCIP에서 지원됨).
  • SCIP 6.0.1에 대한 지원이 다시 작성되었습니다.

참조 문서

  • 모든 언어와 도구 (알고리즘, 라우팅, 그래프, linear_solver 및 CP-SAT)에 관한 doxygen 및 pdoc3 기반 참조 매뉴얼을 추가했습니다. OR-Tools 참조 설명서를 확인하세요.
  • C++ (모든 제품) 및 CP-SAT (C++, Python, Java)에 대한 참조 문서가 완전합니다.
  • 모든 C++ 문서를 Python 및 Java로 내보내는 중입니다.
  • .NET 문서는 부족하며 가까운 미래에 이를 개선할 솔루션이 없습니다. 사용 가능한 API가 계속 표시되므로 이 목록을 보관해 두었습니다.

2019년 5월

OR-Tools v7.1의 출시 발표

OR-Tools v7.1이 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 관련 섹션을 참조하세요.

필수 종속 항목 변경사항

OR-Tools v7.1에는 다음과 같은 새로운 종속 항목과 업데이트된 종속 항목이 있습니다.

  • glog v0.3.5가 v0.4.0으로 업데이트됨
  • protobuf v3.6.1이 v3.7.1로 업데이트됨
  • Cbc 2.9.9가 2.10.1로 업데이트됨
  • Cgl 0.59.10이 0.60.1로 업데이트되었습니다.
  • Clp 1.16.11이 1.77.1로 업데이트됨
  • Osi 0.107.9가 0.108.1로 업데이트되었습니다.
  • CoinUtils 2.10.14가 2.11.1로 업데이트되었습니다.

CP-SAT API 변경사항

다음 섹션에서는 OR-Tools 7.1에서 CP-SAT API의 변경사항을 설명합니다.

도메인을 사용하여 변수 만들기

다음 예는 비연속 도메인을 사용하여 정수 변수를 만드는 방법을 보여줍니다. 이렇게 하면 삭제된 메서드 NewEnumeratedIntVar()가 대체됩니다. 여기서 변수 x는 1, 3, 4 또는 6 중 하나일 수 있습니다.

Python

model.NewIntVarFromDomain(cp_model.Domain.FromValues([1, 3, 4, 6]), 'x')

C++

model.NewIntVar(Domain::FromValues({1, 3, 4, 6}));

Java

model.newIntVarFromDomain(Domain.fromValues(new long[] {1, 3, 4, 6}), "x");

C#

model.NewIntVarFromDomain(Domain.FromValues(new long[] {1, 3, 4, 6}), "x");

간격 목록을 사용하여 변수를 만들 수도 있습니다. 아래에서 변수 x는 1, 2, 4, 5 또는 6으로 제한됩니다.

Python

model.NewIntVarFromDomain(cp_model.Domain.FromIntervals([[1, 2], [4, 6]]), 'x')

C++

model.NewIntVar(Domain::FromIntervals({ {1, 2}, {4, 6} }));

Java

model.newIntVarFromDomain(Domain.fromIntervals(new long[][] { {1, 2}, {4, 6} }), "x");

C#

model.NewIntVarFromDomain(Domain.FromIntervals(new long[][] { new long[] {1, 2}, new long[] {4, 6} }), "x");

선형 표현식에서 도메인 사용

다음 예는 비연속 도메인에서 선형 표현식을 제한하는 방법을 보여줍니다. 여기서 선형 표현식 linear_expr은 5, 6, 8, 9, 10에 대해 정의됩니다.

Python

model.AddLinearExpressionInDomain(linear_expr, cp_model.Domain.FromIntervals([(5, 6), (8, 10)]))

C++

model.AddLinearConstraint(linear_expr, Domain::FromIntervals({ {5, 6}, {8, 10} }))

Java

model.addLinearExpressionInDomain(linear_expr, Domain.fromIntervals(new long[][] { {5, 6}, {8, 10} }))

.NET

model.AddLinearExpressionInDomain(linear_expr, Domain.FromIntervals(new long[][] {new long[] {5, 6}, new long[] {8, 10} }));

선형 표현식 도우미 사용

다음 예시는 도우미 메서드를 사용하여 합계와 스칼라 곱을 만드는 방법을 보여줍니다. 다음은 x + y == 204 * x + 2 * y = 56가 필요한 예입니다.:\

Python

model.Add(x + y == 20)
model.Add(4 * x + 2 * y == 56)

C++

cp_model.AddEquality(LinearExpr::Sum({x, y}), 20);
cp_model.AddEquality(LinearExpr::ScalProd({x, y}, {4, 2}), 56);

Java

model.addEquality(LinearExpr.sum(new IntVar[] {x, y}), 20);
model.addEquality(LinearExpr.scalProd(new IntVar[] {x, y}, new long[] {4, 2}), 56);

.NET

model.Add(x + y == 20);
model.Add(4 * x + 2 * y == 56);

2019년 3월

OR-Tools v7.0 출시 발표

OR-Tools v7.0이 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 관련 섹션을 참조하세요.

지원되는 플랫폼 변경사항

OR-Tools v7.0은 더 이상 다음 플랫폼을 지원하지 않습니다.

  • Visual C++ 2015
  • Ubuntu 14.04
  • Linux의 Python 3.4

이러한 플랫폼 중 하나를 사용하는 경우에도 OR-Tools v6.10을 설치할 수 있습니다.

필수 종속 항목 변경사항

OR-Tools v7.0에는 다음과 같은 새로운 종속 항목과 업데이트된 종속 항목이 있습니다.

다음 섹션에서는 OR-Tools 7.0의 새로운 기능과 개선사항을 설명합니다.

라우팅 프로그램을 위한 새로운 색인 관리자

OR-Tools v7.0에서 차량 경로 지정 프로그램은 새 RoutingIndexManager를 사용해야 합니다. 이렇게 하면 위치의 표준 색인이 솔버에서 사용하는 내부 색인과 일치하고 코드의 오류를 방지하는 데 도움이 됩니다.

RoutingIndexManager에서는 라우팅 프로그램을 약간 변경해야 하며 다음 섹션에서 설명합니다.

RoutingIndexManager 포함/가져오기

OR-Tools 7.0에서 C++ 및 Java의 라우팅 프로그램은 아래 예와 같이 RoutingIndexManager를 포함하거나 가져와야 합니다.

C++

#include "ortools/constraint_solver/routing_index_manager.h"

Java

import com.google.ortools.constraintsolver.RoutingIndexManager;

Python 및 C# 가져오기는 변경되지 않았습니다.

RoutingIndexManager 선언

OR-Tools v7.0에서 라우팅 프로그램은 다음 예와 같이 RoutingIndexManager를 선언하고 라우팅 모델을 만들어야 합니다.

Python

manager = pywrapcp.RoutingIndexManager(num_locations, num_vehicles, depot)
routing = pywrapcp.RoutingModel(manager)

C++

RoutingIndexManager manager(num_locations, num_vehicles, depot);
RoutingModel routing(manager);

Java

RoutingIndexManager manager = new RoutingIndexManager(numLocations, numVehicles, depot);
RoutingModel routing = new RoutingModel(manager);

.NET

RoutingIndexManager manager = new RoutingIndexManager(numLocations, numVehicles, depot);
RoutingModel routing = new RoutingModel(manager);

RoutingIndexManager의 인수는 다음과 같습니다.

  • 위치 수
  • 차량 수
  • 차고지 색인 (모든 차량의 출발 및 도착 위치)

콜백

OR-Tools v7.0에서는 RoutingIndexManager를 사용하여 거리 콜백과 같은 콜백을 만들고 이 콜백을 솔버에 전달해야 합니다. 다음 예는 거리 콜백을 만드는 방법을 보여줍니다.

Python

    def distance_callback(from_index, to_index):
        """Returns the distance between the two nodes."""
        # Convert from routing variable Index to distance matrix NodeIndex.
        from_node = manager.IndexToNode(from_index)
        to_node = manager.IndexToNode(to_index)
        return data["distance_matrix"][from_node][to_node]

    transit_callback_index = routing.RegisterTransitCallback(distance_callback)
    routing.SetArcCostEvaluatorOfAllVehicles(transit_callback_index)

C++

  const int transit_callback_index = routing.RegisterTransitCallback(
      [&data, &manager](const int64_t from_index,
                        const int64_t to_index) -> int64_t {
        // Convert from routing variable Index to distance matrix NodeIndex.
        const int from_node = manager.IndexToNode(from_index).value();
        const int to_node = manager.IndexToNode(to_index).value();
        return data.distance_matrix[from_node][to_node];
      });
  routing.SetArcCostEvaluatorOfAllVehicles(transit_callback_index);

Java

    final int transitCallbackIndex =
        routing.registerTransitCallback((long fromIndex, long toIndex) -> {
          // Convert from routing variable Index to user NodeIndex.
          int fromNode = manager.indexToNode(fromIndex);
          int toNode = manager.indexToNode(toIndex);
          return data.distanceMatrix[fromNode][toNode];
        });
    routing.setArcCostEvaluatorOfAllVehicles(transitCallbackIndex);

.NET

        int transitCallbackIndex = routing.RegisterTransitCallback((long fromIndex, long toIndex) =>
                                                                   {
                                                                       // Convert from routing variable Index to
                                                                       // distance matrix NodeIndex.
                                                                       var fromNode = manager.IndexToNode(fromIndex);
                                                                       var toNode = manager.IndexToNode(toIndex);
                                                                       return data.DistanceMatrix[fromNode, toNode];
                                                                   });
        routing.SetArcCostEvaluatorOfAllVehicles(transitCallbackIndex);

IndexToNode 메서드는 솔버가 사용하는 내부 위치 색인을 거리 행렬의 표준 색인으로 변환합니다.

이전 버전과 같이 콜백을 해결자에 직접 전달하는 대신 v7.0에서는 먼저 콜백 참조인 transit&nbsp;callback&nbsp;index를 만들고 이를 문제 해결사에 전달합니다 (여기서는 SetArcCostEvaluatorOfAllVehicles).

크기

다음 예는 용량 차량 라우팅 문제를 해결하는 데 사용되는 수요 및 용량의 측정기준을 만드는 방법을 보여줍니다.

Python

    def demand_callback(from_index):
        """Returns the demand of the node."""
        # Convert from routing variable Index to demands NodeIndex.
        from_node = manager.IndexToNode(from_index)
        return data["demands"][from_node]

    demand_callback_index = routing.RegisterUnaryTransitCallback(demand_callback)
    routing.AddDimensionWithVehicleCapacity(
        demand_callback_index,
        0,  # null capacity slack
        data["vehicle_capacities"],  # vehicle maximum capacities
        True,  # start cumul to zero
        "Capacity",
    )

C++

  const int demand_callback_index = routing.RegisterUnaryTransitCallback(
      [&data, &manager](const int64_t from_index) -> int64_t {
        // Convert from routing variable Index to demand NodeIndex.
        const int from_node = manager.IndexToNode(from_index).value();
        return data.demands[from_node];
      });
  routing.AddDimensionWithVehicleCapacity(
      demand_callback_index,    // transit callback index
      int64_t{0},               // null capacity slack
      data.vehicle_capacities,  // vehicle maximum capacities
      true,                     // start cumul to zero
      "Capacity");

Java

    final int demandCallbackIndex = routing.registerUnaryTransitCallback((long fromIndex) -> {
      // Convert from routing variable Index to user NodeIndex.
      int fromNode = manager.indexToNode(fromIndex);
      return data.demands[fromNode];
    });
    routing.addDimensionWithVehicleCapacity(demandCallbackIndex, 0, // null capacity slack
        data.vehicleCapacities, // vehicle maximum capacities
        true, // start cumul to zero
        "Capacity");

.NET

        int demandCallbackIndex = routing.RegisterUnaryTransitCallback((long fromIndex) =>
                                                                       {
                                                                           // Convert from routing variable Index to
                                                                           // demand NodeIndex.
                                                                           var fromNode =
                                                                               manager.IndexToNode(fromIndex);
                                                                           return data.Demands[fromNode];
                                                                       });
        routing.AddDimensionWithVehicleCapacity(demandCallbackIndex, 0, // null capacity slack
                                                data.VehicleCapacities, // vehicle maximum capacities
                                                true,                   // start cumul to zero
                                                "Capacity");

인쇄 솔루션

OR-Tools v7.0에서는 RoutingIndexManager를 사용하여 솔루션에 차량 경로를 표시해야 합니다. 다음 예는 지원되는 모든 언어로 솔루션을 출력하는 방법을 보여줍니다.

Python

def print_solution(manager, routing, solution):
    """Prints solution on console."""
    print(f"Objective: {solution.ObjectiveValue()}")
    index = routing.Start(0)
    plan_output = "Route for vehicle 0:\n"
    route_distance = 0
    while not routing.IsEnd(index):
        plan_output += f" {manager.IndexToNode(index)} ->"
        previous_index = index
        index = solution.Value(routing.NextVar(index))
        route_distance += routing.GetArcCostForVehicle(previous_index, index, 0)
    plan_output += f" {manager.IndexToNode(index)}\n"
    plan_output += f"Distance of the route: {route_distance}m\n"
    print(plan_output)

C++

//! @brief Print the solution
//! @param[in] manager Index manager used.
//! @param[in] routing Routing solver used.
//! @param[in] solution Solution found by the solver.
void PrintSolution(const RoutingIndexManager& manager,
                   const RoutingModel& routing, const Assignment& solution) {
  LOG(INFO) << "Objective: " << solution.ObjectiveValue();
  // Inspect solution.
  int64_t index = routing.Start(0);
  LOG(INFO) << "Route for Vehicle 0:";
  int64_t distance{0};
  std::stringstream route;
  while (!routing.IsEnd(index)) {
    route << manager.IndexToNode(index).value() << " -> ";
    const int64_t previous_index = index;
    index = solution.Value(routing.NextVar(index));
    distance += routing.GetArcCostForVehicle(previous_index, index, int64_t{0});
  }
  LOG(INFO) << route.str() << manager.IndexToNode(index).value();
  LOG(INFO) << "Distance of the route: " << distance << "m";
  LOG(INFO) << "";
  LOG(INFO) << "Advanced usage:";
  LOG(INFO) << "Problem solved in " << routing.solver()->wall_time() << "ms";
}

Java

  /// @brief Print the solution.
  static void printSolution(
      DataModel data, RoutingModel routing, RoutingIndexManager manager, Assignment solution) {
    // Solution cost.
    logger.info("Objective : " + solution.objectiveValue());
    // Inspect solution.
    logger.info("Route for Vehicle 0:");
    long routeDistance = 0;
    String route = "";
    long index = routing.start(0);
    while (!routing.isEnd(index)) {
      route += manager.indexToNode(index) + " -> ";
      long previousIndex = index;
      index = solution.value(routing.nextVar(index));
      routeDistance += routing.getArcCostForVehicle(previousIndex, index, 0);
    }
    route += manager.indexToNode(routing.end(0));
    logger.info(route);
    logger.info("Distance of the route: " + routeDistance + "m");
  }

.NET

    /// <summary>
    ///   Print the solution.
    /// </summary>
    static void PrintSolution(in RoutingModel routing, in RoutingIndexManager manager, in Assignment solution)
    {
        Console.WriteLine("Objective: {0}", solution.ObjectiveValue());
        // Inspect solution.
        Console.WriteLine("Route for Vehicle 0:");
        long routeDistance = 0;
        var index = routing.Start(0);
        while (routing.IsEnd(index) == false)
        {
            Console.Write("{0} -> ", manager.IndexToNode((int)index));
            var previousIndex = index;
            index = solution.Value(routing.NextVar(index));
            routeDistance += routing.GetArcCostForVehicle(previousIndex, index, 0);
        }
        Console.WriteLine("{0}", manager.IndexToNode((int)index));
        Console.WriteLine("Distance of the route: {0}m", routeDistance);
    }

수령 및 배달이 포함된 VRP 지원

OR-Tools v7.0은 다양한 위치에서 물품을 픽업하고 배달하는 일련의 차량이 최적의 경로를 찾는 것이 목표인 픽업 및 배달과 함께 차량 경로 문제 (VRP)를 해결할 수 있도록 지원합니다. 표준 VRP와 비슷하게 문제를 설정하지만, 그 외에도 각 항목에 대해 한 쌍의 (i, j) 위치를 지정합니다. 여기서 i는 승차 위치가고 j는 하차 위치입니다. 라우팅 솔버는 각 쌍의 (i, j), i, j가 같은 경로에 있고 차량이 j 전에 i를 방문하는 차량 경로를 반환합니다.

이러한 유형의 문제를 해결하는 예시는 수령 및 배송을 사용한 차량 라우팅을 참고하세요.

람다 함수 지원

OR-Tools v7.0에는 이제 C# 및 Java (이미 지원되는 C++ 및 Python 외에도)의 람다 함수 지원이 포함됩니다. 람다 함수는 라우팅 프로그램에서 콜백을 정의하는 편리한 방법을 제공합니다. 그러나 코드를 더 쉽게 읽을 수 있다고 생각되면 표준 함수를 사용하여 콜백을 정의할 수 있습니다.

위의 C# 및 자바 콜백 예는 람다 함수를 사용하여 콜백을 정의하는 방법을 보여줍니다.

2018년 11월

버전 v6.10 출시 발표

OR-Tools 버전 6.10이 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 해당 섹션을 참조하세요.

다음 섹션에서는 버전 6.10의 새로운 기능과 개선사항을 설명합니다.

프로그램 빌드 및 실행을 위한 간소화된 명령어

버전 6.10에서는

make run SOURCE=relative/path/to/program.cc
와 같은 명령어를 입력하여 프로그램을 빌드하고 실행할 수 있습니다. 여기서 <var>relative/path/to</var>는 프로그램이 포함된 디렉터리의 경로입니다.

프로그램을 실행하지 않고 빌드하려면 다음을 입력하세요.

make build SOURCE=relative/path/to/program.cc
언어별로 프로그램을 실행하는 방법에 관한 구체적인 안내는 OR 도구 시작하기를 참고하세요.

SCIP 6.0.0 지원

OR-Tools에서 이제 SCIP 6.0.0을 지원합니다.

바이너리

바이너리 배포판은 Java JDK 8 (Ubuntu 14.04의 JDK 7)을 사용하여 빌드되었습니다.

CP-SAT 문제 해결사

API 업데이트

  • C++ CP-SAT CpModelBuilder API를 추가합니다.

일부 예시가 이동되었습니다.

  • 커뮤니티 예시를 examples/contrib(으)로 이동합니다.
  • 일부 예시를 ortools/<var>component</var>/samples로 이동합니다 (예: ortools/linear_solver/samples/simple_program.java).

2018년 9월

버전 v6.9 출시 발표

OR-Tools 버전 6.9가 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 해당 섹션을 참조하세요.

종속 항목 업데이트됨

  • Protobuf 3.5.1 -> 3.6.1
  • SCIP 4.0 -> 6.0

CP-SAT 문제 해결사

  • API의 브레이킹 체인지 - 자세한 내용은 여기를 참조하세요.
  • Python에서 SolveWithSolutionObserver의 이름을 SolveWithSolutionCallback로 바꿉니다.
  • Python의 CpSolverSolutionCallback 클래스에서 NewSolution의 이름을 OnSolutionCallback로 바꿉니다. 다음 예는 Python에서 솔루션 콜백을 만드는 새로운 방법을 보여줍니다.

    class MySolutionCallback(cp_model.CpSolverSolutionCallback):
    def init(self):
    cpmodel.CpSolverSolutionCallback.init(self)
    self._solution_count = 0

    def OnSolutionCallback(self): print('Solution {}, time = {}s, objective = {}, makespan = {}'.format( self.solution_count, self.WallTime(), self.ObjectiveValue(), self.Value(makespan))) self.solution_count += 1

  • Python, Java, C#의 솔루션 콜백에 StopSearch를 노출합니다. 문서는 여기를 참조하세요.

  • Python, Java, C#에서 ModelStatsCpSolverResponseStats를 노출합니다.

  • Python docstring 문서를 개선했습니다. 문서는 여기를 참조하세요.

  • 문제 해결사 인터페이스 및 설명서의 Java 구현 업데이트

  • 모듈로를 구현합니다.

  • 저장소 구현 변경: 선택적 드레이닝/채우기 이벤트를 지정하기 위해 불리언과 함께 API를 추가합니다.

선형 솔버

  • Java 및 C#에서 InterruptSolve를 노출합니다.

CP 문제 해결사

  • C#에서 SolutionCollector 디렉터를 노출합니다.

Python

  • Python 3.7 지원을 추가합니다.
  • 소스에서 컴파일하는 경우 Python을 감지할 때는 python2보다 python3를 사용하세요.

.NET

  • .NET 레이어가 완전히 다시 작성됩니다.
  • 런타임 식별기 win-x64, linux-x64, osx-x64와 호환되는 Google.OrTools NetStandard 2.0 Nuget 패키지를 제공합니다.
  • Google.OrTools.FSharp Nuget 패키지를 제공합니다.
  • 모든 .NET 예시의 프로젝트 파일을 추가합니다.
  • 모든 F# 스크립트 예시 (.fsx)를 일반 F# 프로젝트 (.fs)로 업데이트합니다.
  • 여기에서 .NET 패키지 빌드 생성에 관한 문서를 추가하세요.

플랫아연

  • flatzinc에서 세트 지원을 추가합니다 (nosets.mzn 사용).

참여

  • 바인더 지원을 추가합니다. 케빈 매더님께 감사드립니다.
  • DecisionVisitor를 자바 바인딩의 디렉터 유형으로 만듭니다. Jeremy Apthorp님, 감사합니다.

2018년 7월

버전 v6.8 출시 발표

OR-Tools 버전 6.8이 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 해당 섹션을 참조하세요.

CP-SAT 문제 해결사 발표

CP-SAT 솔버는 제약 조건 프로그래밍을 위한 새로운 솔버입니다. CP-SAT 솔버는 원래 CP 솔버보다 빠르므로 CP 문제에 선호됩니다.

CP-SAT 솔버를 사용하는 예는 GitHub의 examples 디렉터리에서 이름에 _sat가 포함된 파일을 찾습니다.

원래 CP 솔버는 기존 코드를 지원하기 위해 일정 기간 계속 유지되지만 지원 중단되었습니다.

CP-SAT 문제 해결사를 위한 새로운 옵션

이번 버전에는 다음 CP-SAT 문제 해결사 옵션이 추가되었습니다.

  • 지역 주변 검색 (LNS): SatParameters.use_lns 옵션을 사용하여 LNS를 사용 설정합니다.
  • 병렬 검색: 검색 중에 여러 스레드를 사용 설정하려면 SatParameters.num_search_workers 옵션을 사용합니다. 각 스레드는 서로 다른 매개변수와 서로 다른 임의의 시드를 가질 수 있습니다. 이렇게 하면 다양성, 그리고 하나 이상의 스레드가 솔루션을 찾을 가능성이 극대화됩니다.

문제 해결사의 성능 개선

CP-SAT 및 Glop 솔버의 성능을 개선했습니다.

2018년 3월

버전 v6.7 출시 발표

OR-Tools 버전 6.7이 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 해당 섹션을 참조하세요.

필수 종속 항목으로 업데이트

  • Protobuf 3.5.0 -> 3.5.1

기타

  • 베이스를 리팩터링하여 abseil-cpp 통합을 준비합니다.
  • Travis CI 및 Appveyor 지속적 통합 (CI) 서비스 사용

  • 성능 개선.
  • Python API가 개선되었습니다.
  • C# API(CpSolver.cs)를 추가합니다(실험용).

글롭

  • 코드 리팩터링
  • 성능 개선.

CMake 지원 (실험용)

  • C++ OR-Tools CMake 지원을 추가합니다.
  • OR-Tools를 독립형 CMake 프로젝트로 빌드할 수 있어야 합니다.
  • 기존 CMake 프로젝트에 OR-도구를 통합할 수 있어야 합니다.
  • Python OR-Tools CMake 기반 빌드를 추가합니다.
  • CMake를 사용하여 Python 패키지 (휠)를 생성합니다.

참여

  • 창에서 winsock2.h 재정의를 수정합니다. 플로렌트 톨린 드 리바롤님께 감사드립니다.
  • F# 지원을 추가합니다 (실험용). 매튜 무어님께 감사드립니다. 참고: Makefile 빌더에서만 사용할 수 있습니다.
  • .NET 스탠더드 지원 (실험용)을 추가합니다. Ziad El Malki님께 감사드립니다. 참고: Makefile 빌더에서만 사용할 수 있습니다.

2017년 11월

버전 v6.6 출시 발표

OR-Tools 버전 6.6이 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 해당 섹션을 참조하세요.

필수 종속 항목 업데이트

  • Protobuf를 3.3.0에서 3.5.0으로
  • gflags를 2.2.0 -> 2.2.1로 변경했습니다.
  • CBC 2.9.8 -> 2.9.9
  • Python의 필수 종속 항목으로 Python 모듈 6 (1.10)을 추가합니다.

버그 수정

  • pull 요청 #494 이름 리팩터링 일부 편집기에서 IntelliSense에 관한 의견이 추가되었습니다. 매튜 무어님께 감사드립니다.
  • pull 요청 #516 F# 독립 실행형 바이너리 명령어. 매튜 무어님께 감사드립니다.
  • Glop의 정확도를 개선합니다.

SAT 문제 해결사

  • 내부 SAT 문제 해결사 개선, 다양한 버그 수정
  • LP 솔버에 연결된 SAT 솔버에 VRP 제약조건을 추가합니다.
  • SAT 솔버에서 솔루션 관찰자를 변경하여 CpSolverResponse를 매개변수로 사용합니다.
  • SAT Solver에서 Glop 사용을 개선합니다.
  • SAT-LP 연결 속도를 높입니다.
  • SAT cp_model protobuf 형식에 저장소 제약 조건을 추가합니다.

SAT/Python

  • ProtoBuf 형식을 사용하여 문제를 저장하도록 rcpsp_parser를 다시 작성합니다.
  • RCPSP 파서를 개선합니다.

2017년 10월

버전 v6.5 출시 발표

OR-Tools 버전 6.5가 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 해당 섹션을 참조하세요.

플랫폼 변화

  • pypi 모듈 py3-ortools가 ortools 모듈로 병합되었습니다. 이제 'ortools'라는 하나의 모듈만 있습니다.
  • 이러한 Python 모듈의 기본 형식은 이제 휠 파일입니다. pypi에서 Python용 OR-도구를 설치하려면 pip install ortools를 실행하면 됩니다. 최신 버전의 pip가 설치되어 있어야 합니다(9.0.1 이상). 이렇게 하면 최신 버전 (v6.5)을 가져올 수 있습니다.

Bug fixed

이제 protobuf jar 파일이 컴파일된 클래스로 올바르게 빌드됩니다.

새로운 예

  • 더 많은 F# 예가 example/fsharp 디렉터리에 기여했습니다(매튜 무어 씨께 다시 한번 감사드립니다).
  • Java MIP 예도 제공되었습니다 (고마워요, Darian).

2017년 9월

버전 v6.4 출시 발표

OR-Tools 버전 6.4가 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 해당 섹션을 참조하세요.

플랫폼 변화

  • Linux 플랫폼의 Pypi 모듈은 이제 Manylinux1 태그를 사용하여 휠 파일로 제공됩니다. 페데리코 피카렐리님께 감사드립니다. 이 변경사항으로 인해 2017년 7월 출시에서 도입된 Linux별 모듈이 이전 버전으로 되었습니다.

새로운 기능

  • GLOP 내에서 사용되는 확장 방법이 개선되었습니다.
  • C# 라우팅 라이브러리에서 평가자 래핑을 수정합니다. 감사합니다. DevNamedZed
  • 대형 모델에서 flatzinc presolve의 성능을 개선합니다.
  • 기본적으로 flatzinc에 지원되는 SAT를 사용합니다.
  • Sat Solv를 위한 Core 기반 접근 방식의 성능을 개선합니다.
  • 잘못 실패한 선형 할당 알고리즘의 버그를 수정했습니다.
  • ortools/examples/fsharp에 F# 예가 추가되었습니다.
  • 라우팅 라이브러리에서 양성 페널티 검사가 삭제됩니다.

2017년 8월

버전 v6.3 출시 발표

OR-Tools 버전 6.3이 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 해당 섹션을 참조하세요.

새 다운로드 파일

이제 Linux용 Python 휠 파일은 OR-Tools 출시 페이지에서 모든 다운로드의 최신 버전과 함께 다운로드할 수 있습니다.

미니아연 솔버

이 버전에는 Minzinc 2017 챌린지를 위해 전송된 최종 sat 및 flatzinc 코드가 포함되어 있습니다.

2017년 7월

버전 v6.2 출시 발표

OR-Tools 버전 6.2가 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 해당 섹션을 참조하세요.

플랫폼 변화

  • 이제 여러 Linux 바이너리 배포판 (Ubuntu 14.04, 16.04, 17.04, CentOS 7, Debian 9)이 지원됩니다.
  • 이제 Linux 플랫폼의 Pypi 모듈에 배포를 설명하는 태그 (ubuntu-14.04, ubuntu-16.04, ubuntu-17.04, centos-7, debian-9)가 포함됩니다.

새로운 기능

Linux 아티팩트를 빌드할 수 있도록 Docker에 대한 지원을 추가했습니다. or-tools/tools/docker로 이동하여 Makefile를 살펴보고 가능한 타겟(make archive, make pypi, make pypi3)을 확인합니다.

이러한 명령어는 export 하위 디렉터리를 만들고 그 안에 바이너리 아티팩트를 추가합니다.

2017년 6월

버전 v6.1 출시 발표

OR-Tools 버전 6.1이 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 해당 섹션을 참조하세요.

플랫폼 변화

  • Visual Studio 2017이 지원됩니다. Visual Studio 2013은 더 이상 지원되지 않습니다.
  • macOS 버전 10.9 이상이 지원됩니다.

새로운 기능

CP-SAT 솔버를 위해 새로운 protobuf 형식을 추가했습니다. ortools/sat/cp_model.proto를 참조하여 모델을 정의하고 ortools/sat/cp_model_solver.h를 참조하여 문제를 해결하세요.

버그 수정

문제 #420: 모든 플랫폼의 Python pypi 모듈에서 누락된 __version__ 속성이 수정되었습니다.

2017년 5월

버전 v6.0 출시 발표

OR-Tools 버전 6.0이 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 해당 섹션을 참조하세요.

C++의 새 디렉터리 구조

C++를 사용할 때 OR-Tools의 소스/포함 구조를 변경했습니다. 목표는 C++ include 파일의 캡슐화를 향상하는 것입니다. 또한 C++와 Python 디렉터리 구조를 정렬한다는 이점도 있습니다.

  • src/에서 ortools/로 이름이 변경되었습니다.
  • 이제 C++ 파일의 모든 #include 명령어에 ortools 접두사가 추가됩니다. #include "constraint/constraint_solver.h"는 이제 #include "ortools/constraint/constraint_solver.h"입니다.

새로운 기능

  • Bazel 지원 이제 Google의 빌드 도구인 bazel을 사용하여 OR-도구를 빌드할 수 있습니다. Linux 및 Mac OS X에서 작동합니다. Bazel 버전 0.4.5 이상을 다운로드한 후 디렉터리를 or-tools로 변경하고 예를 빌드합니다. bazel build examples/cpp/...

라우팅

경로 라이브러리에서 휴식 (예: 점심을 먹는 운전자로 인한 차량 다운타임) 지원을 구현했습니다. 이 기능은 cvrptw_with_breaks.cc 예에 나와 있습니다.

SCIP 지원

이제 선형 솔버 래퍼가 SCIP 4.0을 지원합니다. 이제 SCIP를 먼저 빌드한 다음 이를 사용하겠다고 또는 도구에 알려야 합니다 여기에서 안내를 확인할 수 있습니다.

GLPK 지원

GLPK를 사용한 빌드 방식도 변경되었습니다. 여기를 참조하세요.

정리

  • 지원 중단되어 C++ 코드베이스에서 hash_map 및 hash_set의 모든 사용이 삭제되었습니다. STL에서 unordered_map 및 unordered_set으로 대체되었습니다.
  • Michael Powell이 제공한 C# makefile 정리

2017년 1월

버전 v5.1 출시 발표

OR-Tools 버전 5.1이 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 해당 섹션을 참조하세요.

새로운 기능

설치 중

라우팅

대칭적인 여행 영업 담당자 문제에 대한 Held-Karp 하한값을 계산하는 알고리즘을 구현했습니다. 이를 통해 최적의 솔루션이 아닌 솔루션 비용과 최적의 솔루션 비용 간 차이의 상한값을 계산할 수 있습니다.

  • 차량 경로 라이브러리에 RoutingModel::SetBreakIntervalsOfVehicle라는 새로운 메서드를 추가했습니다. 이를 통해 break 간격 (차량이 이동, 노드 방문 등)을 실행할 수 없는 시간 간격을 추가할 수 있습니다. 이 옵션을 사용하는 예는 cvrptw_with_breaks.cc를 참조하세요.

예약

토성 문제 해결사

성능 개선

  • SAT 문제 해결사 — 특히 누적 제약조건의 경우 Sat 문제 해결사의 성능이 개선되었습니다.
  • Glop 솔버 — Glop 솔버의 수치 견고성이 개선되어 이제 어려운 숫자 문제에 더 정확한 해법을 찾을 수 있습니다.
  • 플랫아연 솔버
  • flatzinc 인터프리터의 Sat 백엔드 성능이 크게 개선되었습니다.
  • C# flatzinc 인터페이스를 간소화했습니다. 새 인터페이스의 예는 https://github.com/google/or-tools/blob/master/examples/csharp/csfz.cs를 참조하세요.

버그 수정

  • 단일 차량 및 측면 제약 조건이 있는 라우팅 모델에 PathCheapestArc 휴리스틱을 사용하면 솔버가 지나치게 오래 실행되는 경우가 있습니다. 이 문제는 부차 제약을 적절하게 고려하여 수정되었습니다.
  • Java에서는 차량 라우팅 문제를 해결할 때 경로 솔버가 때때로 비정상 종료됩니다. 이 문제는 최신 버전에서 수정되었습니다.

2016년 11월

버전 v5.0 출시 발표

OR-Tools 버전 5.0이 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 해당 섹션을 참조하세요.

실행 중인 예시

  • 프로그램을 더 쉽게 컴파일하고 실행할 수 있는 언어별 타겟과 함께 OR-도구와 함께 제공되는 예가 도입되었습니다.

FlatZinc

제약 조건 솔버

라우팅

  • 검색 중에 솔루션을 찾을 때마다 호출되는 콜백인 AddAtSolutionCallback을 구현했습니다.
  • RoutingModel에 디포가 없는 생성자를 삭제했습니다. 이제 라우팅 모델에 하나 이상의 창고를 지정해야 합니다.

2016년 9월

버전 v4.4 출시 발표

OR-Tools 버전 4.4가 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 해당 섹션을 참조하세요.

  • 확장 스케줄링 API를 사용하고 예 (weighted_tardiness_sat, jobshop_sat)를 사용하도록 수정했습니다.

그래프

  • Graph 클래스에 반복기 트레잇을 추가했습니다.

OR-도구 배포

  • Nuget 패키지가 다시 지원됩니다.

2016년 8월

버전 v4.3 출시 발표

OR-Tools 버전 4.3이 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 해당 섹션을 참조하세요.

제약 조건 솔버

  • 변수가 지정된 간격을 벗어나도록 제한하기 위해 NotBetween 메서드를 구현했습니다.

라우팅

  • 와 같이 기존 NotMember 제약 조건을 확인하고 지역 검색 필터에 사용할 수 있도록 모델의 파싱을 추가했습니다.
  • 로컬 검색 프로파일링이 추가되었습니다.
  • 로컬 이동을 수정합니다.

선형 문제 해결사

  • SCIP 상태 보고가 수정되었습니다.

  • SAT presolver 사용을 단순화하기 위해 SolveWithPresolve 메서드를 구현했습니다.
  • src/sat/util.h|cc에서 검색 유틸리티를 다시 그룹화했습니다.
  • SMT (Lazy Clause Generation) 스케줄링 제약 조건을 구현했습니다. jobshop_sat.ccweighted_tardiness_sat.cc를 참조하세요.

글롭

  • 더 많은 계산 단계에서 희소성을 악용하여 성능을 개선했습니다.

플랫아연

  • minizinc 챌린지에서 발견된 버그를 수정했습니다.

Lp_data

  • 반복자에서 템플릿을 계속 단순화합니다.

OR-도구 배포

  • 이제 C# 어셈블리의 이름이 기본적으로 강력하게 지정됩니다.
  • Protobuf3.0.0으로 업그레이드되었습니다.
  • OR-Tools 보관 종속 항목을 확인하는 Python 스크립트가 추가되었습니다.

2016년 7월

버전 v4.2 출시 발표

OR-Tools 버전 4.2가 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 해당 섹션을 참조하세요.

제약조건 솔버 (라우팅)

  • 이제 이 분리 내에서 활성화될 수 있는 최대 노드 수인 카디널리티로 분리를 정의할 수 있습니다. 예를 들어 n개의 노드와 k의 카디널리티가 있는 논리를 추가하면 n개의 노드 중 k개의 노드가 활성 상태가 될 수 있습니다. 이렇게 하려면 AddDisjunction의 새로운 정의를 사용하면 됩니다.
  • 노드당 다중 분리에 대한 지원이 추가되었습니다. 예를 들어 이제 노드 N1을 다수의 분리 (D1..Dm)에 추가할 수 있습니다. 이렇게 하면 이들 중 하나에서 활성 상태가 될 가능성이 높아집니다. 분리 기간과 관련된 문제에 대해 더 빠른 라우팅 검색 알고리즘이 도입되었습니다.
  • 라우팅 모델 매개변수에 제약조건 문제 해결사 매개변수를 추가하고, 라우팅 검색 매개변수로 log_search를 추가했습니다.
  • 분리된 시간대의 문제를 해결하면 지역 검색 알고리즘이 더 빠르게 해결됩니다. 자세한 내용은 cvrp_disjoint_tw.cc 예를 참고하세요.

Glop (선형 최적화)

  • 더 빠른 심플렉스 알고리즘이 도입되었습니다.

OR-도구 배포

  • C++, Java, .Net의 개별 보관 파일이 아닌 플랫폼당 하나의 보관 파일이 있습니다. Python 보관 파일은 여전히 pypi에서 호스팅됩니다.
  • pypi를 사용하면 Mac OS X 및 Windows에서 wheel (.whl) 모듈로 전환되었습니다. MAJOR.MINOR 번호 지정 스키마를 도입했습니다. 이 숫자는 Mac OS X 공유 라이브러리, Python 모듈, .NET 어셈블리에 저장된 버전인 아카이브 이름에 사용됩니다. 우리가 릴리스하는 첫 번째 버전은 이 스키마가 포함된 v4.2입니다.

2016년 6월

버전 v2016-06 출시 발표

OR-Tools 버전 v2016-06이 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 해당 섹션을 참조하세요.

제약 조건 솔버

  • CP 라이브러리에서 대부분의 콜백 인스턴스 (src/base/callback.h)를 삭제했습니다.
  • NotMemberCt가 추가되었습니다 (변수는 간격 집합에 속할 수 없음).

라우팅 라이브러리

  • 호환되지 않는 변경: AddDimensionWithVehicleCapacity에서 차량의 용량을 지정하려면 이제 콜백 대신 배열 (c++의 벡터)을 전달해야 합니다.

글로프

  • 희소 행렬의 내부 표현을 변경합니다.
  • 성능이 개선되었습니다.

그래프

  • Dijkstra와 Bellman-Ford 알고리즘을 다시 작성하여 콜백을 std::function (C++)로 대체합니다.
  • 호와 노드를 반복할 때 다양한 그래프 구현의 API를 변경합니다.

  • 사용하지 않는 핵심 메서드 (해결 노드)를 삭제합니다.
  • 만족스럽지 않음에 대한 증거를 확인하는 전문가 작성을 추가했습니다.
  • 전처리기를 추가합니다.

  • 새로운 잘 아는 지역을 추가합니다.

  • c++: 예시에서 filelineReader 삭제
  • 데이터: 단일 머신 예약 문제를 추가합니다.

문서

  • 새로운 문서를 확인하세요.

2016년 4월

버전 v2016-04 출시 발표

OR-Tools 버전 v2016-04가 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 해당 섹션을 참조하세요.

종속 항목 업데이트됨

2015년 12월

버전 v2015-12 출시 발표

OR-Tools 버전 v2015-12가 출시되었습니다. 버전을 업데이트하려면 OR-Tools 설치의 해당 섹션을 참조하세요.

제약 조건 솔버

  • CP 솔버의 대규모 주변 검색에서 호환성이 손상되었습니다 (새 API를 보려면 examples/cpp/ls_api.cc, examples/python/pyls_api.py, examples/csharp/csls_api.cs, examples/com/google/ortools/sample/LsApi.java 참고).
  • Python 래핑을 정리했습니다. CP 솔버에서 맞춤 결정을 지원합니다(API의 작동 방식은 examples/test/test_cp_api.py 참고).
  • 다양한 기능이 개선되고 버그가 수정되었습니다.

2015년 9월

github에서 첫 번째 버전 발표.

이제부터 파일이 여기에 저장됩니다.

플랫아연

  • flatzinc 인터프리터용 바이너리 보관 파일을 추가했습니다(www.minizinc.org 참고).
  • 챌린지에 사용된 버전의 몇 가지 수정사항이 포함되어 있습니다.