로드 중...
검색 중...
일치하는 항목 없음
transport8a.py
이 파일의 문서로 이동하세요.
1
8
9가져오기os
10가져오기sys
11from게임가져오기GamsWorkspace, GamsModifier
12from다중 처리가져오기잠금, 프로세스, 대기열
13
14GAMS_MODEL ="""
15세트
16i 통조림 공장 / 시애틀, 샌디에고 /
17j 마켓 / 뉴욕, 시카고, 토피카 / ;
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스칼라 f 화물(1,000마일당 케이스당 달러) /90/ ;
35스칼라 bmult 수요 승수 /1/;
36
37매개변수 c(i,j) 운송 비용(케이스당 수천 달러) ;
38c(i,j) = f * d(i,j) / 1000 ;
39
40변수
41x(i,j) 케이스의 배송 수량
42z 총 운송 비용(천 달러) ;
43
44양수 변수 x ;
45
46수식
47비용 정의 목적 함수
48공급(i) 공장 i의 공급 제한을 준수합니다.
49수요(j)는 시장 j의 수요를 충족합니다. ;
50
51비용 .. z =e= sum((i,j), c(i,j)*x(i,j)) ;
52
53공급(i) .. 합계(j, x(i,j)) =l= a(i) ;
54
55수요(j) .. sum(i, x(i,j)) =g= bmult*b(j) ;
56
57모델 전송 /all/ ;
58"""
59
60
61defscen_solve(cp_file, bmult_queue, queue_lock, io_lock):
62ws = GamsWorkspace()
63cp = ws.add_checkpoint(cp_file)
64mi = cp.add_modelinstance()
65bmult = mi.sync_db.add_parameter("bmult", 0,"수요 승수")
66opt = ws.add_options()
67opt.all_model_types ="복합체"
68
69 # GAMSModelInstance를 인스턴스화하고 모델 정의 및 GAMSModifier를 전달하여 bmult 변경 가능 선언
70mi.instantiate("운송은 lp min z를 사용합니다", GamsModifier(bmult), opt)
71bmult.add_record().value = 1.0
72
73 그동안 :
74 # 생성 시 다른 프로세스에 전달하는 대신 큐에서 bmult 값을 동적으로 가져옵니다.
75queue_lock.acquire()
76 ifbmult_queue.empty():
77queue_lock.release()
78 반환
79b = bmult_queue.get()
80queue_lock.release()
81bmult.first_record().value = b
82mi.solve()
83
84 # 보고서 정보가 엉망이 되는 것을 방지하기 위해 출력을 중요한 섹션으로 만들어야 합니다.
85io_lock.acquire()
86인쇄("시나리오 bmult="+ 문자열(b) +":")
87인쇄(" 모델 상태: "+ str(mi.model_status))
88인쇄(" 해결 상태: "+ str(mi.solver_status))
89인쇄(" 개체: "+ str(mi.sync_db.get_variable("z").find_record().level))
90io_lock.release()
91
92
93if__name__ =="__main__":
94sys_dir = sys.argv[1]iflen(sys.argv) > 1그밖에 없음
95work_dir = sys.argv[2]iflen(sys.argv) > 2그밖에 없음
96ws = GamsWorkspace(system_directory=sys_dir, Working_directory=work_dir)
97cp = ws.add_checkpoint()
98
99 # GamsJob을 실행하여 GamsCheckpoint를 초기화합니다.
100작업 = ws.add_job_from_string(GAMS_MODEL)
101job.run(체크포인트=cp)
102cp_file = os.path.join(ws.working_directory, cp.name) +".g00"
103
104bmult_queue = 대기열()
105bmult = [0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3]
106 forbb다중:
107bmult_queue.put(b)
108
109 # 여러 모델 인스턴스를 병렬로 해결
110io_lock = 잠금()
111queue_lock = 잠금()
112
113nr_workers = 4
114프로세스 =
115 fori범위(nr_workers):
116프로세스[i] = 프로세스(
117target=scen_solve, args=(cp_file, bmult_queue, queue_lock, io_lock)
118 )
119프로세스[i].start()
120 foriin범위(nr_workers):
121프로세스[i].join()