무료 슬롯 사이트 MIRO 연습 파트 1

게시일: 2025년 7월 17일 미로 GAMSPy

 

GAMSPy 모델에서 무료 슬롯 사이트 MIRO 앱으로

이 튜토리얼에서는 무료 슬롯 사이트 MIRO의 강력한 기능을 탐색하여 최적화 문제에 맞는 애플리케이션을 생성할 것입니다. 단계별로 이를 위한 MIRO 애플리케이션을 구축하겠습니다.갤러리예.

이 튜토리얼을 따르려면 주어진 GAMSPy 모델로 시작하므로 귀하가 이미 무료 슬롯 사이트 또는 GAMSPy로 작업했다고 가정합니다. 첫 번째 섹션의 내용은 GAMSPy에만 적용되며 그 이후의 모든 내용은 무료 슬롯 사이트와 GAMSPy 모두에 적용됩니다. 따라서 무료 슬롯 사이트 모델로 작업하는 경우 다음을 확인할 수 있습니다.문서구문의 경우 추가 설명을 보려면 튜토리얼을 따르는 것이 도움이 될 무료 슬롯 사이트습니다. 그렇지 않은 경우에는 다음과 같이 하면 됩니다.미로설치됨(이 튜토리얼은 버전 2.12.0을 기반으로 하며, 이전 버전을 사용하는 경우 우리가 다룰 기능 중 일부가 누락될 무료 슬롯 사이트음), 일부 R 지식은 튜토리얼의 세 번째 부분에서 도움이 될 무료 슬롯 사이트지만 필수는 아닙니다. 필요한 모든 R 기능이 설명되므로 이전에 비슷한 언어로 작업해 본 적이 있다면 계속 진행하시면 됩니다!

이미 언급했듯이 무료 슬롯 사이트 또는 GAMSPy 구현으로 시작할 수 있습니다. 우리는 GAMSPy 모델로 작업할 것입니다. 첫 번째 단계는 애플리케이션의 입력과 출력을 정의하는 것입니다. 이는 무료 슬롯 사이트를 사용하는지 GAMSPy를 사용하는지에 따라 달라지는 프로세스의 유일한 부분입니다. 이후 구성 프로세스는 둘 다 동일합니다.

먼저 GAMSPy 모델에서 입력과 출력을 지정하는 방법을 보여드리겠습니다. 그런 다음 이러한 정의만 사용하여 무료 슬롯 사이트에서 데이터를 시각화하는 방법을 살펴보겠습니다. 이 단계는 모델 개발 중에 매우 유용할 수 있습니다. 이를 통해 출력 데이터를 신속하게 플롯하고 검사하여 결과가 적합한지 확인할 수 있습니다. 뭔가 잘못된 것 같으면 모델 구현의 잠재적인 오류를 조사하기 위한 명확한 출발점이 있습니다.

시각화의 기본 사항을 다룬 후 이 튜토리얼의 두 번째 부분에서는 구성 모드로 이동하겠습니다. 여기에서는 코드를 편집하지 않고도 다양한 기본 설정을 구성할 수 있으므로 다양한 요구 사항에 맞게 애플리케이션을 쉽게 사용자 지정할 수 있습니다. 내장된 옵션만으로는 충분하지 않은 경우가 있기 때문에 이 튜토리얼의 세 번째 부분에서는 사용자 인터페이스를 최대한 제어할 수 있도록 사용자 정의 렌더러와 위젯을 추가하는 방법을 보여줍니다. 마지막으로 무료 슬롯 사이트 애플리케이션을 더욱 강력하고 필요에 맞게 맞춤화할 수 있는 고급 사용자 정의 팁과 요령을 살펴보겠습니다.

모델 구현

MIRO 애플리케이션 구축의 시작점은 무료 슬롯 사이트 또는 GAMSPy를 사용하여 모델을 구현하는 것입니다. 언급한 대로 여기서는 GAMSPy 모델을 사용합니다. 필요한 코드 수정이 무료 슬롯 사이트에서 어떻게 보이는지 확인하려면 다음을 참조하세요.문서 .

우리의 예시 모델은 다음 예시를 기반으로 한 "BESS(배터리 에너지 저장 시스템) 크기 문제"입니다.NAG, GitHub에서 사용 가능(BESS.ipynb). 목표는 BESS를 활용하여 피크가 아닌 시간에 저비용 에너지를 저장하고 수요가 높을 때 방출하는 것을 포함하여 가장 비용 효율적인 에너지원 조합을 식별하여 도시의 시간당 에너지 일정을 최적화하는 것입니다. 다양한 저장 용량과 방전율을 평가함으로써 모델은 수요를 지속적으로 충족시키면서 전체 에너지 비용을 최소화하는 구성을 정확히 찾아냅니다.

들어가기 전에, 완성된 애플리케이션에 대한 소개에서 수학적 설명을 검토하는 것이 좋습니다.갤러리. 거기에 소개된 변수 이름을 직접 참조하겠습니다.

GAMSPy 모델 코드
가져오기 판다 as pd
가져오기 sys

from 감스파이 가져오기 (
컨테이너,별명,수식,모델,매개변수,센스,설정,합계,변수,오드,옵션,모델상태,해결 상태,)


def 메인():m=컨테이너()
    # 생성기 매개변수
generator_specations_input=pd.데이터프레임([["gen0", 1.1, 220, 50, 100, 4, 2],["gen1", 1.3, 290, 80, 190, 4, 2],["gen2", 0.9, 200, 10, 70, 4, 2],],=[            "나",
            "cost_per_unit",
            "고정 비용",
            "min_power_output",
            "max_power_output",
            "min_up_time",
            "min_down_time",
],    )

    # 에너지 관리 시스템에 의해 충족되는 부하 수요
    # 비용 외부 그리드와 결합하여 시간 동안 하나의 진실 소스를 갖습니다(세트 j)
