슬롯 사이트gms : 농부의 문제 - 확률론적

설명

이 모델은 농부가 할당 방법을 결정하는 데 도움이 됩니다.
그의 땅. 수익률은 불확실합니다.

Birge, R 및 Louveaux, FV, 슬롯 사이트론적 프로그래밍 소개.
스프링거, 1997.

소형 슬롯 사이트 유형 :SP


카테고리 : 슬롯 사이트 EMP 라이브러리


메인 파일 : 슬롯 사이트gms

$title 농부의 문제 - 확률론적 (FARMSP,SEQ=73)

$onText

이 모델은 농부가 할당 방법을 결정하는 데 도움이 됩니다.
그의 땅. 수익률은 불확실합니다.

Birge, R 및 Louveaux, FV, 확률론적 프로그래밍 소개.
스프링거, 1997.

$offText

세트 작물/밀, 옥수수, 사탕무/
    데이터 테이블의 ch 헤더 /
           에이커당 톤 단위의 수확량
           비용 식물비용(에이커당 달러)
           price 작물 종자 구매 가격(톤당 달러)
           minreq 소에게 먹이를 주기 위한 작물의 최소 요구량(톤) /
별칭(c,자르기);

테이블 cd(crop,ch) 자르기 데이터
           수율 비용 price minreq
밀 2.5 150 238 200
옥수수 3 230 210 240
사탕무 20 260
;

매개변수
   yf 항복 계수 / 1 /
   토지 이용 가능한 토지(에이커) /500/;

$onText
* 무엇을 해야할지 명확하지 않습니다. 그래서 우리는 EMP를 합니다!!!
확률적 매개변수/랜덤 변수
    yf 항복 계수 / 1 /;
r 실현 / 이하, 평균, 이상 /을 설정합니다.

테이블 yfdistrib(r,*)
        가치 문제
0.8 이하 [1/4]
평균 1 [1/2]
1.2 이상 [1/4];
옵션 yf%yfdistrib;
yf.stage = 2;
yf.stage(t) = ord(t)+1;
$offText

순차 가격 곡선 세그먼트 설정 / s1*s2 /;
테이블 가격곡선(작물,순서,*) 톤당 달러
              가격은 어때요?
밀.s1 170inf
corn.s1 150인치
sugarbeets.s1 36 6000
sugarbeets.s2 10인치
;
pc(crop,seq) 관련 세그먼트를 설정합니다. 옵션개<가격곡선;

오류 설정PC(작물) 가격 곡선이 오목하지 않습니다.
errorPC(c) = smin(pcs(c,seq), 가격곡선(c,seq,'가격')-가격곡선(c,seq+1,'가격'))<0;
중단$카드(errorPC) errorPC;

변수
   x(c) 에이커의 땅에 심은 작물
   w(c,seq) 비용 곡선 부분에서 판매된 작물(톤)
   y(c) 톤 단위로 구매한 작물
   이익 목적 변수(달러);
양의 변수 x,w,y;

방정식
  이익 정의 목적 함수
  토지 이용 용량
  bal(c) 작물 균형;

이익def.. 이익 =e= sum(pcs, w(pcs)*pricecurve(pcs,'price'))
                        - sum(c, cd(c,'비용')*x(c) + cd(c,'pprice')*y(c));

토지이용.. sum(c, x(c)) =l= 토지;

bal(c).. yf*cd(c,'수율')*x(c) + y(c) - sum(pcs(c,seq), w(pcs)) =g= cd(c,'minreq');

* 구매가격이 없는 작물은 구매 불가
y.fx(c)$(cd(c,'pprice')=0) = 0;
w.up(pcs) = 가격곡선(pcs,'ub');

모델 farm_emp /all/;

파일 emp / '%emp.info%' /; put emp '* 문제 %슬롯 사이트i%'/;
$onPut
randvar yf 이산 0.25 0.8
                    0.50 1.0
                    0.25 1.2

2단계 yf y w 균형 이익
$offPut
putclose emp;

s 시나리오 설정 / s1*s3 /;
매개변수
    srep(s,*) 시나리오 속성 / #s.prob 0 /
    s_yf(s) 시나리오별 항복 계수 구현
    s_profit(s) 시나리오별 이익
    s_w(s,c,seq) 시나리오별 비용 곡선 세그먼트에서 판매된 작물(톤)
    s_y(s,c) 시나리오별로 톤 단위로 구매한 작물;

