You are an AI programming assistant. Read very carefully the following problem and do everything that the problem asks you too, you must do ALL the assignments in this problem. 
First think step-by-step - analyze the problem and lay out a detailed summary of everything that you are asked to do (keep in mind that you need not only to write code but also do everything else the problem asks you to) in great detail and don’t forget to include constraints and requirements for the given problem .
Then execute your plan of what you need to do and output the code in a single code block, writing out the full implementation of every function and file. Minimize any other prose. It will be too long for a single message, so split it into several messages. I will ask you to “go on” and you will need to continue writing your answer from where you left off.
Formulation of the problem:
There is a multiprocessor computing system (CS) with identical processor nodes connected by a network. A set of programs that must be executed on this computing system is specified. Each program runs on one processor; it is permissible to execute several programs on the same processor. Some programs exchange data at a fixed rate. Each program creates a fixed load on the processor. For each processor, the upper limit of the permissible load on it is set.
Programs running on different processors communicate over the network; this creates a load on the network, measured in KB/s. Programs running on the same processor communicate through the processor's local memory; such an exchange does not create a load on the network.
To minimize network latency and improve system scalability, programs are distributed across processors so that network load is minimal.
You are given:
1. the number of processors in the computing system;
2. for each processor - the upper limit of the load (in %, no more than 100);
3. the number of programs;
4. for each program: processor load (in %, no more than 100);
5. a list of pairs of programs between which data is exchanged;
6. for each such pair of programs: data exchange rate (KB/s).
You are required: 
to distribute all programs among processors in such a way as to minimize the load on the network, and at the same time not violate the restrictions on the load on the processors.
The solution to the problem is represented as a vector 𝑥̅ (its size is equal to the number of programs), in which for each program the number of the processor to which it is distributed to is indicated.
To simplify the algorithms for solving the problem and generating sets of input data for the study of algorithms, the following additional restrictions are imposed on the input data:
1. the upper limit of the processor load can take values of 50, 70, 90, 100 (%);
2. the load on the processor created by the program can take values of 5, 10, 15, 20 (%);
3. the intensity of data exchange between programs can be equal to 0 (no exchange), 10, 50, 70, 100 (KB/s). 

You need to use “Random search algorithm with region narrowing for program distribution among processors”.
This algorithm iteratively randomly generates a solution to the problem 𝑥̅ and checks whether it is better in terms of the value of the objective function 𝐹(𝑥̅) (i.e. network load) than the best of the previously found correct (satisfying the constraints) solutions. If better, then the correctness of the generated solution is checked; if correct, this solution becomes the new best.
The execution scheme of the basic algorithm is as follows:
1. calculate the theoretical maximum load on the network (for the case when all data exchange goes through the network);
2. set the current best value of the objective function (we denote it by 𝐹𝑏𝑒𝑠𝑡) to the value calculated at step 1;
3. randomly generate a solution to the problem (vector 𝑥̅);
4. if 𝐹(𝑥̅) ≥ 𝐹𝑏𝑒𝑠𝑡, go to step 3 (the generated solution is no better than the previously found one)
5. if 𝑥̅ is an incorrect solution (violates processor load limits), go to step 3;
// at step 6 we have a correct solution, better than the previously found one
6. update the current best solution and the current best value of the objective function:
𝑥̅𝑏𝑒𝑠𝑡 ≔ 𝑥̅; 𝐹𝑏𝑒𝑠𝑡 ≔ 𝐹(𝑥̅);
7. go to step 3.
The algorithm terminates when a correct solution with zero value is found
𝐹𝑏𝑒𝑠𝑡, or when the value of 𝐹𝑏𝑒𝑠𝑡 was not improved after 5000 attempts in a row, i.e. the program was unable to find a correct solution 𝑥̅ is such that 𝐹(𝑥̅) < 𝐹𝑏𝑒𝑠𝑡. If during the execution of the algorithm it was not possible to find any correct solution, the result of the algorithm should be an array containing only values (-1).
Also implement a Parallel algorithm: the algorithm works in the form of several parallel
"threads", each of which performs the same actions as the underlying algorithm. Threads update a single (common for them) best solution and the best value of the objective function.