timewise_load_demand_and_cost_external_grid_input=pd.데이터프레임([["시간00", 200, 1.5],["hour01", 180, 1.0],["hour02", 170, 1.0],["hour03", 160, 1.0],["시간04", 150, 1.0],["시간05", 170, 1.0],["시간06", 190, 1.2],["시간07", 210, 1.8],["시간08", 290, 2.1],["시간09", 360, 1.9],["시간10", 370, 1.8],["시간11", 350, 1.6],["시간12", 310, 1.6],["시간13", 340, 1.6],["시간14", 390, 1.8],["시간15", 400, 1.9],["시간16", 420, 2.1],["시간17", 500, 3.0],["시간18", 440, 2.1],["시간19", 430, 1.9],["시간20", 420, 1.8],["시간21", 380, 1.6],["시간22", 340, 1.2],["시간23", 320, 1.2],],=["j", "load_demand", "cost_external_grid"],    )

    # 세트
i=설정(m,이름="나",
기록=generator_specations_input["나"],설명="발전기",
    )
j=설정(m,이름="j",
기록=timewise_load_demand_and_cost_external_grid_input["j"],설명="시간",
    )
t=별칭(m, 이름="t", alias_with=j)
    # 데이터
    # 생성기 매개변수
gen_cost_per_unit=매개변수(m,이름="gen_cost_per_unit",
도메인=[i],기록=generator_specations_input[["나", "cost_per_unit"]],설명="발전기 단위당 비용 i",
    )

gen_fixed_cost=매개변수(m,이름="gen_fixed_cost",
도메인=[i],기록=generator_specations_input[["나", "고정_비용"]],설명="발전기 i의 고정 비용",
    )

gen_min_power_output=매개변수(m,이름="gen_min_power_output",
도메인=[i],기록=generator_specations_input[["나", "min_power_output"]],설명="제너레이터 i의 최소 전력 출력",
    )

gen_max_power_output=매개변수(m,이름="gen_max_power_output",
도메인=[i],기록=generator_specations_input[["나", "max_power_output"]],설명="발전기 i의 최대 전력 출력",
    )

gen_min_up_time=매개변수(m,이름="gen_min_up_time",
도메인=[i],기록=generator_specations_input[["나", "min_up_time"]],설명="발전기 i의 최소 가동 시간",
    )

gen_min_down_time=매개변수(m,이름="gen_min_down_time",
도메인=[i],기록=generator_specations_input[["나", "min_down_time"]],설명="발전기 i의 최소 정지 시간",
    )

    # 배터리 매개변수
cost_bat_power=매개변수(m,"cost_bat_power", 기록=1, is_miro_input=)
cost_bat_energy=매개변수(m,"cost_bat_energy", 기록=2, is_miro_input=)

    # 부하 수요 및 외부 전력망
load_demand=매개변수(m, 이름="load_demand", 도메인=[j], 설명="j시간에 로드 수요"
    )

cost_external_grid=매개변수(m,이름="cost_external_grid",
도메인=[j],설명="j시간의 외부 그리드 비용",
    )

max_input_external_grid=매개변수(m,이름="max_input_external_grid",
기록=10,
설명="매시간 외부 전력망에서 가져올 무료 슬롯 사이트는 최대 전력",
    )

    # 변수
    # 생성기
gen_power=변수(m,이름="gen_power",
        유형="긍정적",
도메인=[i, j],설명="j 시간에 i 발전기에서 전력 공급",
    )

gen_active=변수(m,이름="gen_active",
        유형="바이너리",
도메인=[i, j],설명="j 시간에 발전기 i가 활성화되어 있습니까?",
    )

    # 배터리
배터리_전력=변수(m,이름="배터리_전력",
도메인=[j],설명="j 시간에 배터리에서 전력이 충전되거나 방전되었습니다.",
    )

battery_delivery_rate=변수(m,이름="battery_delivery_rate",
설명="배터리 에너지 시스템의 전력(전달) 속도",
    )

배터리_저장=변수(m,이름="배터리_저장",
설명="배터리 에너지 시스템의 에너지(저장) 속도",
    )

    # 외부 그리드
external_grid_power=변수(m,이름="external_grid_power",
        유형="긍정적",
도메인=[j],설명="j 시간에 외부 전력망에서 전력을 가져왔습니다",
    )

    # 방정식
fulfill_load=수식(m,이름="fulfill_load",
도메인=[j],설명="부하 균형은 j시간마다 충족되어야 합니다.",
    )

gen_above_min_power=수식(m,이름="gen_above_min_power",
도메인=[i, j],설명="발전기 전력은 최소 출력 이상이어야 합니다",
    )

gen_below_max_power=수식(m,이름="gen_below_max_power",
도메인=[i, j],설명="발전기 전력은 최대 출력보다 낮아야 합니다",
    )

gen_above_min_down_time=수식(m,이름="gen_above_min_down_time",
도메인=[i, j],설명="발전기 가동 중지 시간은 최소 가동 중지 시간 이상이어야 합니다.",
    )

gen_above_min_up_time=수식(m,이름="gen_above_min_up_time",
도메인=[i, j],설명="발전기 가동 시간은 최소 가동 시간 이상이어야 합니다",
    )

battery_above_min_delivery=수식(m,이름="battery_above_min_delivery",
도메인=[j],설명="최소 전력 속도를 초과하는 배터리 공급 속도(충전 속도)",
    )

battery_below_max_delivery=수식(m,이름="battery_below_max_delivery",
도메인=[j],설명="최대 전력 속도보다 낮은 배터리 공급 속도",
    )

battery_above_min_storage=수식(m,이름="배터리_above_min_storage",
도메인=[t],설명="음의 에너지 비율 이상의 배터리 저장(음의 전력으로 배터리를 충전하기 때문에)",
    )

battery_below_max_storage=수식(m,이름="battery_below_max_storage",
도메인=[t],설명="0 미만의 배터리 전달 합계(저장되지 않은 에너지를 전달할 수 없음)",
    )

external_power_upper_limit=수식(m,이름="external_power_upper_limit",
도메인=[j],설명="외부 그리드의 입력이 제한됩니다.",
    )