dict/s .scenario를 설정하세요.''
           '' .opt.     srep
           yf.randvar. s_yf
           이익 수준.   s_profit
           w.레벨.   s_w
           y.레벨.   s_y /;

$set EMPSOLVER %슬롯 사이트emp%
$if x%EMPSOLVER% == x $set EMPSOLVER de

이익을 극대화하는 emp 시나리오 dict를 사용하여 farm_emp를 해결합니다.

디스플레이 담당자;

$설정되지 않은 경우 DEDICT $exit

$sTitle DE에서 생성된 모델에 대한 사전 생성

노드 설정 / n1*n4 /;
옵션 emp=de; farm_emp.optfile = 1;
파일 fdeopt / de.opt /; putclose fdeopt 'deDict farm_dict.txt' / '하위 해결사 변환';

이익을 극대화하는 emp 시나리오 dict를 사용하여 farm_emp를 해결합니다.
Execute.checkErrorLevel 'rm -rf 스크래치디렉터리 && mkdir 스크래치디렉터리 && 슬롯 사이트 슬롯 사이트gms lo=%슬롯 사이트lo% scrdir=scratchdir';

extraUel / '', evobj, defevobj, defev,
                   바린드, 데프바린드, 데프바세타,
                   cvar, defcvar, cvardev, defcvardev, cvartarget, defcvartarget,
                   cvarobjdev, defcvarobjdev,
                   varcvarobj, varcvarind, defvarcvarind, defvarcvartheta /;
방정식profitdef_de(노드), landuse_de(노드), bal_de(c,노드), xequ(*,*,*);
변수 x_de(c,노드), w_de(c,seq,노드), y_de(c,노드),profit_de(노드), yf_var_de(노드), xvar(*,*,*);

임베디드 코드 Python:
슬롯 사이트core.gdx에서 가져오기 *
수입 OS
슬롯 사이트debug = 1
def write_record(gdx, 라벨, 값, 값):
    vals[0] = float(값)
    rc = gdxDataWriteStr(gdx, [레이블], vals)
    rc 주장 == 1, f"gdxDataWriteStr (모델) 레이블 실패"

def write_vesyms(gdx, xve_name, VE, XVE, uels, node_start, Syms, 키, vals):
    last_sym_id = -1
    값[0] = 부동소수점(1)
    VE의 5개:
        그렇지 않은 경우 int(ve[0]) == last_sym_id:
            last_sym_id == -1이 아닌 경우:
                rc = gdxDataWriteDone(gdx)
                rc 주장 == 1, f"gdxDataWriteDone syms[last_sym_id] 실패"
            last_sym_id = int(ve[0])
            rc = gdxDataWriteRawStart(gdx, Syms[last_sym_id]+'_de', "", len(ve)-1, GMS_DT_PAR , 0)
            rc 주장 == 1, f"gdxDataWriteRawStart syms[last_sym_id] 실패"
        for i,k in enumerate(ve[1:]):
            키[i] = int(k)+1
        키[len(ve)-2] += node_start # 노드 uel은 항상 마지막입니다.
        rc = gdxDataWriteRaw(gdx, 키, 값)
        rc 주장 == 1, f"gdxDataWriteRaw syms[last_sym_id] 실패"
    rc = gdxDataWriteDone(gdx)
    rc 주장 == 1, f"gdxDataWriteDone syms[last_sym_id] 실패"
    rc = gdxDataWriteStrStart(gdx, xve_name, "", 3, GMS_DT_PAR , 0)
    rc 주장 == 1, f"gdxDataWriteStrStart (xve_name) 실패"
    XVE의 xve용:
        l = [xve[0],'','']
        len(xve)>1인 경우: l[1] = uels[int(xve[1])]
        len(xve)>2인 경우: l[2] = uels[int(xve[2])]
        rc = gdxDataWriteStr(gdx, l, vals)
        rc 주장 == 1, f"gdxDataWriteStr (xve_name) 실패"
    rc = gdxDataWriteDone(gdx)
    rc 주장 == 1, f"gdxDataWriteDone (xve_name) 실패"

