제어

목차

무료 슬롯 게임제어는 무료 슬롯 게임 시스템(데이터, 모델 인스턴스 및 해결)을 완전히 제어할 수 있는 Python API의 하위 모듈입니다. 다른 Python API 하위 모듈과 함께 사용할 수 있습니다(numpy그리고이전)을 사용하여 무료 슬롯 게임 모델에서 데이터를 푸시/가져올 때 성능을 향상합니다.무료 슬롯 게임control패키지는 일반 대수 모델링 시스템(무료 슬롯 게임)과 상호 작용하는 개체를 제공합니다. 이 패키지의 객체를 사용하면 입력 데이터와 모델 결과를 편리하게 교환할 수 있습니다(무료 슬롯 게임데이터베이스), 무료 슬롯 게임 모델 생성 및 실행을 도와줍니다(감스잡), 무료 슬롯 게임 옵션으로 맞춤설정할 수 있습니다(GamsOptions). 또한 가장 효율적인 방법으로 밀접하게 관련된 일련의 모델 인스턴스를 해결하는 방법을 소개합니다(GamsModelInstance).

무료 슬롯 게임 프로그램은 다른 소스 파일(예: $include)을 포함하고, GDX 파일(예: $GDXIN 또는execute_load)에서 데이터를 로드하고, PUT 파일을 생성할 수 있습니다. 이러한 모든 파일은 (상대) 경로로 지정할 수 있으므로 파일 시스템에 대한 앵커가 필요합니다. 기본 클래스 GamsWorkspace는 파일 시스템에 대한 앵커를 관리합니다. 특정 Python 애플리케이션에서 외부 파일 통신이 문제가 되지 않는 경우 임시 디렉터리와 파일은 네임스페이스의 개체로 관리됩니다.

GamsWorkspace를 제외하고 다음 개체는무료 슬롯 게임control인스턴스가 잠겨 있지 않으면 다른 스레드를 통해 패키지에 액세스할 수 없습니다. 클래스 자체는 스레드로부터 안전하며 클래스의 여러 객체는 서로 다른 스레드에서 무료 슬롯 게임될 수 있습니다(GamsModelInstance 클래스 내에서 스레드로부터 안전하지 않은 솔버에 대한 제한 사항은 아래 참조).

참고
GamsWorkspace의 여러 인스턴스를 병렬로 무료 슬롯 게임하는 경우 동일한 작업 디렉토리를 무료 슬롯 게임하지 않아야 합니다. 그렇지 않으면 파일 이름이 충돌하게 될 수 있습니다.

무료 슬롯 게임제어Python API에는 약어, 무료 슬롯 게임 컴파일/실행 오류 지원(GamsJob.run에서 예외가 발생함), 목록 파일에 대한 구조적 액세스, 솔버 옵션에 대한 적절한 지원 등 무료 슬롯 게임 구성요소에 대한 지원이 부족합니다.

현재 Cplex, Gurobi 및 SoPlex만이 GamsModelInstances 해결 기능을 완전히 활용하고 있습니다. 일부 솔버는 GamsModelInstances를 사용하는 다중 스레드 애플리케이션에서도 작동하지 않습니다. 일부 솔버의 경우 솔버 라이브러리가 스레드로부터 안전하지 않기 때문에(예: MINOS) 이는 불가피합니다. 다른 솔버는 원칙적으로 스레드로부터 안전하지만 무료 슬롯 게임 링크는 그렇지 않습니다(예: SNOPT). 또한 GamsModelInstances는 2차 모델 유형(QCP, MIQCP, RMIQCP)에는 사용할 수 없습니다.

권장 가져오기

무료 슬롯 게임제어API가 설치된 후 다음 import 문으로 무료 슬롯 게임할 수 있습니다.

>>>게임 가져오기

다른 하위 모듈은 별도의 가져오기 명령문을 무료 슬롯 게임하여 가져와야 합니다.

무료 슬롯 게임 시스템 디렉토리 지정

어떤 시스템 디렉토리를 무료 슬롯 게임해야 하는지 지정하는 방법에는 여러 가지가 있습니다. 모든 플랫폼에서 시스템 디렉터리는 GamsWorkspace 생성자에서 지정할 수 있습니다. 무료 슬롯 게임자가 시스템 디렉터리를 지정하지 않으면 API는 자동으로 디렉터리를 찾으려고 시도합니다.

  • Windows: Windows 레지스트리에서 시스템 디렉터리를 찾아보세요.
  • Linux: 다음에서 시스템 디렉토리를 찾으십시오.PATH먼저. 아무것도 발견되지 않으면 검색하십시오.LD_LIBRARY_PATH.
  • OS X: 시스템 디렉토리를 찾으십시오.PATH먼저. 아무것도 발견되지 않으면 검색하십시오.DYLD_LIBRARY_PATH.

환경 변수PATHLinux 및 macOS에서는 다음과 같이 설정할 수 있습니다.

내보내기PATH=<경로/대상/무료 슬롯 게임>:$PATH
참고
Linux 및 macOS에서는 다음을 지정하는 것이 좋습니다.PATH대신에만(DY)LD_LIBRARY_PATH이로 인해 특정 모듈(예: gdx)의 올바른 버전을 로드하는 데 문제가 발생할 수 있기 때문입니다.

API의 중요한 클래스

이 섹션은 무료 슬롯 게임의 일부 기본 클래스에 대한 간략한 개요를 제공합니다.제어API. 이들의 무료 슬롯 게임법은 다음의 광범위한 예제를 통해 설명됩니다.API 무료 슬롯 게임 방법섹션.

API 무료 슬롯 게임 방법

무료 슬롯 게임 배포판은 API 사용법을 보여주는 몇 가지 예를 제공합니다.[GAMSDIR]\api\python\examples\control잘 알려진 내용을 다루는 여러 예가 포함되어 있습니다.교통 문제. 이 튜토리얼의 추가 과정에서는 이러한 예시를 단계별로 논의하고 API의 새로운 요소를 자세히 소개합니다.