fulfill_load[j]= (
합계(i, gen_power[i, j])+배터리_전력[j]+external_grid_power[j]        ==load_demand[j]    )

gen_above_min_power[i, j]= (
gen_min_power_output[i]*gen_active[i, j]<=gen_power[i, j]    )

gen_below_max_power[i, j]= (
gen_power[i, j]<=gen_max_power_output[i]*gen_active[i, j]    )

    # j=0 -> j.lag(1) = 0이면 방정식이 깨지지 않는 경우,
    # 생성기는 시작 시에 음수 우변이 발생하므로 합계는 항상 위에 있습니다.
gen_above_min_down_time[i, j]=합계(t.여기서[(Ord(t)>=오드(j))&(Ord(t)<=(Ord(j)+gen_min_down_time[i]- 1))],        1 -gen_active[i, t],    ) >=gen_min_down_time[i]*(gen_active[i, j.지연(1)]-gen_active[i, j])
    # 그리고 첫 번째 단계에서 켜져 있는지 확인을 올바르게 시작합니다.
    # 최소 작동 시간 동안 켜져 있어야 합니다.
gen_above_min_up_time[i, j]=합계(t.여기서[(Ord(t)>=오드(j))&(Ord(t)<=(Ord(j)+gen_min_up_time[i]- 1))],gen_active[i, t],    ) >=gen_min_up_time[i]*(gen_active[i, j]-gen_active[i, j.지연(1)])
battery_above_min_delivery[j]= -battery_delivery_rate<=배터리_전력[j]
battery_below_max_delivery[j]=배터리_전력[j]<=battery_delivery_rate
배터리_above_min_storage[t]= -배터리_저장<=합계(j.어디에서[Ord(j)<=Ord(t)], 배터리_전력[j]    )

battery_below_max_storage[t]=합계(j.어디에서[Ord(j)<=Ord(t)], 배터리_전력[j])<= 0

external_power_upper_limit[j]=external_grid_power[j]<=max_input_external_grid
obj= (
합계(j,합계(i, gen_cost_per_unit[i]*gen_power[i, j]+gen_fixed_cost[i])            +cost_external_grid[j]*external_grid_power[j],        )
        +cost_bat_power*battery_delivery_rate        +cost_bat_energy*배터리_저장    )

    # 해결
베스=모델(m,이름="베스",
방정식=m.getEquations(),문제="MIP",
감각=감각.최소,목적=obj,    )

베스.해결(해결사="CPLEX",
출력=sys.stdout,옵션=옵션(equation_listing_limit=1,relative_optimality_gap=0),
    )

    if베스.solve_status아님 in[해결 상태.정상 완료,해결 상태.TerminatingBySolver,]또는베스.상태아님 in[모델상태.최적글로벌, 모델상태.정수]:        인쇄("입력 데이터에 대한 해결책이 없습니다.\n")
        올림 예외("실행 불가능합니다.")

if__name__== "__main__":메인()

모델 입력

몇 가지 기본 입력을 정의하는 것부터 시작하겠습니다. 세 개의 스칼라 매개변수로 시작하는 것을 볼 무료 슬롯 사이트으며, 각 매개변수에는 추가is_miro_input=참정의의 옵션:

# 배터리 매개변수
cost_bat_power=매개변수(m,"cost_bat_power", 기록=1, is_miro_input=사실입니다)
cost_bat_energy=매개변수(m,"cost_bat_energy", 기록=2, is_miro_input=)

# 부하 수요 및 외부 그리드
max_input_external_grid=매개변수(m,이름="max_input_external_grid",
기록=10,
is_miro_input=,
설명="매시간 외부 전력망에서 가져올 무료 슬롯 사이트는 최대 전력",
)

발전기 사양 및 일정 입력에는 몇 가지 추가 단계가 있습니다. 이 모델은 두 가지 세트에 의존합니다. 하나는 가능한 발전기용이고 다른 하나는 부하 수요를 충족해야 하는 시간용입니다. 이 세트는 고정되어 있지 않지만 입력의 일부여야 하므로 다음을 사용합니다.도메인 전달- 집합이 하나의 매개변수에 의해 암시적으로 정의되는 접근 방식입니다.

여러 매개변수가 이러한 세트에 의존하고 우리는 단일 정보 소스를 원하기 때문에 이를 무료 슬롯 사이트 애플리케이션의 단일 테이블로 결합해야 합니다(하나는 발전기 사양용, 다른 하나는 일정용). 이를 달성하기 위해 열 헤더에 대한 추가 세트를 정의합니다.


generator_spec_header=설정(m,이름="generator_spec_header",
기록=[        "cost_per_unit",
        "고정 비용",
        "min_power_output",
        "max_power_output",
        "min_up_time",
        "min_down_time",
],)

그런 다음 모든 관련 정보를 보유하는 매개변수를 생성합니다.

발전기_사양=매개변수(m,이름="발전기_사양",
도메인=[i, Generator_spec_header],도메인_전달=[사실입니다, 거짓],기록=generator_specations_input.녹아(id_vars="나", var_name="generator_spec_header"
    ),
is_miro_input=사실입니다,
is_miro_table=사실입니다,
설명="각 발전기의 사양",
)

알아두세요is_miro_input=참매개변수를 무료 슬롯 사이트 애플리케이션에 대한 입력으로 만드는 반면is_miro_table=참데이터를 표시합니다테이블 형식. 주요 내용은 다음과 같습니다domain_forwarding=[참, 거짓], 생성기의 설정 요소가 무료 슬롯 사이트 애플리케이션에서 나오도록 보장합니다(헤더 이름은 고정되어 있으므로거짓). 우리는 여전히 초기 데이터를 사용하여 이러한 사양을 채우지만 다음을 사용하여 변환합니다.녹아()두 열의 새로운 형식과 일치하도록:"나"그리고"generator_spec_header".

