помощь в написании алгоритма - PullRequest
0 голосов
/ 12 декабря 2010

Я занимаюсь разработкой алгоритма для задания, и я не уверен, что написал правильный алгоритм, не могли бы вы мне помочь? Вопрос в том: Есть n учеников S1, S2,…, Sn и n классов: G1, G2,… Gn. Каждому ученику должен быть присвоен ровно один класс, а одному ученику - ровно один ученик. Если Tij является значением присвоения Si для Gj, я должен найти подмножество Q T, которое является максимальным. (Я должен назначить работников на лучшую работу) Примером этого вопроса является то, что если у меня есть два студента S1 и S2, а также у меня 2 класса G1 и G2, например, у меня T12 = 12, T21 = 7, T11 = 9, T22 = 16, подмножество должно быть Q = {T12, T22} Я написал следующий алгоритм (в Java):

   Algorithm studentG(J[],W[],V[][],x[][])
 {
     // I use heap data structure for solving this problem
     // initial all x[][] = 0
      ArrayList<Heap> students = new ArrayList<Heap>();
      students = Heap(v[][]); // this method make a heap for each student,

     for(int k = 0; k< J.length, k++)
   {
  Boolean test = false;
  // this loop is for each student to assign each student to only one grade not more.
  for(int m = 0; m< students.size(); m++)
 {
If(students.get[m].root.getGrade() ==k && test == false){
test = true;
//I have assigned 1 to the feasible and 0 othrwise
 x[m][k] = 1;
}else if(students.get[m].root. getGrade() != k){
 Continue;
}else if(students.get[m].root. getGrade() == k && test == true){
 students.get[m].remove(root);
 students.get[m].heapify();
 }
}
}

Это хорошо работает? Спасибо.

Ответы [ 3 ]

2 голосов
/ 12 декабря 2010

То, что вы пытаетесь решить, на самом деле является перефразировкой проблемы коммивояжера , и Google предоставит вам множество возможных алгоритмов для ее решения.

Ваш алгоритм ничего не делает при назначении оценок, оптимизация отсутствует. С тем же успехом вы можете привести оценки и учащихся в порядок и просто назначить каждый другому. Это создаст возможный набор для решения, но это (возможно, 1 шанс из) не будет оптимальным.

Прежде чем реализовать алгоритм, попробуйте выразить его в псевдоязычных терминах. Тривиальная реализация алгоритма может выглядеть так:

foreach student S do
  foreach unassigned grade G do
    Add {G, S} to the solutions
    Compute the solution score
    If (this score > greater score so far) Then 
      Keep solution like this
      Mark G as assigned
    Else 
      Remove {G, S} from the solution
  Next
Next

Что касается структур данных, вы можете иметь в Java:

// The number of grades and students
public static final int N = 10;

// The students and grades are just a suite of numubers
List<int> students = new ArrayList<int>(N);
List<int> grades = new ArrayList<int>(N);    
for (int i=0; i<N; ++i) {
  students.set(i, i);
  grades.set(i, i);
}

// Each score for a possible pair of grade student is stored in a matrix 
int[][] scores = new int[N][N];
for (int s=0; s<N; ++s) {
  for (int g=0; g<N; ++g) {
    scores[s][g] = students.get(s) * grades.get(g);
  }
}

// An association of student and grade
class Association {
  int student;
  int grade;
  int score;
  public Association(int student, int grade, int score) {
    this.student = student;
    this.grade = grade;
    this.score = score;
  }
}

// The solution
Stack<Association> solution = new Stack<Association>(N);

Я позволю вам попытаться реализовать описанный выше алгоритм с этими структурами данных, используя Stack.push и Stack.pop, чтобы добавить / удалить ассоциацию из решения, и List.remove, чтобы пометить оценку как используемую в решении.

Не забудьте реализовать функцию, которая вычисляет сумму баллов в текущем решении (это может выглядеть примерно так: public int getSolutionScore (Stack solution))

0 голосов
/ 28 июня 2011

@ Самуил: «Каждому ученику должен быть присвоен ровно один класс, а одному ученику - ровно один ученик».

Что означает наличие функции, которая отображает учащегося в любой класс S-> G. Кажется, что условие не вводит боковые ограничения (то есть все оценки должны наилучшим образом назначаться среди набора учащихся при сохранении ограничения 1: 1).


Таким образом, по сути (если проблема была действительно правильно сформулирована), это означает, что вы просто выбираете

Q = argmax_j (Tij) для всех моих .

Это просто максимальное значение каждой строки матрицы затрат T .


Полагаю, мне не нужно приводить пример кода, поскольку поиск максимального элемента - довольно тривиальная операция O (n). Если хотите, используйте кучи, но простое сканирование и сохранение максимума также подойдет.

Поскольку это кажется слишком простым, проблема могла быть сформулирована неправильно.

0 голосов
/ 12 декабря 2010

Ваш пример неясен. Выбор T12 и T22 не нарушает ваши условия (то есть два ученика назначены на 2 класс)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...