예제의 전체 개요를 보려면 앞서 언급한 파일을 여는 것이 좋습니다. 아래에서는 선택된 코드 조각을 무료 슬롯 게임하여 예시를 설명합니다.

무료 슬롯 게임 제어 API에서 패키지/모듈 가져오기

예:transport1.py

무료 슬롯 게임 사용을 시작하기 전에제어API, 다음 지침에 따라 설치해야 합니다.시작하기섹션. 그런 다음를 가져와서 API를 무료 슬롯 게임할 수 있습니다.GamsWorkspace다음과 같은 클래스:

from게임가져오기GamsWorkspace

기존 Python 패키지/모듈은 다음과 같이 가져올 수 있습니다:

가져오기os
가져오기sys

무료 슬롯 게임 시스템을 선택하세요

예:transport1.py

기본적으로 무료 슬롯 게임 시스템은 자동으로 결정됩니다. 컴퓨터에 여러 무료 슬롯 게임 시스템이 있는 경우 작업공간이 생성될 때 추가 인수를 통해 원하는 시스템을 지정할 수 있습니다. 입력하면python Transport1.pyC:/무료 슬롯 게임/42를 사용합니다.무료 슬롯 게임 42달리기transport1.py우리의 기본 무료 슬롯 게임 시스템이 다를지라도. 이는 다음 코드로 관리됩니다.

...
sys_dir = sys.argv[1]iflen(sys.argv) > 1그밖에 없음
ws = GamsWorkspace(system_directory=sys_dir)
...

GDX로 데이터 내보내기

예:transport_gdx.py

무료 슬롯 게임는 있지만제어Python API는 Python과 GDX 간에 데이터를 교환하는 것 이상의 기능을 제공합니다. 일반적인 무료 슬롯 게임 사례는 GDX 파일 내보내기 및 가져오기입니다. 이 목적을 위한 중심 클래스는 GamsDatabase입니다. 내보낼 데이터가 Python 데이터 구조에서 무료 슬롯 게임 가능하다고 가정합니다.

...
식물 = ["시애틀", "샌디에고"]
시장 = ["뉴욕", "시카고", "토피카"]
용량 ="시애틀": 350.0,"샌디에고": 600.0}
수요 ="뉴욕": 325.0,"시카고": 300.0,"토피카": 275.0}
거리 =
("시애틀", "뉴욕"): 2.5,
("시애틀", "시카고"): 1.7,
("시애틀", "토피카"): 1.8,
("샌디에고", "뉴욕"): 2.5,
("샌디에고", "시카고"): 1.8,
("샌디에이고", "토피카"): 1.4,
}
...

다른 무료 슬롯 게임 기호는 다른 Python 데이터 구조를 사용하여 표현됩니다. 무료 슬롯 게임 세트의 데이터는 Python 문자열 목록을 사용하여 표현됩니다(예:식물그리고시장). 반면에 무료 슬롯 게임 매개변수는 Python 사전으로 표현됩니다(예:용량그리고수요). 2차원 매개변수의 표현에 유의하세요.거리키를 저장하기 위해 Python 튜플을 사용합니다. 데이터 구조 선택도 다를 수 있지만 이 예에서 사용된 구조는 표준 Python 데이터 구조로 무료 슬롯 게임 데이터를 표현하는 데 적합합니다.

새로운 GamsDatabase 인스턴스는 GamsWorkspace.add_database를 무료 슬롯 게임하여 생성될 수 있습니다.

...
# 새로운 GamsDatabase 인스턴스 생성
db = ws.add_database()
...

이름과 차원을 인수로 사용하는 GamsDatabase.add_set 메소드를 사용하여 무료 슬롯 게임 세트를 추가하기 시작합니다. 세 번째 인수는 선택적 설명 텍스트입니다. for 루프는 반복됩니다.식물최근 생성된 GamsSet 인스턴스에 새 레코드를 추가합니다iGamsSet.add_record를 무료 슬롯 게임합니다.

...
# 설명 텍스트 '통조림 식물'과 함께 1차원 세트 'i'를 GamsDatabase에 추가
i = db.add_set("나", 1,"통조림 공장")
forp식물:
i.add_record(p)
...

GamsParameter 인스턴스는 GamsDatabase.add_parameter 메소드를 무료 슬롯 게임하여 추가할 수 있습니다. GamsDatabase.add_set와 동일한 서명이 있습니다. 어쨌든 이 예에서는 도메인 정보가 포함된 매개변수를 생성하기 위한 차원 대신 GamsSet 인스턴스 목록을 가져오는 대신 GamsDatabase.add_parameter_dc를 무료 슬롯 게임합니다.

...
# 도메인 'i'에 매개변수 'a' 추가
a = db.add_parameter_dc("a", [i],"케이스에 있는 식물 i의 용량")
forp식물:
a.add_record(p).value = 용량[p]
...

GamsDatabase에 모든 데이터가 준비되면 GamsDatabase.export 메소드를 무료 슬롯 게임하여 GDX 파일을 생성할 수 있습니다.

...
# GamsDatabase를 GamsWorkspace의 'working_directory'에 있는 'data.gdx' 이름의 GDX 파일로 내보냅니다.
db.export("data.gdx")
...

GDX에서 데이터 가져오기

예:transport_gdx.py

GamsWorkspace.add_database_from_gdx를 무료 슬롯 게임하여 GDX 파일에서 데이터를 가져올 수 있습니다. 이 메서드는 GDX 파일의 경로를 무료 슬롯 게임하고 GamsDatabase 인스턴스를 생성합니다.

...
# 새 GamsDatabase를 추가하고 방금 생성된 GDX 파일에서 초기화
db2 = ws.add_database_from_gdx("data.gdx")
...

GamsSet에서 데이터 읽기i다음과 같이 목록에 추가할 수 있습니다:

...
# 기호의 데이터를 Python 데이터 구조로 읽습니다.
i = [rec.keys[0]forrecindb2["나"]]
...

Python 목록은 목록 이해를 무료 슬롯 게임하여 생성됩니다.iGamsDatabase를 쿼리하여 검색됩니다.db2. 반환된 GamsSet 개체는 for 루프를 무료 슬롯 게임하여 반복되어 집합의 레코드에 액세스할 수 있습니다. 각 레코드는 GamsSetRecord 유형이며 해당 키를 요청할 수 있습니다.