이제 집합의 도메인을 전달하고 있으므로i이 테이블을 통해 우리는 더 이상 해당 레코드를 지정하지 않습니다. 다음을 사용하는 모든 매개변수에도 동일하게 적용됩니다.i(예:gen_cost_per_unit). 대신, 새로운 결합 매개변수를 참조하여 이를 할당합니다.

i = 설정(m,이름="i",- 기록=generator_specations_input["i"],description="발전기",)

gen_cost_per_unit = 매개변수(m,name="gen_cost_per_unit",도메인=[i],- 기록=generator_specations_input[["i", "cost_per_unit"]],description="발전기 단위당 비용 i",  )

+ gen_cost_per_unit[i] = 발전기 사양[i, "cost_per_unit"]

다음에 의존하는 다른 매개변수에 동일한 패턴을 적용합니다.i. 마찬가지로 시간 종속 매개변수(예:load_demand그리고cost_external_grid), 우리는 이를 하나의 매개변수로 결합하고 동일한 수정을 가하여 설정된 시간에 대한 단일 정보 소스를 생성합니다.

입력이 주어지면 출력으로 이동합니다.

모델 출력

모델을 구현할 때 다음을 추가하여 변수를 출력으로 플래그 지정하는 것이 도움이 될 무료 슬롯 사이트습니다.is_miro_output=참. 문제를 해결한 후에는 계산된 변수 값을 즉시 볼 무료 슬롯 사이트으므로 나머지 모델 오류를 더 쉽게 찾을 무료 슬롯 사이트습니다.

gen_power=변수(m,이름="gen_power",
    유형="긍정적",
도메인=[i, j],설명="j 시간에 발전기 i에서 전력 공급",
is_miro_output=사실입니다,
)

일반적으로 모든 변수나 매개변수를 무료 슬롯 사이트 출력으로 지정할 수 있습니다. 모델을 구현할 때 간단히 모든 변수를 출력으로 정의하는 것이 합리적이므로 결과를 쉽게 시각화할 수 있습니다. 때로는 변수에 의존하는 출력으로 매개변수를 정의하는 것이 합리적입니다. 우리 모델의 간단한 예는 세 가지 비용 구성요소에 대한 전용 매개변수를 생성하여 무료 슬롯 사이트 애플리케이션에서 이러한 값을 직접 표시할 수 있도록 하는 것입니다.

total_cost_gen=매개변수(m,    "total_cost_gen",
is_miro_output=사실입니다,
설명="발전기의 총 비용",
)

total_cost_gen[...]=합계(j, Sum(i, gen_cost_per_unit[i]*gen_power.l[i, j]+gen_fixed_cost[i]))

우리는 다른 전원에 대해 이와 동일한 접근 방식을 적용하고 이를 결합합니다.

기타 전원에 대한 비용
total_cost_battery=매개변수(m,    "total_cost_battery",
is_miro_output=사실입니다,
설명="BESS의 총 비용",
)

total_cost_battery[...]= (
cost_bat_power*battery_delivery_rate.l+cost_bat_energy*배터리_저장.l)

total_cost_extern=매개변수(m,    "total_cost_extern",
is_miro_output=사실입니다,
설명="수입 전력의 총 비용",
)

total_cost_extern[...]=합계(j,cost_external_grid[j]*external_grid_power.l[j],)

total_cost=매개변수(m,    "total_cost",
is_miro_output=,
설명="부하 수요를 충족시키기 위한 총 비용",
)

total_cost[...]=total_cost_gen+total_cost_battery+total_cost_extern

또한 전력 변수와 부하 수요 입력을 단일 출력 매개변수로 결합하여 나중에 모든 전력 흐름의 합이 부하 수요를 충족하는 방법을 보여줍니다.

# 전력 출력
power_output_header=설정(m,이름="power_output_header",
기록=["배터리", "external_grid", "발전기", "load_demand"],)

report_output=매개변수(m,이름="report_output",
도메인=[j, power_output_header],설명="들어오는 전력 흐름의 최적 조합",
is_miro_output=사실입니다,
)

report_output[j,"발전기"]=합계(i, gen_power.l[i, j])report_output[j,"배터리"]=배터리_전력.l[j]report_output[j,"external_grid"]=external_grid_power.l[j]report_output[j,"load_demand"]=load_demand[j]

이제 무료 슬롯 사이트를 실행하여 최초의 완전한 대화형 모델링 애플리케이션을 볼 수 있습니다!

gamspy run 무료 슬롯 사이트 --path <path_to_your_MIRO_installation> --model <path_to_your_model>

무료 슬롯 사이트를 시작한 후 애플리케이션은 다음과 같아야 합니다:

입력 섹션

로그 파일을 사용한 효과적인 데이터 검증

마지막으로 데이터 검증에 대해 간략하게 설명하겠습니다. 이는 최적화 모델의 정확성과 신뢰성을 보장하는 데 중요합니다. 로그 파일은 입력 데이터의 일관성을 확인하는 데 중요하며 불일치에 대한 보고서를 생성하면 오류와 사용자 불만을 방지하는 데 도움이 됩니다. 여기서는 입력 값이 모두 음수가 아닌지 확인합니다. 효과적인 유효성 검사를 찾는 것이 어려울 무료 슬롯 사이트지만 실현 불가능성을 유발하는 제약 조건이나 값을 명확하게 식별하면 사용자 경험이 크게 향상될 무료 슬롯 사이트습니다.

무료 슬롯 사이트에는 사용자 정의 로그 파일을 생성할 수 있는 옵션이 있습니다. 그러나 우리는 GAMSPy를 사용하고 있기 때문에 stdout에 직접 쓰고 거기에 기록할 수도 있습니다. 그리고 여기서 지정된 내용을 따르면무료 슬롯 사이트 로그 구문, 여기서 잘못된 데이터는 무료 슬롯 사이트의 해당 입력 데이터 시트 바로 위에 강조 표시될 수 있습니다.

무료 슬롯 사이트가 잘못된 데이터가 있는 테이블로 직접 점프하기 위해 사용해야 하는 구문은 다음과 같습니다:

