로드 중...
검색 중...
일치하는 항목 없음
transport8.py
이 파일의 문서로 이동하세요.
1
9
10가져오기sys
11에서스레딩가져오기잠금, 스레드
12from게임가져오기GamsWorkspace, GamsModifier
13
14GAMS_MODEL ="""
15설정
16i '통조림 공장' / 시애틀, 샌디에고 /
17j 'markets' / 뉴욕, 시카고, 토피카 /;
18
19매개변수
20a(i) '경우에 따른 식물 i의 용량'
21/시애틀 350
22샌디에고 600 /
23
24b(j) '경우에 따라 시장 j의 수요'
25/ 뉴욕 325
26시카고 300
27토페카 275 /;
28
29테이블 d(i,j) '거리(천 마일)'
30뉴욕 시카고 토피카
31시애틀 2.5 1.7 1.8
32산디에고 2.5 1.8 1.4;
33
34스칼라
35f '1,000마일당 케이스당 운임(달러)' / 90 /
36bmult '수요 승수' / 1 /;
37
38매개변수 c(i,j) '케이스당 수천 달러의 운송 비용';
39c(i,j) = f*d(i,j)/1000;
40
41변수
42x(i,j) '케이스의 배송 수량'
43z '총 운송 비용(수천 달러)';
44
45양수 변수 x;
46
47수식
48비용 '목적 함수 정의'
49supply(i) '공장 i의 공급 제한을 준수하세요'
50demand(j) '시장 j의 수요를 충족';
51
52비용.. z =e= sum((i,j), c(i,j)*x(i,j));
53
54공급(i).. 합계(j, x(i,j)) =l= a(i);
55
56수요(j).. sum(i, x(i,j)) =g= bmult*b(j);
57
58모델 전송 /all/;
59"""
60
61
62defscen_solve(체크포인트, bmult_list, list_lock, io_lock):
63list_lock.acquire()
64mi = checkpoint.add_modelinstance()
65list_lock.release()
66bmult = mi.sync_db.add_parameter("bmult", 0,"수요 승수")
67opt = ws.add_options()
68opt.all_model_types ="복합체"
69
70 # GamsModelInstance를 인스턴스화하고 모델 정의와 GamsModifier를 전달하여 bmult 변경 가능을 선언
71mi.instantiate("운송은 lp min z를 사용합니다", GamsModifier(bmult), opt)
72bmult.add_record().value = 1.0
73
74 그동안 사실입니다:
75 # 생성 시 다른 스레드에 전달하는 대신 큐에서 bmult 값을 동적으로 가져옵니다.
76list_lock.acquire()
77 if 아님bmult_list:
78list_lock.release()
79 반환
80b = bmult_list.pop()
81list_lock.release()
82bmult.first_record().value = b
83mi.solve()
84
85 # 보고서 정보가 엉망이 되는 것을 방지하기 위해 출력을 중요한 섹션으로 만들어야 합니다.
86io_lock.acquire()
87인쇄(f"시나리오 bmult=b:")
88인쇄(f" 모델 상태: mi.model_status")
89인쇄(f" 해결 상태: mi.solver_status")
90인쇄(f" Obj: mi.sync_db['z'].first_record().level")
91io_lock.release()
92
93
94if__name__ =="__main__":
95sys_dir = sys.argv[1]iflen(sys.argv) > 1그밖에 없음
96work_dir = sys.argv[2]iflen(sys.argv) > 2그밖에 없음
97ws = GamsWorkspace(system_directory=sys_dir,working_directory=work_dir)
98
99cp = ws.add_checkpoint()
100
101 # GamsJob을 실행하여 GamsCheckpoint를 초기화합니다.
102작업 = ws.add_job_from_string(GAMS_MODEL)
103job.run(체크포인트=cp)
104
105bmult_list = [1.3, 1.2, 1.1, 1.0, 0.9, 0.8, 0.7, 0.6]
106
107 # 여러 모델 인스턴스를 병렬로 해결
108list_lock = 잠금()
109io_lock = 잠금()
110
111 # 2개의 스레드 시작
112nr_workers = 2
113스레드 =
114 fori범위(nr_workers):
115스레드[i] = 스레드(
116target=scen_solve, args=(cp, bmult_list, list_lock, io_lock)
117 )
118스레드[i].start()
119 fori범위(nr_workers):
120스레드[i].join()