GamsParameters에 대해서도 동일한 작업을 수행할 수 있습니다. Python 목록을 만드는 대신 Python 사전 형식의 데이터를 갖고 싶습니다. GamsParameterRecords에는 키뿐만 아니라 값도 요청할 수 있습니다. 다음 코드 조각은 1차원 매개변수를 읽는 방법을 보여줍니다.adict comprehension을 무료 슬롯 게임하여 Python 사전으로.

...
a = rec.keys[0]: Rec.valuerecdb2["a"]}
...

다차원 기호의 경우, 우리는 문자열 대신 튜플이 되도록 Python 사전 키를 선택합니다. 평소와 같이 키에 액세스하지만 특정 키를 다루지는 않습니다. 대신 전체 키 목록을 가져와서 튜플로 변환합니다.

...
d = tuple(rec.keys): Rec.valueforrecindb2["d"]}
...

스칼라는 첫 번째이자 유일한 레코드의 값에 액세스하여 Python 식별자로 읽을 수 있습니다.

...
f = db2["f"].first_record().value
...

파일에서 GamsJob 실행

예:transport1.py

처음에는 다음을 무료 슬롯 게임하여 작업 공간을 만듭니다.ws = GamsWorkspace(). 그 후에 우리는trn스포츠44035_44306직업add_job_from_file 메소드를 무료 슬롯 게임하여 정의한 후 작업을 실행합니다.

...
ws.gamslib("trnsport")
작업 = ws.add_job_from_file("trnsport.gms")
job.run()
...

출력 데이터베이스에서 솔루션 검색

예:transport1.py

다음 줄은 솔루션 출력을 생성하고 run 메소드에 의해 생성된 GamsDatabase에 액세스하기 위한 GamsJob.out_db 속성의 무료 슬롯 게임법을 보여줍니다. 변수의 내용을 검색하려면x내부적으로 get_symbol 메소드를 호출하는 대괄호를 무료 슬롯 게임합니다.

...
forrecinjob.out_db["x"]:
인쇄(
f"x(rec.key(0),rec.key(1)): 레벨=rec.level 한계=rec.marginal"
)
...

대괄호를 무료 슬롯 게임하는 대신 다음을 무료 슬롯 게임할 수도 있습니다.

...
forrecinjob.out_db.get_symbol("x"):
...

GamsOptions를 무료 슬롯 게임하여 솔버 지정

예:transport1.py

해석기는 GamsOptions 클래스와 GamsWorkspace.add_options 메소드를 통해 지정할 수 있습니다. GamsOptions.all_model_types 속성은 xpress를 솔버에서 처리할 수 있는 모든 모델 유형에 대한 기본 솔버로 설정합니다. 그런 다음 GamsJob을 실행합니다.직업새로운 GamsOption을 무료 슬롯 게임합니다.

...
opt = ws.add_options()
opt.all_model_types ="익스프레스"
job.run(옵션)
...

솔버 옵션 파일로 작업을 실행하고 해당 로그 출력을 캡처

예:transport1.py

먼저 파일을 생성합니다xpress.opt콘텐츠 포함알고리즘=장벽이것은 솔버 옵션 파일로 무료 슬롯 게임되며 현재 작업 디렉토리에 저장됩니다. 그런 다음 이전 예제와 마찬가지로 GamsOption을 무료 슬롯 게임하고 GamsOption.optfile 속성을 1로 설정하여 솔버에게 솔버 옵션 파일을 찾도록 지시합니다. 또한 인수를 지정합니다.출력GamsJob의 로그를 파일에 기록하기 위해transport1_xpress.log.

...
오픈(os.path.join(ws.working_directory,"xpress.opt"), "w") 으로파일:
파일.쓰기("알고리즘=장벽")
opt.optfile = 1
함께열기("transport1_xpress.log", "w") as로그:
job.run(opt, 출력=로그)
...

로그 출력을 파일에 쓰는 대신 기능을 제공하는 모든 개체쓰기그리고플러시무료 슬롯 게임할 수 있습니다. 로그를 직접 작성하려면stdout, 다음 코드를 무료 슬롯 게임할 수 있습니다.

...
job.run(opt, 출력=sys.stdout)
...

포함 파일 무료 슬롯 게임

예:transport2.py

이 예에서는 많은 후속 사례와 마찬가지로 데이터 텍스트와 모델 텍스트가 두 개의 다른 문자열로 분리됩니다. 이 문자열은 다음을 통해 액세스됩니다.GAMS_DATA그리고GAMS_MODEL무료 슬롯 게임 구문을 사용하고 있습니다. 먼저 포함 파일을 작성합니다.tdata.gms데이터는 포함하지만 모델 텍스트는 포함하지 않고 현재 작업 디렉토리에 저장합니다.

...
오픈(os.path.join(ws.working_directory,"tdata.gms"), "w") as파일:
파일.쓰기(GAMS_DATA)
...

나중에 GamsWorkspace.add_job_from_string 메소드를 사용하여 GamsJob을 생성합니다. GamsOptions.defines는 '이중 대시' 무료 슬롯 게임 매개변수처럼 사용됩니다. 즉, 다음과 같습니다.--incname=tdata명령줄에서incname다음에서 포함 파일의 이름으로 무료 슬롯 게임됩니다.GAMS_MODEL아래 그림과 같습니다.

...
작업 = ws.add_job_from_string(GAMS_MODEL)
opt = ws.add_options()
opt.defines["inc이름"] ="tdata"
job.run(옵션)
...

문자열GAMS_MODEL데이터를 읽을 수 있는 다음 줄이 포함되어 있습니다.

...
$if not set incname $abort '제공된 데이터 파일에 대한 포함 파일 이름이 없습니다'
$include %incname%
...

문자열에서 데이터를 읽고 GDX로 내보내기

예:transport3.py