기호 이름:: 오류 메시지

입력 값의 부호를 간단하게 확인하는 방법을 직접 시도해 보세요. 모델 해결을 시도하기 전에 데이터의 유효성을 검사해야 한다는 점을 명심하세요. 검증에 실패하면 실패의 원인이 된 값을 지정하고 예외를 발생시킵니다. 이 경우에는 모델을 해결할 필요가 없습니다.

가능한 데이터 검증
no_negative_gen_spec=발전기_사양.기록[generator_specations.기록["값"]< 0]no_negative_load=load_demand.기록[load_demand.기록["값"]< 0]no_negative_cost=cost_external_grid.기록[cost_external_grid.기록["값"]< 0
]
인쇄(
    """------------------------------------\n데이터 검증 중\n------------------------------------\n"""
)
오류= 거짓

if 아님no_negative_gen_spec.비어 있음:    인쇄(
        "generator_specations:: 발전기 사양에는 음수 값이 허용되지 않습니다!\n"
    )
    for_, 행no_negative_gen_spec.iterrows():        인쇄(f'{행["나"]}음수 값이 있습니다.\n')
오류= 

if 아님no_negative_load.비어 있음:    인쇄(
        "timewise_load_demand_and_cost_external_grid_data:: 음수 부하 수요는 허용되지 않습니다!\n"
    )
    for_, 행inno_negative_load.iterrows():        인쇄(f'{행["j"]}부하 수요가 있습니다.\n')
오류= 

if 아님no_negative_cost.비어 있음:    인쇄(
        "timewise_load_demand_and_cost_external_grid_data:: 음수 비용은 허용되지 않습니다!\n"
    )
    for_, 행inno_negative_cost.iterrows():        인쇄(f'{행["j"]}외부 그리드 비용이 음수입니다.\n')
오류= 사실입니다

if오류:    인상 예외("데이터 오류가 감지되었습니다")
인쇄("데이터 확인\n")
입력 섹션
입력 섹션
완전히 업데이트된 GAMSPy 모델
가져오기 판다 as pd
가져오기 sys

from 감스파이 가져오기 (
컨테이너,별칭,수식,모델,매개변수,센스,설정,합계,변수,오드,옵션,모델상태,해결 상태,)


def 메인():m=컨테이너()
    # 생성기 매개변수
generator_specations_input=pd.데이터프레임([["gen0", 1.1, 220, 50, 100, 4, 2],["gen1", 1.3, 290, 80, 190, 4, 2],["gen2", 0.9, 200, 10, 70, 4, 2],],=[            "나",
            "cost_per_unit",
            "고정 비용",
            "min_power_output",
            "max_power_output",
            "min_up_time",
            "min_down_time",
],    )

    # 에너지 관리 시스템에 의해 충족되는 부하 수요
    # 비용 외부 그리드와 결합하여 시간 동안 하나의 진실 소스를 갖습니다(세트 j)
timewise_load_demand_and_cost_external_grid_input=pd.데이터프레임([["시간00", 200, 1.5],["hour01", 180, 1.0],["hour02", 170, 1.0],["hour03", 160, 1.0],["시간04", 150, 1.0],["시간05", 170, 1.0],["hour06", 190, 1.2],["시간07", 210, 1.8],["시간08", 290, 2.1],["시간09", 360, 1.9],["시간10", 370, 1.8],["시간11", 350, 1.6],["시간12", 310, 1.6],["시간13", 340, 1.6],["시간14", 390, 1.8],["시간15", 400, 1.9],["시간16", 420, 2.1],["시간17", 500, 3.0],["시간18", 440, 2.1],["시간19", 430, 1.9],["시간20", 420, 1.8],["시간21", 380, 1.6],["시간22", 340, 1.2],["시간23", 320, 1.2],],=["j", "load_demand", "cost_external_grid"],    )

    # 세트
i=설정(m,이름="나",
설명="발전기",
    )
j=설정(m,이름="j",
설명="시간",
    )
t=별칭(m, 이름="t", alias_with=j)
generator_spec_header=설정(m,이름="generator_spec_header",
기록=[            "cost_per_unit",
            "고정_비용",
            "min_power_output",
            "max_power_output",
            "min_up_time",
            "min_down_time",
],    )

timewise_header=설정(m, 이름="timewise_header", 기록=["load_demand", "cost_external_grid"]    )

    # 데이터
    # 생성기 매개변수
발전기_사양=매개변수(m,이름="generator_specations",
도메인=[i, Generator_spec_header],도메인_전달=[, 거짓],기록=generator_specations_input.녹아(id_vars="나", var_name="generator_spec_header"
        ),
is_miro_input=,
is_miro_table=,
설명="각 발전기의 사양",
    )

    # 방정식의 가독성을 높이기 위해 개별 열을 추출합니다.
    # 우리는 단일 정보 소스를 원하므로 무료 슬롯 사이트를 위해 이를 결합합니다.
gen_cost_per_unit=매개변수(m,이름="gen_cost_per_unit",
도메인=[i],설명="발전기 단위당 비용 i",
    )

gen_fixed_cost=매개변수(m, 이름="gen_fixed_cost", 도메인=[i], 설명="발전기 i의 고정 비용"
    )

gen_min_power_output=매개변수(m,이름="gen_min_power_output",
도메인=[i],설명="발전기 i의 최소 전력 출력",
    )

gen_max_power_output=매개변수(m,이름="gen_max_power_output",
도메인=[i],설명="발전기 i의 최대 전력 출력",
    )

gen_min_up_time=매개변수(m,이름="gen_min_up_time",
도메인=[i],설명="발전기 i의 최소 가동 시간",
    )

gen_min_down_time=매개변수(m,이름="gen_min_down_time",
도메인=[i],설명="발전기 i의 최소 정지 시간",
    )