open('farm_dict.txt')을 f로 사용:
    nuel, nsym, xuels = [f.readline().split()의 s에 대한 int(s)]
    uels = [ f.readline().strip() for i in range(nuel) ]
    Syms = [ f.readline().strip() for i in range(nsym) ]
    에쿠스 = []
    변수 = []
    xequs = []
    xvars = []
    ttllbk = 0
    True인 동안:
        라인 = f.readline().strip()
        줄이 아닌 경우: 중단
        라인[0:2] == 'EX'인 경우:
            e = 라인.분할()[1:]
            ttllbk += 3
            xequs.append(e)
        elif 라인[0] == 'E':
            e = line.strip().split()[1:]
            ttlblk += len(e)-1
            equs.append(e)
        elif 라인[0:2] == 'VX':
            v = line.strip().split()[1:]
            ttllbk += 3
            xvars.append(v)
        elif line[0] == 'V': # V 또는 VR일 수 있습니다.
            v = line.strip().split()[1:]
            ttlblk += len(v)-1
            vars.append(v)
        그 외:
            raise Exception(f'알 수 없는 라인 코드 >line<')

    gdxHandle = new_gdxHandle_tp()
    값 = doubleArray(5)
    키 = intArray(20)
    node_start = uels.index('n1')
    rc, msg = gdxCreate(gdxHandle, GMS_SSSIZE)
    RC가 아닌 경우:
        예외 발생(msg)
    rc = gdxOpenWrite(gdxHandle, os.path.join("scratchdir","gamsdict.%슬롯 사이트scrExt%"), "DE 사전")[0]
    rc 주장 == 1, "gdxOpenWrite 실패"
    rc = gdxUELRegisterMapStart(gdxHandle)
    rc 주장 == 1, "gdxUELRegisterMapStart 실패"
    unr의 경우, 열거된 u(uels):
       rc = gdxUELRegisterMap(gdxHandle, unr+1, u)
       rc 주장 == 1, "gdxUELRegisterMap 실패"
    rc = gdxUELRegisterDone(gdxHandle)
    rc 주장 == 1, "gdxUELRegisterDone 실패"
    # 기본 카운트
    rc = gdxDataWriteStrStart(gdxHandle, "모델", "기본 개수", 1, GMS_DT_PAR , 0)
    rc 주장 == 1, "gdxDataWriteStrStart(모델) 실패"
    write_record(gdxHandle, 'ttlblk', ttlblk, vals)
    write_record(gdxHandle, 'mincolcnt', len(vars)+len(xvars), vals)
    write_record(gdxHandle, 'minrowcnt', len(equs)+len(xequs), vals)
    rc = gdxDataWriteDone(gdxHandle)
    rc 주장 == 1, "gdxDataWriteDone(모델) 실패"
    # 인용된 uels, gmscr에는 필요하지 않음(soution + dict -> GDX 포인트 파일)
    rc = gdxDataWriteStrStart(gdxHandle, "display", "uels 및 해당 따옴표", 1, GMS_DT_PAR , 0)
    Assert rc == 1, "gdxDataWriteStrStart(디스플레이) 실패"
    rc = gdxDataWriteDone(gdxHandle)
    rc 주장 == 1, "gdxDataWriteDone(디스플레이) 실패"
    # 이제 행을 작성합니다
    write_vesyms(gdxHandle, 'XEQU', equs, xequs, uels, node_start, Syms, 키, vals)
    # 이제 칼럼을 작성하세요
    write_vesyms(gdxHandle, 'XVAR', vars, xvars, uels, node_start, Syms, 키, vals)
    rc = gdxClose(gdxHandle)
    rc == 0, "gdxClose 실패" 주장
    gdxFree(gdx핸들)
endEmbeddedCode
* gmscr 도구는 gamssolu.dat(벡터 형식의 솔루션)와 사전(gamsdict.dat)을 가져와 GDX 포인트 파일 gmsgrid.gdx를 생성합니다.
$if %system.filesys% == UNIX Execution.checkErrorLevel 'gmscr_ux.out scrapdir%system.dirsep%gamscntr.%슬롯 사이트scrExt%';
$if not %system.filesys% == UNIX Execution.checkErrorLevel 'gmscr_nx.exe 스크래치디렉터%system.dirsep%gamscntr.%슬롯 사이트scrExt%';
Execute_loadpoint 'scratchdir%system.dirsep%gmsgrid.gdx',
    이익def_de, landuse_de, bal_de, xequ, x_de, w_de, y_de, 이익_de, yf_var_de, xvar;
이익def_de.l, landuse_de.m, bal_de.m, xequ.l을 표시합니다.
x_de.l, w_de.l, y_de.l,profit_de.l, yf_var_de.l, xvar.l을 표시합니다.