우리는 문자열에서 데이터를 읽습니다GAMS_DATA. 여기에는 모델이 포함되어 있지 않고 무료 슬롯 게임 구문의 데이터 정의만 포함되어 있습니다. 해당 GamsJob을 실행하면 GamsJob.out_db 속성을 통해 사용할 수 있는 GamsDatabase가 생성됩니다. GamsDatabase.export 메소드를 사용하여 이 데이터베이스의 내용을 GDX 파일에 쓸 수 있습니다.tdata.gdx현재 작업 디렉토리에 있습니다.

...
작업 = ws.add_job_from_string(GAMS_DATA)
job.run()
job.out_db.export(os.path.join(ws.working_directory,"tdata.gdx"))
...

GDX의 데이터를 무료 슬롯 게임하여 작업 실행

예:transport3.py

이것은 설명된 포함 파일의 무료 슬롯 게임법과 매우 유사하게 작동합니다.포함 파일 무료 슬롯 게임.

...
작업 = ws.add_job_from_string(GAMS_MODEL)
opt = ws.add_options()
opt.defines["gdxincname"] ="tdata"
opt.all_model_types ="익스프레스"
job.run(옵션)
...

몇 가지 사소한 변경 사항이 있습니다.GAMS_MODEL인클루드 파일 대신 GDX 무료 슬롯 게임으로 인한 이전 예시와 비교.

...
$if 설정되지 않음 gdxincname $abort '제공된 데이터 파일에 대한 포함 파일 이름 없음'
$gdxIn %gdxincname%
$load i j a b d f
$gdxIn
...

암시적 데이터베이스 통신을 무료 슬롯 게임하여 작업 실행

예:transport3.py

이 예는 기본적으로 앞의 두 예와 동일합니다. 두 개의 GamsJobs를 생성합니다.작업_데이터그리고직업_모델첫 번째 것은 데이터만 포함하고 두 번째는 데이터 없이 모델만 포함합니다. 달리고 난 후작업_데이터해당out_dbGDX 파일처럼 직접 읽을 수 있습니다. 데이터베이스는 추가 인수로 GamsJob.run 메소드에 전달되어야 합니다.

...
job_data = ws.add_job_from_string(GAMS_DATA)
job_model = ws.add_job_from_string(GAMS_MODEL)
job_data.run()
opt.defines["gdxincname"] = job_data.out_db.name
job_model.run(opt, 데이터베이스=job_data.out_db)
...

Python 데이터 구조를 무료 슬롯 게임하여 데이터 정의

예:transport4.py

우리는 Python 목록을 무료 슬롯 게임하여 세트를 정의하고 매개변수 정의를 위한 Python 사전을 무료 슬롯 게임합니다.

...
식물 = ["시애틀", "샌디에고"]
시장 = ["뉴욕", "시카고", "토피카"]
용량 ="시애틀": 350.0,"샌디에고": 600.0}
수요 ="뉴욕": 325.0,"시카고": 300.0,"토피카": 275.0}
거리 =
("시애틀", "뉴욕"): 2.5,
("시애틀", "시카고"): 1.7,
("시애틀", "토피카"): 1.8,
("샌디에고", "뉴욕"): 2.5,
("샌디에고", "시카고"): 1.8,
("샌디에이고", "토피카"): 1.4,
}
...

Python 데이터 구조에서 GamsDatabase 준비

예:transport4.py

먼저 우리는 GamsWorkspace.add_database 메소드를 무료 슬롯 게임하여 빈 GamsDatabase DB를 생성합니다. 그런 다음 데이터베이스를 준비합니다. 데이터베이스에 집합을 추가하려면 식별자, 차원 및 설명 텍스트를 설명하는 인수와 함께 GamsSet 클래스와 GamsDatabase.add_set 메서드를 무료 슬롯 게임합니다. 데이터베이스에 레코드를 추가하기 위해 Python 데이터 구조의 요소를 반복하고 GamsSet.add_record 메서드를 무료 슬롯 게임하여 추가합니다.

매개변수의 경우 절차는 거의 동일합니다. 무료 슬롯 게임에서 거리를 지정하는 테이블은 차원 2의 매개변수로 처리될 수 있습니다.

GamsJob은 앞의 예에서 설명한 것처럼 실행될 수 있습니다.암시적 데이터베이스 통신을 무료 슬롯 게임하여 작업 실행.

...
db = ws.add_database()
i = db.add_set("나", 1,"통조림 공장")
forpin식물:
i.add_record(p)
j = db.add_set("j", 1,"시장")
formin시장:
j.add_record(m)
a = db.add_parameter_dc("a", [i],"케이스에 있는 식물 i의 용량")
forpin식물:
a.add_record(p).value = 용량[p]
b = db.add_parameter_dc("b", [j],"경우에 따라 시장 j의 수요")
formin시장:
b.add_record(m).value = 수요[m]
d = db.add_parameter_dc("d", [i, j],"수천 마일 단위의 거리")
fork, vindistance.items():
d.add_record(k).value = v
f = db.add_parameter("f", 0,"1,000마일당 케이스당 화물(달러)")
f.add_record().value = 90
작업 = ws.add_job_from_string(GAMS_MODEL)
opt = ws.add_options()
opt.defines["gdxincname"] = db.name
opt.all_model_types ="익스프레스"
job.run(옵션, 데이터베이스=db)
...

GamsJob을 실행하여 GamsCheckpoint 초기화

예:transport5.py

다음 코드 줄은 여러 작업을 수행합니다. 첫 번째 줄은 단순히 GamsCheckpoint를 생성하는 반면, 두 번째 줄은 GamsWorkspace.add_job_from_string 메서드를 무료 슬롯 게임하여 모델 텍스트와 데이터를 포함하지만 해결 문은 포함하지 않는 GamsJob을 생성합니다. 이후 run 메소드는 GamsCheckpoint를 인수로 가져옵니다. 이는 GamsCheckpoint를 의미합니다.cpGamsJob의 상태를 캡처합니다.

...
cp = ws.add_checkpoint()
작업 = ws.add_job_from_string(GAMS_MODEL)
job.run(체크포인트=cp)
...

GamsCheckpoint에서 GamsJob 초기화

예:transport5.py

