2013-07-18 4 views
1

, 나는 현재 유전자 퍼지 학습 시스템을 만들고 있으며, 이에 상응하는 교육 시뮬레이션 환경입니다.>이 함수 및 클래스 모음은 사용자가 다음과 같은 것들을 정의하는 마스터 스크립트에 의해 제어됩니다 : 시뮬레이션 시나리오, 컨트롤러 특성 등과도한 인수가있는 함수 - 파이썬

결과는 약 50 개의 서로 다른 numpy 배열과 목록이 내 특정 문제에 대한 인수로 나타납니다. 이러한 인수는 컨트롤러 생성 함수 및 각 컨트롤러의 효율성을 결정하는 시뮬레이션에 부여해야합니다. 이 프로세스는 현재 multiprocess.starmap_async 메소드를 사용하여 각 컨트롤러의 적합성을 병렬화합니다. 그래서 나의 마스터 스크립트는 약 50 개의 인수를 가진 컨트롤러 생성을 호출하고, 다중 프로세스는 약 55 개의 프로세스로 작업자를 호출하며, 작업자는 57 개의 입력으로 모든 시뮬레이션 파일을 호출합니다. (다중 처리를 위해이 많은 입력 인수를 사용하는 것이 데이터를 가리키는 이름 일뿐 아니라 복사 또는 다시 초기화하는 것보다 오버 헤드를 증가시키지 않는다는 것이 현재 나의 이해입니다 ... 잘못 되었다면 알려주세요!)

저는 50 개 인수를 모든 인수가 포함 된 하나의 목록으로 대체 할 수 있으며 마스터 스크립트에서 전역 변수를 활용하여이 모든 책 관리를 수행하지 않아도된다는 것을 알고 있습니다. 이 변수 중 많은 부분은 변경되지 않지만 두 번 이상 계산하지 않으려는 대용량 데이터 구조입니다. 다른 접근법과 가장 수용 가능한 것으로 생각되는 접근법이 있습니까? 내 프로젝트에서 모든 호출에 대해 10 줄의 args를 사용하지 않으려합니다.

모든 것이 완벽하게 실행되지만 내 시뮬레이션은 (옵션이 아닌) 인수가 늘어나면서 점점 더 복잡해질 것입니다. 나는 더 구체적인 VAR 이름을 모두 제거하지만, 여기 내 주요 스크립트가 실행 전화입니다했습니다

 step = np.int8(pop_size/8) 
     pol = Pool(processes=8) 

     res = pol.starmap_async(SimWorker, ((i, i+step, map_size,Targets, 
           SAMS,SAMS_stat,AIS,AIS_stat, 
           B_mpammo,B_sdammo,Route,vel,B_range, 
           A_range,S_range,B_flight, 
           A_flight, S_flight,fitness, 
           ttr,ttb,ttcr,ttcb,pos,times,pop,... lots more args) for i in range(0, pop_size, step))) 

그리고 SimWorker :

(opt_str,opt_fit) = Trainer(map_size,Targets,SAMS,SAMS_stat,AIS,AIS_stat, 
          B_mpammo,B_sdammo,Route,vel,B_range,A_range, S_range,B_flight, 
          A_flight, S_flight,... lots more) 

을 내 GA 내부 내가 가진

for p in range(start, stop): 
    fitness[p] = Sim_T(map_size,Targets,SAMS,SAMS_stat,AIS,AIS_stat, 
          B_mpammo,B_sdammo,Route,vel,B_range,A_range,S_range,B_flight, 
          A_flight, S_flight, 
          ttr,ttb,ttcr,ttcb,pos,times,pop[p],... lots more) 
+0

일부 코드 스 니펫이나 다이어그램을 제공 할 수 있다면 매우 유용 할 것입니다. 일반적으로 매개 변수 수가 많은 함수는 디자인의 모듈성을 향상시킬 수 있다는 신호입니다. –

답변

0

키워드 인수 인 **kwargs을 사용하면 필요한만큼만 전달할 수 있으며 필요하지 않은 키워드는 필요하지 않습니다. 당신의 기능은 그 때 당신이 원하는 것을 검사하고 가지고 갈 수있다.

또는 상태를 나타내는 개체를 만들어서 빌드하고 함수에 전달하십시오.

+0

** kwargs의 디자인 문제 : http://ivory.idyll.org/blog/on-kwargs.html –

+0

Matlab에서 함수를 호출하는 것은 인수 이름 대신 인수의 위치에 관한 것이므로 각 내 개체의 이러한 인수를 같은 이름으로 사용해야합니까? 현재 이러한 함수 중 일부는 map_info와 같은 인수를 사용하여 다른 데이터를 반환하기 전에 temp_map_info로 스크립트에서 실행합니다. –

+0

파이썬 함수에는 세 가지 종류의 인수가 있습니다. 예제는 설명서를 참조하십시오. – Joe

1

당신은 분명히 객체 지향 프로그래밍이라는 의미에서 모든 인수를 객체로 캡슐화해야합니다. 이 객체가 맨 사전인지 고급 객체인지는 신중히 고려해야하는 디자인 문제입니다. 좀 더 구체적인 답을 얻으려면 더 많은 정보가 필요합니다.

+0

이것은 나쁜 접근 방법은 아니지만 너무 많은 매개 변수가있는 클래스로 문제를 옮기는 것입니다. http://stackoverflow.com/questions/5899185/class-with-too-many-parameters-better-design -strategy –

+2

@MikeVella [이것이 왜 여전히 좋을 수 있는지에 대한 S.Lott의 대답에 대한 좋은 코멘트가 있습니다.] (http://stackoverflow.com/questions/5899185/class-with-too-many-parameters-better -design-strategy # comment6789817_5899909) – Izkata

+0

@Izkata 나는 그것이 여전히 좋을 수 있다는 것에 동의하는 경향이있다. –