AlexNeagu11

OneDimensionalClustering

Jan 3rd, 2024
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.06 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <cassert>
  5.  
  6. using namespace std;
  7.  
  8. int N, K;
  9. vector<vector<double>> dp;
  10. const double INF = 2e15;
  11.  
  12. int main() {
  13. // Reading the number of instances and K value
  14. cin >> N >> K;
  15. assert(N >= K);
  16.  
  17. dp.assign(N + 1, vector<double>(K + 1, INF));
  18. vector<vector<pair<int, int>>> parent(N + 1, vector<pair<int, int>>(K + 1, { INF, INF }));
  19.  
  20. // DP initialization
  21. dp[0][0] = 0;
  22.  
  23. // Reading the 1D instances
  24. vector<double> instances(N + 1);
  25. for (int i = 1; i <= N; ++i) {
  26. cin >> instances[i];
  27. }
  28.  
  29. // Sorting the instances
  30. sort(instances.begin(), instances.end());
  31.  
  32. for (int i = 1; i <= N; ++i) {
  33. for (int k = 1; k <= K; ++k) {
  34. double squareSum = 0, sum = 0;
  35. for (int j = i; j >= k; --j) {
  36. squareSum += instances[j] * instances[j];
  37. sum += instances[j];
  38. double mean = sum / (i - j + 1);
  39. double cost = squareSum - (i - j + 1) * mean * mean;
  40. if (dp[j - 1][k - 1] + cost < dp[i][k]) {
  41. dp[i][k] = dp[j - 1][k - 1] + cost;
  42. parent[i][k] = { j - 1, k - 1 };
  43. }
  44. }
  45. }
  46. }
  47.  
  48. cout << "The minimum J value obtained: " << dp[N][K] << '\n';
  49. cout << "The clusters formed are: \n";
  50. int n = N, k = K;
  51.  
  52. // Solution reconstruction
  53. vector<vector<double>> clusters;
  54. while (k > 0) {
  55. clusters.emplace_back();
  56. pair<int, int> par = parent[n][k];
  57. for (int i = par.first + 1; i <= n; ++i) {
  58. clusters.back().push_back(instances[i]);
  59. }
  60. n = par.first, k = par.second;
  61. }
  62.  
  63. reverse(clusters.begin(), clusters.end());
  64.  
  65. // Printing the answer
  66. int index = 0;
  67. for (auto cluster : clusters) {
  68. index++;
  69. cout << "Cluster " << index << ":\n";
  70. for (double x : cluster) {
  71. cout << x << ' ';
  72. }
  73. cout << '\n';
  74. }
  75. }
  76.  
Advertisement
Add Comment
Please, Sign In to add comment