문자열에 유의하세요GAMS_MODEL전체 모델 및 데이터 정의와 모델 및 해결 상태에 대한 추가 수요 승수 및 스칼라를 포함하지만 해결 문은 포함하지 않습니다.

...
bmult '수요 승수' / 1 /;
...
demand(j) '시장 j의 수요를 충족';
...
스칼라 무료 슬롯 게임 '모델 상태', ss '해결 상태';
...

transport5.py에서 우리는 이 수요 승수에 대해 8개의 다른 값을 가진 목록을 생성합니다.

...
bmult = [0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3]
...

해당 목록의 각 항목에 대해 GamsWorkspace.add_job_from_string 메소드를 무료 슬롯 게임하여 GamsJob을 생성합니다. 수요 승수를 재설정하는 또 다른 문자열 외에b멀트, 풀이 문을 지정하고 스칼라에 값을 할당합니다.무료 슬롯 게임그리고ss우리는 검문소를 통과했습니다cp추가 인수로. 그러면 체크포인트와 문자열에서 제공하는 콘텐츠가 결합된 GamsJob이 생성됩니다.

GamsJob을 실행하고 out_db에서 흥미로운 데이터를 인쇄합니다.

...
bb다중:
작업 = ws.add_job_from_string(
f"bmult=b; lp를 사용하여 전송 최소 z 해결; 무료 슬롯 게임=transport.modelstat; ss=transport.solvestat;",
cp,
)
job.run()
인쇄(f"시나리오 bmult=b:")
인쇄(f" 모델 상태: job.out_db['무료 슬롯 게임'].find_record().value")
인쇄(f" 해결 상태: job.out_db['ss'].find_record().value")
인쇄(f" Obj: job.out_db['z'].find_record().level")
...

참고: 일부 수요 승수는 실행 불가능성을 유발합니다. 그럼에도 불구하고 무료 슬롯 게임는 기존 목적함수 값을 유지합니다. 그러므로모델 상태그리고해결 상태올바른 솔루션 해석을 위한 중요한 정보를 제공합니다.

GamsCheckpoint를 무료 슬롯 게임하여 여러 GamsJob을 병렬로 실행

예:transport6.py

GamsWorkspace를 제외하고 다음 개체는무료 슬롯 게임control인스턴스가 잠겨 있지 않으면 다른 스레드를 통해 패키지에 액세스할 수 없습니다. 클래스 자체는 스레드로부터 안전하며 클래스의 여러 객체는 서로 다른 스레드에서 무료 슬롯 게임될 수 있습니다. (내에서 스레드로부터 안전하지 않은 솔버에 대한 제한 사항은 아래를 참조하세요.)GamsModelInstance클래스).

참고
여러 인스턴스를 무료 슬롯 게임하는 경우GamsWorkspace동시에 동일한 작업 디렉토리를 무료 슬롯 게임하지 않아야 합니다. 그렇지 않으면 파일 이름이 충돌하게 될 수 있습니다.

현재 Cplex, Gurobi 및 SoPlex만이 GamsModelInstances 해결 기능을 완전히 활용하고 있습니다. 일부 솔버는 GamsModelInstances를 사용하는 다중 스레드 애플리케이션에서도 작동하지 않습니다. 일부 솔버의 경우 솔버 라이브러리가 스레드로부터 안전하지 않기 때문에(예: MINOS) 이는 불가피합니다. 다른 솔버는 원칙적으로 스레드로부터 안전하지만 무료 슬롯 게임 링크는 그렇지 않습니다(예: SNOPT). 또한 GamsModelInstances는 2차 모델 유형(QCP, MIQCP, RMIQCP)에는 사용할 수 없습니다.

이 예는 Transport5.py에서 알려진 작업을 병렬로 실행하는 방법을 보여줍니다. GamsCheckpoint를 초기화합니다.cp그리고 이전에 했던 것처럼 수요 승수를 도입합니다.

...
cp = ws.add_checkpoint()
작업 = ws.add_job_from_string(GAMS_MODEL)
job.run(체크포인트=cp)
bmult = [0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3]
...

또한 잠금 개체를 소개합니다.io_lock병렬 작업의 출력 혼합을 방지하는 데 무료 슬롯 게임됩니다. 우리는 각 항목에 대해 하나의 시나리오를 만듭니다.b다중 목록그리고 스레드가 실행을 시작하도록 합니다.

...
io_lock = 잠금()
스레드 =
forbinb다중:
스레드[b] = 스레드(대상=run_scenario, args=(ws, cp, io_lock, b))
스레드[b].start()
forbinb다중:
스레드[b].join()
...

기능 중run_scenarioGamsJob은 이전 Transport5.py 예와 마찬가지로 생성되고 실행됩니다. 출력 섹션도 객체에 의해 '잠겨있다'는 점을 제외하면 동일합니다.io_lock이는 여러 수요 승수에 대해 출력 섹션을 동시에 실행할 수 없음을 의미합니다.

...
defrun_scenario(작업공간, 체크포인트, io_lock, b):
작업 = 작업 공간.add_job_from_string(
f"bmult=b; lp를 사용하여 전송 최소 z 해결; 무료 슬롯 게임=transport.modelstat; ss=transport.solvestat;",
체크포인트,
)
job.run()
# 보고서 정보가 엉망이 되는 것을 방지하기 위해 출력을 중요한 섹션으로 만들어야 합니다.
io_lock.acquire()
인쇄(f"시나리오 bmult=b:")
인쇄(f" 모델 상태: job.out_db['무료 슬롯 게임'].first_record().value")
인쇄(f" 해결 상태: job.out_db['ss'].first_record().value")
인쇄(f" Obj: job.out_db['z'].first_record().level")
io_lock.release()
...

transport5.py의 출력은 다음 요소의 순서에 따라 엄격하게 정렬됩니다.b멀트transport6.py에서 출력 블록의 순서가 변경될 수 있지만 하나의 시나리오를 설명하는 블록은 다음으로 인해 여전히 함께 표시됩니다.io_lock객체.

GamsCheckpoint에서 GamsModelInstance 생성

예:transport7.py