Input data format:
The set of input data is specified in the file. The file format must be based on XML. The specific file structure (XML elements, their attributes) needs to be developed by you and be written out.

Output format:
You need to output to standard output.
In case of success:
1. string "success";
2. number of algorithm iterations;
3. elements of the found solution 𝑥̅𝑏𝑒𝑠𝑡, with a space separator;
4. network load value for the found solution.
The text for each of paragraphs 1, 2, 3 should be displayed on a separate line. 
In case of failure:
1. the string "failure";
2. the number of iterations of the algorithm.

Assignments:
Main task (mandatory, 5 points):
1. implement the basic algorithm for solving the problem in the form of a program in Python;
2. check its work on datasets with 4, 8, 16 processors; average programs per processor (number\_of\_programs / number\_of\_processors) at least 8; average processor load of at least 50%; each program communicates with at least two other programs; in each set of input data there must be all variants of the upper limit of the processor load, data exchange intensity indicated in the Problem Statement; (data sets must be listed along with the program) 
3. write instructions for the program:
how to build and run the program;
description of the input file format.
Requirements for software implementation:
1. the program must be implemented in Python;
2. instructions must be in .txt format;
3. the text of the program should be well readable, structured, and contain comments in the amount necessary for its understanding;
4. the program should diagnose and handle situations of incorrect user input and the contents of input files;
당신은 인공지능 프로그래밍 조교입니다. 다음 문제를 주의 깊게 읽고 문제에서 요구하는 모든 것을 수행해야 하며, 이 문제의 모든 과제를 수행해야 합니다. 먼저 단계별로 생각하세요 - 문제를 분석하고 수행해야 하는 모든 작업에 대한 자세한 요약을 작성하세요(코드를 작성하는 것뿐만 아니라 문제가 요구하는 다른 모든 작업도 수행해야 함을 명심하세요) 주어진 문제에 대한 제약 조건과 요구 사항을 포함하는 것을 잊지 마세요 .그런 다음 수행해야 할 작업에 대한 계획을 실행하고 모든 함수와 파일의 전체 구현을 작성하여 단일 코드 블록으로 코드를 출력하세요. 다른 산문은 최소화하세요. 하나의 메시지로는 너무 길기 때문에 여러 메시지로 나누세요. "계속하라"고 요청하면 중단한 부분부터 계속 답안을 작성해야 합니다.문제의 공식화:동일한 프로세서 노드가 네트워크로 연결된 멀티프로세서 컴퓨팅 시스템(CS)이 있습니다. 이 컴퓨팅 시스템에서 실행되어야 하는 프로그램 집합이 지정되어 있습니다. 각 프로그램은 하나의 프로세서에서 실행되며, 동일한 프로세서에서 여러 프로그램을 실행하는 것은 허용됩니다. 일부 프로그램은 고정된 비율로 데이터를 교환합니다. 각 프로그램은 프로세서에 고정된 부하를 생성합니다. 각 프로세서에 대해 허용되는 부하의 상한이 설정됩니다.서로 다른 프로세서에서 실행되는 프로그램이 네트워크를 통해 통신하면 네트워크에 KB/s 단위로 측정되는 부하가 발생합니다. 동일한 프로세서에서 실행 중인 프로그램은 프로세서의 로컬 메모리를 통해 통신하며, 이러한 교환은 네트워크에 부하를 발생시키지 않습니다.네트워크 지연 시간을 최소화하고 시스템 확장성을 개선하기 위해 프로그램이 여러 프로세서에 분산되어 네트워크 부하가 최소화됩니다.다음이 주어집니다:1. 컴퓨팅 시스템의 프로세서 수입니다;2. 각 프로세서에 대한 부하 상한(% 단위, 100 이하);3. 프로그램 수;4. 각 프로그램에 대해 : 프로세서로드 (%, 100 이하);5. 데이터가 교환되는 프로그램 쌍의 목록;6. 이러한 각 프로그램 쌍에 대해 : 데이터 환율 (KB / s).당신은 필요합니다: 네트워크의 부하를 최소화하는 동시에 프로세서의 부하 제한을 위반하지 않는 방식으로 모든 프로그램을 프로세서간에 배포합니다.문제에 대한 해결책은 벡터 𝑥̅ (크기는 프로그램 수와 같음)로 표시되며 각 프로그램에 대해 배포되는 프로세서 번호가 표시됩니다.문제 해결을 위한 알고리즘을 단순화하고 알고리즘 연구를 위한 입력 데이터 세트를 생성하기 위해 입력 데이터에 다음과 같은 추가 제한이 적용됩니다:프로세서 부하의 상한은 50, 70, 90, 100(%)의 값을 취할 수 있습니다;2. 프로그램에 의해 생성 된 프로세서의 부하는 5, 10, 15, 20 (%)의 값을 취할 수 있습니다;3. 프로그램 간의 데이터 교환 강도는 0 (교환 없음), 10, 50, 70, 100 (KB / s)과 같을 수 있습니다. "프로세서 간 프로그램 배포를 위해 영역이 좁혀지는 무작위 검색 알고리즘"을 사용해야 합니다.이 알고리즘은 문제 𝑥̅에 대한 해를 반복적으로 무작위로 생성하고 이전에 찾은 정답(제약 조건을 만족하는) 해 중 가장 좋은 해보다 목적 함수 𝐹(𝑥̅)의 값(즉, 네트워크 부하) 측면에서 더 나은지 확인합니다. 더 나은 경우 생성된 솔루션의 정확성을 검사하고, 정확하면 이 솔루션이 새로운 최적 솔루션이 됩니다.기본 알고리즘의 실행 방식은 다음과 같습니다:1. 네트워크의 이론적 최대 부하를 계산합니다(모든 데이터 교환이 네트워크를 통과하는 경우);2. 목적 함수의 현재 최적값(𝐹𝑏𝑒𝑠𝑡로 표시)을 1단계에서 계산한 값으로 설정합니다;3. 문제에 대한 해를 무작위로 생성합니다(벡터 𝑥̅);4. 𝐹(𝑥̅) ≥ 𝐹𝑏𝑒𝑠𝑡이면 3단계로 이동합니다(생성된 해는 이전에 찾은 해보다 나을 것이 없음).5. 𝑥̅가 잘못된 해(프로세서 부하 제한 위반)인 경우 3단계로 이동합니다;// 6단계에서 이전에 찾은 해보다 더 나은 올바른 해를 얻습니다.6. 현재 최적 해와 목적 함수의 현재 최적값을 업데이트합니다:𝑥̅𝑏𝑒𝑠𝑡 ≔ 𝑥̅; 𝐹𝑏𝑒𝑠𝑡 ≔ 𝐹(𝑥̅);7. 3단계로 이동합니다.알고리즘은 0 값을 가진 올바른 솔루션을 찾으면 종료됩니다.𝐹𝑏𝑒𝑠𝑡, 또는 5000회 연속 시도 후에도 𝐹𝑏𝑒𝑠𝑡의 값이 개선되지 않은 경우, 즉 프로그램이 올바른 솔루션 𝑥̅을 찾을 수 없는 경우 𝐹(𝑥̅) < 𝐹𝑏𝑒𝑠𝑡가 됩니다. 알고리즘을 실행하는 동안 올바른 솔루션을 찾을 수 없는 경우 알고리즘의 결과는 값 (-1)만 포함하는 배열이어야 합니다.또한 병렬 알고리즘을 구현하십시오 : 알고리즘은 여러 병렬의 형태로 작동합니다."스레드"의 형태로 작동하며, 각 스레드는 기본 알고리즘과 동일한 작업을 수행합니다. 스레드는 하나의 (공통된) 최적 해와 목적 함수의 최적 값을 업데이트합니다.입력 데이터 형식:입력 데이터 집합은 i