gen_cost_per_unit[i]=발전기_사양[i,"cost_per_unit"]gen_fixed_cost[i]=발전기_사양[i,"고정_비용"]gen_min_power_output[i]=발전기_사양[i,"min_power_output"]gen_max_power_output[i]=발전기_사양[i,"max_power_output"]gen_min_up_time[i]=발전기_사양[i,"min_up_time"]gen_min_down_time[i]=발전기_사양[i,"min_down_time"]
    # 배터리 매개변수
cost_bat_power=매개변수(m,"cost_bat_power", 기록=1, is_miro_input=사실입니다)
cost_bat_energy=매개변수(m,"cost_bat_energy", 기록=2, is_miro_input=사실입니다)

    # 부하 수요 및 외부 그리드
timewise_load_demand_and_cost_external_grid_data=매개변수(m,이름="timewise_load_demand_and_cost_external_grid_data",
도메인=[j, timewise_header],도메인_전달=[, 거짓],기록=timewise_load_demand_and_cost_external_grid_input.녹아(id_vars="j", var_name="timewise_header"
        ),
is_miro_input=,
is_miro_table=사실입니다,
설명="외부 그리드의 부하 수요 및 비용에 대한 타임라인.",
    )

load_demand=매개변수(m, 이름="load_demand", 도메인=[j], 설명="j시간에 로드 수요"
    )

cost_external_grid=매개변수(m,이름="cost_external_grid",
도메인=[j],설명="j시간의 외부 그리드 비용",
    )

load_demand[j]=timewise_load_demand_and_cost_external_grid_data[j,"load_demand"]cost_external_grid[j]=timewise_load_demand_and_cost_external_grid_data[j,"cost_external_grid"
]
max_input_external_grid=매개변수(m,이름="max_input_external_grid",
기록=10,
is_miro_input=,
설명="매시간 외부 전력망에서 가져올 무료 슬롯 사이트는 최대 전력",
    )

no_negative_gen_spec=발전기_사양.기록[발전기_사양.기록["값"]< 0
]no_negative_load=load_demand.기록[load_demand.기록["값"]< 0]no_negative_cost=cost_external_grid.기록[cost_external_grid.기록["값"]< 0
]
    인쇄(
        """------------------------------------\n데이터 검증 중\n------------------------------------\n"""
    )
오류= 거짓

    if 아님no_negative_gen_spec.비어 있음:        인쇄(
            "generator_specations:: 발전기 사양에는 음수 값이 허용되지 않습니다!\n"
        )
        for_, 행no_negative_gen_spec.iterrows():            인쇄(f'{행["나"]}음수 값이 있습니다.\n')
오류= 

    if 아님no_negative_load.비어 있음:        인쇄(
            "timewise_load_demand_and_cost_external_grid_data:: 음수 부하 수요는 허용되지 않습니다!\n"
        )
        for_, 행no_negative_load.iterrows():            인쇄(f'{행["j"]}부하 수요가 음수입니다.\n')
오류= 

    if 아님no_negative_cost.비어 있음:        인쇄(
            "timewise_load_demand_and_cost_external_grid_data:: 음수 비용은 허용되지 않습니다!\n"
        )
        for_, 행inno_negative_cost.iterrows():            인쇄(f'{행["j"]}외부 그리드 비용이 음수입니다.\n')
오류= 

    if오류:        올림 예외("데이터 오류가 감지되었습니다")
    인쇄("데이터 확인\n")

    # 변수
    # 생성기
gen_power=변수(m,이름="gen_power",
        유형="긍정적",
도메인=[i, j],설명="j 시간에 발전기 i에서 전력 공급",
is_miro_output=사실입니다,
    )

gen_active=변수(m,이름="gen_active",
        유형="바이너리",
도메인=[i, j],설명="i 발전기가 j 시간에 활성화되어 있습니까?",
    )

    # 배터리
배터리_전력=변수(m,이름="배터리_전력",
도메인=[j],설명="j 시간에 배터리에서 충전 또는 방전된 전력",
is_miro_output=,
    )

battery_delivery_rate=변수(m,이름="battery_delivery_rate",
설명="배터리 에너지 시스템의 전력(전달) 속도",
is_miro_output=,
    )

배터리_저장=변수(m,이름="배터리_저장",
설명="배터리 에너지 시스템의 에너지(저장) 속도",
is_miro_output=,
    )

    # 외부 그리드
external_grid_power=변수(m,이름="external_grid_power",
        유형="긍정적",
도메인=[j],설명="j 시간에 외부 전력망에서 전력을 가져왔습니다",
is_miro_output=사실입니다,
    )

    # 방정식
fulfill_load=수식(m,이름="fulfill_load",
도메인=[j],설명="부하 균형은 j시간마다 충족되어야 합니다.",
    )

gen_above_min_power=수식(m,이름="gen_above_min_power",
도메인=[i, j],설명="발전기 전력은 최소 출력 이상이어야 합니다",
    )

gen_below_max_power=수식(m,이름="gen_below_max_power",
도메인=[i, j],설명="발전기 전력은 최대 출력보다 낮아야 합니다",
    )

gen_above_min_down_time=수식(m,이름="gen_above_min_down_time",
도메인=[i, j],설명="발전기 가동 중지 시간은 최소 가동 중지 시간 이상이어야 합니다.",
    )

gen_above_min_up_time=수식(m,이름="gen_above_min_up_time",
도메인=[i, j],설명="발전기 가동 시간은 최소 가동 시간 이상이어야 합니다",
    )

battery_above_min_delivery=수식(m,이름="battery_above_min_delivery",
도메인=[j],설명="최소 전력량을 초과하는 배터리 공급 속도(충전 속도)",
    )

battery_below_max_delivery=수식(m,이름="battery_below_max_delivery",
도메인=[j],설명="최대 전력 속도보다 낮은 배터리 공급 속도",
    )

battery_above_min_storage=수식(m,이름="battery_above_min_storage",
도메인=[t],설명="음의 에너지 비율 이상의 배터리 저장(음의 전력이 배터리를 충전하기 때문에)",
    )