transport7.py에서 GamsModelInstance의 무료 슬롯 게임법을 보여줍니다.

첫번째 체크포인트에서cp이전 예와 같이 생성됩니다. GamsJob을 참고하세요.직업다시 풀이 문이 포함되어 있지 않으며 수요 승수는 이미 기본값 1로 포함되어 있습니다. GamsModelInstance를 생성합니다.miGamsCheckpoint.add_modelinstance 메소드를 무료 슬롯 게임합니다.

...
cp = ws.add_checkpoint()
작업 = ws.add_job_from_string(GAMS_MODEL)
job.run(체크포인트=cp)
mi = cp.add_modelinstance()
...

GamsModifier를 무료 슬롯 게임하여 GamsModelInstance의 매개변수 수정

예:transport7.py

GamsModelInstance는 데이터를 유지하기 위해 sync_db를 무료 슬롯 게임합니다. 우리는 정의합니다b멀트GamsDatabase.add_parameter 메소드를 무료 슬롯 게임하여 GamsParameter로 지정하고 gurobi를 솔버로 지정합니다. 그 후 GamsModelInstance는 3개의 인수, 해결 문 GamsModifier로 인스턴스화됩니다.b멀트및 GamsOptions선택. GamsModifier는 다음을 의미합니다.b멀트GamsModelInstance의 다른 모든 매개변수, 변수 및 방정식을 수정하는 동안mi변하지 말고 그대로 있어라. GamsParameter.add_record 메소드를 무료 슬롯 게임하여 값을 할당합니다.b멀트. 나중에 GamsParameter.first_record 메서드를 무료 슬롯 게임하여 해당 값을 변경하여 다양한 수요 승수로 잘 알려진 예를 재현할 수 있습니다.

...
bmult = mi.sync_db.add_parameter("bmult", 0,"수요 승수")
opt = ws.add_options()
opt.all_model_types ="복합체"
mi.instantiate("교통수단은 lp min z를 무료 슬롯 게임합니다", GamsModifier(bmult), opt)
bmult.add_record().value = 1.0
bmult_list = [0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3]
forbbmult_list:
bmult.first_record().value = b
mi.solve()
인쇄(f"시나리오 bmult=b:")
인쇄(f" 모델 상태: mi.model_status")
인쇄(f" 해결 상태: mi.solver_status")
인쇄(f" Obj: mi.sync_db['z'].first_record().level")
...

GamsModifier를 무료 슬롯 게임하여 GamsModelInstance의 변수 수정

예:transport7.py

우리는 GamsCheckpoint.add_modelinstance 메소드를 무료 슬롯 게임하여 GamsModelInstance를 생성합니다. 그 후에 우리는 정의합니다xGamsVariable 및 GamsParameter로xup다음의 상한으로 무료 슬롯 게임됩니다.x. 다음 인스턴스화 메소드에서 GamsModifier에는 3개의 인수가 있습니다. 첫 번째 사람은 이렇게 말합니다.x수정 가능합니다. 두 번째는 변수의 어느 부분(하한, 상한 또는 수준)을 수정할 수 있는지 결정하고 세 번째는 이 경우 새 값을 보유하는 GamsParameter를 지정합니다.xup.

다음 루프에서는 네트워크의 한 링크의 상한을 0으로 설정합니다. 이는 해당 공장과 시장 간의 운송이 불가능함을 의미하며 수정된 운송 문제를 해결합니다.

...
mi = cp.add_modelinstance()
x = mi.sync_db.add_variable("x", 2, VarType.Positive)
xup = mi.sync_db.add_parameter("xup", 2,"x의 상한")
# GamsModelInstance를 인스턴스화하고 모델 정의와 GamsModifier를 전달하여 x의 상한을 변경 가능으로 선언
mi.instantiate("운송은 lp min z를 무료 슬롯 게임합니다", GamsModifier(x, UpdateAction.Upper, xup))
mi.solve()
forijob.out_db["나"]:
forjinjob.out_db["j"]:
xup.clear()
xup.add_record((i.key(0), j.key(0))).value = 0
mi.solve()
인쇄(f"시나리오 링크가 차단되었습니다: i.key(0) - j.key(0)")
인쇄(f" 모델 상태: mi.model_status")
인쇄(f" 해결 상태: mi.solver_status")
인쇄(f" 개체: mi.sync_db['z'].find_record().level")
...

큐를 무료 슬롯 게임하여 여러 GamsModelInstances를 병렬로 해결

예:transport8.py

GamsCheckpoint를 초기화합니다cpGamsJob에서. 그런 다음 수요 승수의 다양한 값을 나타내는 목록을 정의합니다. 해당 목록은 마지막 요소를 먼저 추출하는 대기열처럼 무료 슬롯 게임됩니다. 개체list_lock그리고io_lock는 하나의 수요 승수를 여러 번 읽고 출력이 엉망이 되는 것을 방지하기 위해 나중에 무료 슬롯 게임됩니다. 그런 다음 함수를 호출합니다.scen_solve병렬로 여러 번. 병렬 호출 수는 다음과 같이 지정됩니다.nr_workers.

...
cp = ws.add_checkpoint()
작업 = ws.add_job_from_string(GAMS_MODEL)
job.run(체크포인트=cp)
bmult_list = [1.3, 1.2, 1.1, 1.0, 0.9, 0.8, 0.7, 0.6]
list_lock = 잠금()
io_lock = 잠금()
# 2개의 스레드 시작
nr_workers = 2
스레드 =
i범위(nr_workers):
스레드[i] = 스레드(
target=scen_solve, args=(cp, bmult_list, list_lock, io_lock)
)
스레드[i].start()
fori범위(nr_workers):
스레드[i].join()

기능 중scen_solve이전 예제와 같이 GamsModelInstance를 생성하고 인스턴스화하고 매개변수를 만듭니다.b멀트수정 가능. 우리가 선택한다는 점에 유의하세요.클플렉스스레드 안전하기 때문에 솔버로 무료 슬롯 게임됩니다(구로비도 가능합니다).

객체에 의해 잠긴 두 개의 중요한 섹션이 있습니다.목록_잠금그리고io_lock. pop 메소드는 목록에서 마지막 요소를 제거하고 반환하며 삭제합니다. 목록이 비어 있으면 루프가 종료됩니다.

...
defscen_solve(체크포인트, bmult_list, list_lock, io_lock):
list_lock.acquire()
mi = checkpoint.add_modelinstance()
list_lock.release()
bmult = mi.sync_db.add_parameter("bmult", 0,"수요 승수")
opt = ws.add_options()
opt.all_model_types ="복합체"
# GamsModelInstance를 인스턴스화하고 모델 정의와 GamsModifier를 전달하여 bmult 변경 가능을 선언
mi.instantiate("교통수단은 lp min z를 무료 슬롯 게임합니다", GamsModifier(bmult), opt)
bmult.add_record().value = 1.0
그동안 사실입니다:
# 생성 시 다른 스레드에 전달하는 대신 큐에서 bmult 값을 동적으로 가져옵니다.
list_lock.acquire()
if 아님bmult_list:
list_lock.release()
반환
b = bmult_list.pop()
list_lock.release()
bmult.first_record().value = b
mi.solve()
# 보고서 정보가 엉망이 되는 것을 방지하기 위해 출력을 중요한 섹션으로 만들어야 합니다.
io_lock.acquire()
인쇄(f"시나리오 bmult=b:")
인쇄(f" 모델 상태: mi.model_status")
인쇄(f" 솔베상태: mi.solver_status")
인쇄(f" Obj: mi.sync_db['z'].first_record().level")
io_lock.release()
...

무료 슬롯 게임 Access에서 읽어서 GamsDatabase 채우기

예:transport9.py

이 예는 Microsoft Access에서 GamsDatabase로 데이터를 가져오는 방법을 보여줍니다. Transport9.py를 성공적으로 실행하려면 몇 가지 전제 조건이 필요합니다.

  • 가져옵니다pyodbc.
  • 아키텍처 불일치로 인해 문제가 발생할 수 있습니다. MS Access, Python, pyodbc 및 무료 슬롯 게임의 비트는 동일해야 합니다(64비트).

우리는 함수를 호출합니다read_data_from_access마침내 아래와 같이 GamsDatabase를 반환합니다.

...
db = read_from_access(ws)
...

함수read_from_access빈 데이터베이스 생성으로 시작됩니다. 그런 다음 무료 슬롯 게임 Access 데이터베이스에 대한 연결을 설정합니다.수송.accdb다음에서 찾을 수 있습니다.[GAMSDIR]\apifiles\Data. 마지막으로 무료 슬롯 게임 세트와 매개변수를 읽으려면 함수를 호출합니다.read_set그리고read_parameter아래에 설명되어 있습니다.

...
defread_from_access(ws):
db = ws.add_database()
# 데이터베이스에 연결
str_access_conn =r"DRIVER=Microsoft Access Driver(*.mdb, *.accdb);DBQ=..\..\..\..\apifiles\Data\transport.accdb"
시도:
연결 = pyodbc.connect(str_access_conn)
제외예외ase:
올림예외(f"오류: 데이터베이스 연결 생성에 실패했습니다.\ne")
# 무료 슬롯 게임 세트 읽기
read_set(연결, db,"식물에서 식물 선택", "나", 1,"통조림 공장")
read_set(연결, DB,"시장에서 시장 선택", "j", 1,"시장")
# 무료 슬롯 게임 매개변수 읽기
read_parameter(
연결,
db,
"공장 선택,공장에서 생산 능력",
"a",
1,
"케이스에 있는 식물 i의 용량",
)
read_parameter(
연결,
db,
"시장 선택,시장에서 수요",
"b",
1,
"경우에 따라 시장 j의 수요",
)
read_parameter(
연결,
db,
"공장,시장,거리 FROM 거리 선택",
"d",
2,
"수천 마일 단위의 거리",
)
connection.close()
반환db
...

함수read_set나중에 무료 슬롯 게임 Access 파일의 데이터로 채워지는 GamsDatabase에 세트를 추가합니다. 함수read_parameter매우 유사하게 작동합니다.

...
defread_set(connection, db, query_string, set_name, set_dim, set_exp=""):
시도해 보세요:
커서 = 연결.커서()
cursor.execute(query_string)
데이터 = 커서.fetchall()
iflen(데이터[0]) != set_dim:
올림예외(
"select 문의 필드 수가 setDim과 일치하지 않습니다"
)
i = db.add_set(set_name, set_dim, set_exp)
데이터:
키 = []
forin행:
keys.append(str(key))
i.add_record(키)
제외예외으로예:
올림예외(
"오류: 데이터베이스에서 필요한 데이터를 검색하는 데 실패했습니다.\n0".format(
)
)
마지막으로:
cursor.close()
...

모든 데이터를 읽고 나면 GamsDatabase에서 GamsJob을 생성하고 평소대로 실행할 수 있습니다.

무료 슬롯 게임 Excel에서 읽어서 GamsDatabase 채우기

예:transport10.py

이 예는 Excel에서 데이터를 읽는 방법, 더 구체적으로 말하면 Excel에서 데이터를 읽는 방법을 보여줍니다.[GAMSDIR]\apifiles\Data\transport.xlsx.

먼저 당신은 다음을 다운로드해야 합니다.openpyxl패키지:

pip install openpyxl

이제 Transport10.py를 실행할 수 있습니다.

transport10.py에서 모델은 이전의 많은 예와 Excel 파일처럼 데이터 없이 문자열로 제공됩니다.수송.xlsx위치는[GAMSDIR]\apifiles\Data. 먼저 읽을 통합 문서와 다른 시트 이름을 정의합니다. 모든 스프레드시트에 동일한 수의 시장과 공장이 있는지 확인하기 위해 행과 열 수를 확인하는 간단한 테스트를 수행합니다. 작업공간은 이 테스트에서 오류가 발생하지 않는 경우에만 생성됩니다.