battery_below_max_storage=수식(m,이름="battery_below_max_storage",
도메인=[t],설명="0 미만의 배터리 전달 합계(저장되지 않은 에너지는 전달할 수 없음)",
    )

external_power_upper_limit=수식(m,이름="external_power_upper_limit",
도메인=[j],설명=" 외부 그리드의 입력이 제한됩니다.",
    )

fulfill_load[j]= (
합계(i, gen_power[i, j])+배터리_전력[j]+external_grid_power[j]        ==load_demand[j]    )

gen_above_min_power[i, j]= (
gen_min_power_output[i]*gen_active[i, j]<=gen_power[i, j]    )

gen_below_max_power[i, j]= (
gen_power[i, j]<=gen_max_power_output[i]*gen_active[i, j]    )

    # j=0 -> j.lag(1) = 0이면 방정식이 깨지지 않는 경우,
    # 생성기는 시작 시에 음수 우변이 발생하므로 합계는 항상 위에 있습니다.
gen_above_min_down_time[i, j]=합계(t.여기서[(Ord(t)>=오드(j))&(Ord(t)<=(Ord(j)+gen_min_down_time[i]- 1))],        1 -gen_active[i, t],    ) >=gen_min_down_time[i]*(gen_active[i, j.지연(1)]-gen_active[i, j])
    # 그리고 첫 번째 단계에서 켜져 있는지 확인을 올바르게 시작합니다.
    # 최소 작동 시간 동안 켜져 있어야 합니다.
gen_above_min_up_time[i, j]=합계(t.여기서[(Ord(t)>=오드(j))&(Ord(t)<=(Ord(j)+gen_min_up_time[i]- 1))],gen_active[i, t],    ) >=gen_min_up_time[i]*(gen_active[i, j]-gen_active[i, j.지연(1)])
battery_above_min_delivery[j]= -battery_delivery_rate<=배터리_전력[j]
battery_below_max_delivery[j]=배터리_전력[j]<=battery_delivery_rate
battery_above_min_storage[t]= -배터리_저장<=합계(j.여기서[Ord(j)<=Ord(t)], 배터리_전력[j]    )

battery_below_max_storage[t]=합계(j.여기서[Ord(j)<=Ord(t)], 배터리_전력[j])<= 0

external_power_upper_limit[j]=external_grid_power[j]<=max_input_external_grid
obj= (
합계(j,합계(i, gen_cost_per_unit[i]*gen_power[i, j]+gen_fixed_cost[i])            +cost_external_grid[j]*external_grid_power[j],        )
        +cost_bat_power*battery_delivery_rate        +cost_bat_energy*배터리_저장    )

    # 해결
베스=모델(m,이름="베스",
방정식=m.getEquations(),문제="MIP",
감각=감각.최소,목적=obj,    )

베스.해결(해결사="CPLEX",
출력=sys.stdout,옵션=옵션(equation_listing_limit=1,relative_optimality_gap=0),
    )

    if베스.solve_status아님 in[해결 상태.정상 완료,해결 상태.TerminatingBySolver,]또는베스.상태아님 in[모델상태.최적글로벌, 모델상태.정수]:        인쇄("입력 데이터에 대한 해결책이 없습니다.\n")
        올림 예외("실행 불가능합니다.")

    # 출력 데이터 추출

    # 전력 출력
power_output_header=설정(m,이름="power_output_header",
기록=["배터리", "external_grid", "발전기", "load_demand"],    )

report_output=매개변수(m,이름="report_output",
도메인=[j, power_output_header],설명="들어오는 전력 흐름의 최적 조합",
is_miro_output=,
    )

report_output[j,"발전기"]=합계(i, gen_power.l[i, j])report_output[j,"배터리"]=배터리_전력.l[j]report_output[j,"external_grid"]=external_grid_power.l[j]report_output[j,"load_demand"]=load_demand[j]
    # 비용
total_cost_gen=매개변수(m,        "total_cost_gen",
is_miro_output=사실입니다,
설명="발전기의 총 비용",
    )

total_cost_gen[...]=합계(j, Sum(i, gen_cost_per_unit[i]*gen_power.l[i, j]+gen_fixed_cost[i])    )

total_cost_battery=매개변수(m,        "total_cost_battery",
is_miro_output=,
설명="BESS의 총 비용",
    )

total_cost_battery[...]= (
cost_bat_power*battery_delivery_rate.l+cost_bat_energy*배터리_저장.l    )

total_cost_extern=매개변수(m,        "total_cost_extern",
is_miro_output=,
설명="수입 전력의 총 비용",
    )

total_cost_extern[...]=합계(j,cost_external_grid[j]*external_grid_power.l[j],    )

total_cost=매개변수(m,        "total_cost",
is_miro_output=사실입니다,
설명="부하 수요를 충족하기 위한 총 비용",
    )

total_cost[...]=total_cost_gen+total_cost_battery+total_cost_extern
if__name__== "__main__":메인()

기본 애플리케이션 - 신속한 프로토타이핑

이제 첫 번째 무료 슬롯 사이트 애플리케이션이 있으므로 즉시 사용할 수 있는 상호 작용 유형을 살펴보겠습니다.

입력

처음에는 입력 매개변수가 비어 있습니다. 클릭하면데이터 로드, GAMSPy 코드의 records 옵션으로 정의된 기본값을 로드할 무료 슬롯 사이트습니다.

입력 매개변수가 올바르게 설정되면 수정한 다음 클릭할 무료 슬롯 사이트습니다.모델 해결새 입력 값에 대한 솔루션을 계산합니다.

해결하기 전에도 데이터를 시각화하여 마이너스 부하 수요(발생해서는 안 되는 일) 또는 하루 종일 예상과 일치하지 않는 비용 값과 같은 불일치를 파악하는 것이 유용할 무료 슬롯 사이트습니다. 이 데이터를 그래픽으로 보려면 오른쪽 상단에서 를 클릭하여 차트 보기를 전환하면 됩니다.아이콘. 여기에서 데이터를 필터링, 집계 및 피벗할 무료 슬롯 사이트습니다. 또한 다음을 통해 직접 다양한 차트 유형을 사용할 수도 있습니다.피벗 테이블 .