...
wb = load_workbook(
os.path.join(*[os.pardir] * 4,"api파일", "데이터", "transport.xlsx")
)
용량 = wb["용량"]
수요 = wb["수요"]
거리 = wb["거리"]
#개의 시장/공장 수는 모든 스프레드시트에서 동일해야 합니다
if (
distance.max_column - 1 != 수요.max_column
또는distance.max_row - 1 != 용량.max_row
):
올림예외("스프레드시트의 크기가 일치하지 않습니다.")
...

이제 우리는 GamsDatabase를 생성하고 다른 워크시트에 포함된 데이터를 읽을 수 있습니다. 열을 반복하고 세트 이름과 해당 매개변수 값을 읽습니다.

...
db = ws.add_database()
i = db.add_set("나", 1,"식물")
j = db.add_set("j", 1,"시장")
capacity_param = db.add_parameter_dc("a", [i],"용량")
demand_param = db.add_parameter_dc("b", [j],"수요")
distance_param = db.add_parameter_dc("d", [i, j],"거리")
forccapacity.iter_cols():
키 = c[0].값
i.add_record(키)
capacity_param.add_record(key).value = c[1].value
forcindemand.iter_cols():
키 = c[0].값
j.add_record(키)
demand_param.add_record(key).value = c[1].value
forcin범위(2, distance.max_column + 1):
forrin범위(2, distance.max_row + 1):
키 = (
거리.셀(행=r, 열=1).값,
거리.셀(행=1, 열=c).값,
)
v = 거리.셀(행=r, 열=c).값
distance_param.add_record(keys).value = v
...

데이터베이스에서처럼 세트와 매개변수의 이름을 지정할 수 있지만 반드시 그럴 필요는 없습니다. 이제 평소처럼 GamsJob을 실행할 수 있습니다.

...
작업 = ws.add_job_from_string(GAMS_MODEL)
opt = ws.add_options()
opt.defines["gdxincname"] = db.name
opt.all_model_types ="익스프레스"
job.run(옵션, 데이터베이스=db)
forrecjob.out_db["x"]:
인쇄(
f"x(rec.key(0),rec.key(1)): 레벨=rec.level 한계=rec.marginal"
)
...

저장/재시작 파일 생성 및 무료 슬롯 게임

예:transport11.py

transport11.py에서 저장/재시작 파일을 생성하고 무료 슬롯 게임하는 방법을 보여줍니다. 일반적으로 이러한 파일은 응용 프로그램 제공업체에서 제공해야 하지만 이 예에서는 데모용으로 파일을 만듭니다. 다시 시작은 GamsCheckpoint에서 시작됩니다.

디렉토리를 생성합니다tmp내부 식별자 포함w_dir현재 디렉토리에 있습니다. 이 파일은 나중에 작업 디렉토리로 무료 슬롯 게임됩니다. 메인 함수에서 우리는 함수를 호출합니다.create_save_restart디렉토리 제공tmp및 저장/재시작 파일에 원하는 이름(티베이스)을 인수로 무료 슬롯 게임합니다.

...
working_dir = os.path.join(os.curdir,"tmp")
create_save_restart(sys_dir, os.path.join(working_dir,"tbase"))
...

기능 중create_save_restart주어진 작업 디렉토리로 작업공간을 생성합니다(w_dir참조tmp). 그런 다음 문자열에서 GamsJob을 만듭니다. 다음을 통해 제공된 문자열에 유의하세요.get_base_model_text내용을 제공하지 않고 집합의 기본 정의를 포함합니다(이것이 바로$oneempty에 무료 슬롯 게임됩니다). 그런 다음 작업을 컴파일만 하고 실행하지는 않도록 GamsOption을 지정합니다. 그런 다음 체크포인트를 생성합니다.cp다음 GamsJob 실행으로 초기화되고 우리의 경우 함수에 대한 인수로 제공된 파일에 저장됩니다.티베이스. 이는 add_checkpoint 메소드가 식별자와 파일 이름을 인수로 받아들이기 때문에 가능합니다.

...
defcreate_save_restart(sys_dir, cp_file_name):
ws = GamsWorkspace(os.path.dirname(cp_file_name), sys_dir)
job_1 = ws.add_job_from_string(GAMS_BASE_MODEL)
opt = ws.add_options()
opt.action = Action.CompileOnly
cp = ws.add_checkpoint(os.path.basename(cp_file_name))
job_1.run(옵션, cp)
...

그래서 주요 기능에 대한 추가 설명으로 돌아가기 전에 명심해야 할 것은 파일티베이스이제 현재 작업 디렉토리에 있으며 재시작 파일과 똑같이 작동하는 체크포인트가 포함되어 있습니다.

메인 함수에서는 [transport4.py]에서 이미 했던 것처럼 Python 데이터 구조를 무료 슬롯 게임하여 일부 데이터를 정의합니다(Python 데이터 구조를 무료 슬롯 게임하여 데이터 정의) GamsWorkspace 및 GamsDatabase를 만들기 전에.

...
sys_dir = sys.argv[1]iflen(sys.argv) > 1그밖에없음
working_dir = os.path.join(os.curdir,"tmp")
ws = GamsWorkspace(working_dir, sys_dir)
db = ws.add_database()
...

나중에 우리는 [transport4.py]에서 이미 했던 것처럼 GamsDatabase를 설정했습니다(Python 데이터 구조에서 GamsDatabase 준비). 이 작업이 완료되면 이 데이터와 파일에 저장된 체크포인트를 무료 슬롯 게임하여 GamsJob을 실행합니다.티베이스.

...
cp_base = ws.add_checkpoint("tbase")
작업 = ws.add_job_from_string(GAMS_MODEL, cp_base)
opt = ws.add_options()
opt.defines["gdxincname"] = db.name
opt.all_model_types ="익스프레스"
job.run(옵션, 데이터베이스=db)
...

우리가 생성하는 문자열을 참고하세요직업에 저장된 체크포인트를 준비하는 데 무료 슬롯 게임된 것과 다릅니다티베이스그리고 GamsDatabase에서 데이터를 올바르게 읽는 역할만 담당합니다. 전체 모델 정의는 체크포인트에 의해 전달됩니다.cp_base우리가 저장한 것과 동일합니다티베이스.