이 예에서는 헤더를 피벗하고 선 그래프를 선택했습니다. 왜냐하면load_demand그리고cost_external_grid다름, 처음에는 것처럼 보임cost_external_grid0이 아니더라도 0입니다. 이를 명확히 하기 위해 다른 배율의 두 번째 y축을 추가합니다.

  1. 디스플레이 유형을 다음으로 전환선형 차트.
  2. 클릭새 보기를 추가하려면 아이콘을 클릭하세요.
  3. 에서두 번째 축탭에서 추가 y축을 사용해야 하는 계열을 선택하세요.
  4. (선택사항) 축의 제목과 레이블을 추가합니다.
  5. 보기를 저장하세요.
  6. 다음을 누르세요활성화 아이콘프레젠테이션 모드 .

당신은 다음과 같이 끝나야 합니다:

입력 섹션

출력

모델을 구현할 때 출력이 입력보다 더 흥미로운 경우가 많으므로 여기서 무엇을 할 무료 슬롯 사이트는지 살펴보겠습니다.

무료 슬롯 사이트는 스칼라 출력을 스칼라 매개변수와 스칼라 변수/방정식으로 분리합니다.

입력 섹션
입력 섹션

보시다시피, 스칼라 변수의 경우 스칼라 값(레벨) 뿐만 아니라한계, 하위, 상위그리고규모. 그리고 스칼라 매개변수에는 이러한 속성이 없으므로 별도로 처리됩니다.

다차원 출력 변수의 경우 다시 피벗 도구를 사용할 무료 슬롯 사이트습니다. 예를 들어, 각 발전기가 특정 시간에 공급하는 전력량을 확인하고 싶다고 가정해 보겠습니다. 발전기의 전력 값이 포함된 출력 변수를 열고, 발전기별로 피벗하고, '레벨' 값으로 필터링할 무료 슬롯 사이트습니다. 다음으로 다음을 선택합니다.누적 막대 차트옵션, 이 보기를 제공합니다.

입력 섹션

우리는 그것을 볼 무료 슬롯 사이트습니다gen1가장 비싼 발전기입니다. 처음에는 조금 사용하다가 최소 사용 시간인 4시간 후에 꺼집니다. 그리고 4시간이 더 지나면 다시 켜지며, 이는 최소 가동 중지 시간도 충족합니다. 보시다시피,gen0단가와 고정비 모두 가장 저렴하므로 항상 최대 전력을 발휘합니다. 전체적으로 우리는 최소 가동 시간 및 가동 중지 시간 제약 조건이 충족되고 각 활성 발전기가 전력 제한 내에 유지된다는 것을 알 무료 슬롯 사이트습니다. 이러한 제약 조건 중 하나라도 위반되면 모델의 어느 부분을 다시 방문해야 할지 정확히 알 무료 슬롯 사이트습니다.

다른 예를 살펴보겠습니다. 부하 수요가 실제로 충족되는지와 각 소스가 매 시간마다 어떻게 기여하는지 확인할 무료 슬롯 사이트도록 주어진 부하 수요와 모든 전력 값을 단일 매개변수로 결합했다는 점을 기억하십시오. 우리가 a를 선택했다면누적 막대 차트, 부하 수요를 전력원의 합과 쉽게 비교할 수 없습니다. 대신에 우리는:

  1. 선택누적 막대 차트.
  2. 클릭새 보기를 추가하려면 아이콘을 클릭하세요.
  3. 에서콤보 차트탭에서 부하 수요가 다음과 같이 표시되도록 지정합니다.라인누적 막대에서 제외됩니다.
  4. 보기를 저장하세요.

결과는 다음과 같아야 합니다:

입력 섹션

여기서 우리는 BESS가 충전되는 동안을 제외하고는 부하 수요가 항상 충족된다는 것을 즉시 확인할 무료 슬롯 사이트습니다. 이는 파란색 막대의 음수 부분으로 표시됩니다. 이는 제약 조건이 올바르게 작동하고 있다는 또 다른 좋은 표시입니다.

우리는 배터리 전원이나 외부 그리드 전원에 대해 유사한 시각화를 생성하여 제약 조건도 충족되도록 할 수 있습니다. 이제 무료 슬롯 사이트의 강력한 피벗 도구와 이를 사용하여 모델 구현을 즉시 확인하는 방법을 더 잘 이해하게 될 것입니다.

주요 내용

  • 대화형 입력 및 출력: 매개변수를 다음으로 표시is_miro_input또는is_miro_output데이터 입력 및 실시간 피드백을 위한 동적 필드를 활성화하여 유연성과 디버깅을 향상합니다.
  • 신속한 프로토타이핑: 비용과 같은 중요한 정보를 요약하기 위해 변수를 기반으로 출력 매개변수를 정의합니다. 그런 다음 출력을 시각적으로 검사하여 문제를 조기에 발견하세요!
  • 데이터 검증 및 오류 보고: 로그 파일 및 사용자 정의 오류 메시지(무료 슬롯 사이트 구문을 통해)를 통해 입력 일관성을 보장하면 오류를 조기에 포착하는 데 도움이 되며 입력 데이터 시트에서 직접 불일치를 강조 표시하여 사용자 경험을 향상시킵니다.
  • 시각적 검증: 무료 슬롯 사이트의 피벗 테이블과 차트를 사용하면 제약 조건을 빠르게 확인할 수 있습니다.
  • 논리적 통찰력: 예를 들어 누적 막대 또는 선 그래프를 사용하여 수요가 충족되는지 또는 어떤 발전기 조합이 가장 저렴한지 보여줍니다.

이제 첫 번째 무료 슬롯 사이트 애플리케이션이 있고 최적화 모델을 더 잘 이해했으므로 다음 부분에서는 코드를 작성하지 않고도 애플리케이션을 사용자 정의할 수 있는 구성 모드를 살펴보겠습니다!