首页 > 编程语言 >MMM全链接聚类算法实现

MMM全链接聚类算法实现

时间:2024-05-25 20:22:35浏览次数:27  
标签:Kc mergedSet int void 0.5 MMM NUM 聚类 链接

使用时,仅需修改TODO下描述的字段即可,其他无需改动。

#include <bits/stdc++.h>
// TODO: 根据需求分别修改任务数、每个模块内最大任务数、模块数、步进长度
#define TASK_NUM        (8)
#define MAX_TASK_NUM    (4)
#define MODULE_NUM      (2)
#define GRANULARITY     (0.5)

using namespace std;

void MMMSAA();
void MMMCAA();
void MMMAAA();
void MMMSAArepeat();
void MMMCAArepeat();
void MMMAAArepeat();
void MMMinit();
void printDE();
void getFinalCost();

struct DEitem
{
    double c;
    int k;
    vector<set<int>> Kc;
};

double g_costThres = 0.0;
double g_costThresDefault = 0.0;
int g_k = 0;
vector<set<int>> g_Kc;
vector<DEitem> DE;

// TODO: 根据需求修改通讯代价矩阵
double g_commMatrix[TASK_NUM][TASK_NUM] =
{
    {0, 0, 0.5, 0, 0.5, 0, 0, 0,},
    {0, 0, 0.5, 0.5, 0, 0, 0, 0,},
    {0.5, 0.5, 0, 0.5, 1, 0.5, 0, 0,},
    {0, 0.5, 0.5, 0, 0, 1, 0, 0,},
    {0.5, 0, 1, 0, 0, 0.5, 1, 0,},
    {0, 0, 0.5, 1, 0.5, 0, 0.5, 0.5,},
    {0, 0, 0, 0, 1, 0.5, 0, 0.5,},
    {0, 0, 0, 0, 0, 0.5, 0.5, 0,},
};

void MMMinit()
{
    double maxElement = -1;
    for (int i = 0; i < TASK_NUM; ++i)
    {
        for (int j = 0; j < TASK_NUM; ++j)
        {
            if (g_commMatrix[i][j] > maxElement)
            {
                maxElement = g_commMatrix[i][j];
            }
        }
    }
    g_costThres = maxElement + 1;
    g_costThresDefault = g_costThres;
    g_k = TASK_NUM;
    g_Kc.clear();
    g_Kc.resize(TASK_NUM);
    for (int i = 0; i < TASK_NUM; ++i)
    {
        g_Kc[i].insert(i);
    }
}

void getFinalCost()
{
    vector<set<int>> K1 = DE[DE.size() - 1].Kc;
    double finalCost = 0;
    for (int i = 0; i < K1.size(); i++) // ki
    {
        for (int j = i + 1; j < K1.size(); j++) // kj
        {
            for (int ti : g_Kc[i]) // ti
            {
                for (int tj : g_Kc[j]) // tj
                {
                    finalCost += g_commMatrix[ti][tj];
                }
            }
        }
    }
    cout << "finalCost:" << finalCost << endl;
    cout << "--------------" << endl;
}

void MMMSAArepeat()
{
    do
    {
        for (int i = 0; i < g_Kc.size(); i++) // ki
        {
            for (int j = i + 1; j < g_Kc.size(); j++) // kj
            {
                double larc = -1;
                for (int ti : g_Kc[i]) // ti
                {
                    for (int tj : g_Kc[j]) // tj
                    {
                        if (g_commMatrix[ti][tj] >= larc)
                        {
                            larc = g_commMatrix[ti][tj];
                        }
                    }
                }
                if (larc >= g_costThres)
                {
                    set<int> mergedSet;
                    mergedSet.insert(g_Kc[i].begin(), g_Kc[i].end());
                    mergedSet.insert(g_Kc[j].begin(), g_Kc[j].end());
                    if (mergedSet.size() <= MAX_TASK_NUM)
                    {
                        g_Kc.push_back(mergedSet);
                        g_Kc.erase(g_Kc.begin() + i);
                        g_Kc.erase(g_Kc.begin() + j - 1);
                    }
                }
            }
        }
        g_k = g_Kc.size();
        DE.push_back({g_costThres, g_k, g_Kc});
        g_costThres = g_costThres - GRANULARITY;
    } while (g_costThres != 0 && g_k != MODULE_NUM);
    if (g_costThres == 0 && g_k > MODULE_NUM)
    {
        cout << "Need MMMSAA for K1" << endl;
        g_costThres = g_costThresDefault;
        g_k = DE[DE.size() - 1].k;
        MMMSAArepeat();
    }
}

void MMMCAArepeat()
{
    do
    {
        for (int i = 0; i < g_Kc.size(); i++) // ki
        {
            for (int j = i + 1; j < g_Kc.size(); j++) // kj
            {
                double smac = 9999;
                for (int ti : g_Kc[i]) // ti
                {
                    for (int tj : g_Kc[j]) // tj
                    {
                        if (g_commMatrix[ti][tj] <= smac)
                        {
                            smac = g_commMatrix[ti][tj];
                        }
                    }
                }
                if (smac >= g_costThres)
                {
                    set<int> mergedSet;
                    mergedSet.insert(g_Kc[i].begin(), g_Kc[i].end());
                    mergedSet.insert(g_Kc[j].begin(), g_Kc[j].end());
                    if (mergedSet.size() <= MAX_TASK_NUM)
                    {
                        g_Kc.push_back(mergedSet);
                        g_Kc.erase(g_Kc.begin() + i);
                        g_Kc.erase(g_Kc.begin() + j - 1);
                    }
                }
            }
        }
        g_k = g_Kc.size();
        DE.push_back({g_costThres, g_k, g_Kc});
        g_costThres = g_costThres - GRANULARITY;
    } while (g_costThres != 0 && g_k != MODULE_NUM);
    if (g_costThres == 0 && g_k > MODULE_NUM)
    {
        cout << "Need MMMSAA for K1" << endl;
        g_costThres = g_costThresDefault;
        g_k = DE[DE.size()-1].k;
        MMMSAArepeat();
    }
}

void MMMAAArepeat()
{
    do
    {
        for (int i = 0; i < g_Kc.size(); i++) // ki
        {
            for (int j = i + 1; j < g_Kc.size(); j++) // kj
            {
                double sumc = 0.0;
                int num = 0;
                for (int ti : g_Kc[i]) // ti
                {
                    for (int tj : g_Kc[j]) // tj
                    {
                        sumc += g_commMatrix[ti][tj];
                        num++;
                    }
                }
                double avgc = sumc / num;
                if (avgc >= g_costThres)
                {
                    set<int> mergedSet;
                    mergedSet.insert(g_Kc[i].begin(), g_Kc[i].end());
                    mergedSet.insert(g_Kc[j].begin(), g_Kc[j].end());
                    if (mergedSet.size() <= MAX_TASK_NUM)
                    {
                        g_Kc.push_back(mergedSet);
                        g_Kc.erase(g_Kc.begin() + i);
                        g_Kc.erase(g_Kc.begin() + j - 1);
                    }
                }
            }
        }
        g_k = g_Kc.size();
        DE.push_back({g_costThres, g_k, g_Kc});
        g_costThres = g_costThres - GRANULARITY;
    } while (g_costThres != 0 && g_k != MODULE_NUM);
    if (g_costThres == 0 && g_k > MODULE_NUM)
    {
        cout << "Need MMMSAA for K1" << endl;
        g_costThres = g_costThresDefault;
        g_k = DE[DE.size() - 1].k;
        MMMSAArepeat();
    }
}

void printDE()
{
    for (const auto &item : DE)
    {
        cout << "c: " << item.c << ", k: " << item.k << "  Kc: ";
        for (const auto &set : item.Kc)
        {
            cout << "{";
            for (int elem : set)
            {
                std::cout << elem + 1 << ",";
            }
            cout << "}, ";
        }
        cout << endl;
        cout << "--------------" << endl;
    }
}
void MMMSAA()
{
    cout << "MMMSAA Start!" << endl;
    MMMinit();
    MMMSAArepeat();
    printDE();
    getFinalCost();
    cout << "MMMSAA End!" << endl;
}

void MMMCAA()
{
    cout << "MMMCAA Start!" << endl;
    MMMinit();
    MMMCAArepeat();
    printDE();
    getFinalCost();
    cout << "MMMCAA End!" << endl;
}

void MMMAAA()
{
    cout << "MMMAAA Start!" << endl;
    MMMinit();
    MMMAAArepeat();
    printDE();
    getFinalCost();
    cout << "MMMAAA End!" << endl;
}

int main()
{
    MMMSAA();
    MMMCAA();
    MMMAAA();
    return 0;
}

标签:Kc,mergedSet,int,void,0.5,MMM,NUM,聚类,链接
From: https://www.cnblogs.com/68786C/p/18212963

相关文章

  • Kmeans聚类流程
    1.turtlesIntroductionInthisreport,wewillanalyzeaproblemrelatedtoturtlepopulationsonasmallislandwithtwobeaches:WestBeachandEastBeach.ThegoalistodeterminetheprobabilityofbeingonEastBeachgiventhataLoggerheadTurtlei......
  • 数据清洗到站点聚类,全面解析伦敦共享单车使用规律!
    1.项目背景随着共享单车在全球范围内的普及,城市交通出行模式发生了巨大变化。伦敦作为国际化大都市,交通拥堵问题日益严重,共享单车作为一种绿色、环保、便捷的出行方式,逐渐成为解决交通问题的重要组成部分,然而,要实现共享单车系统的高效运营,必须深入了解用户的使用习惯和需求......
  • Python中动态调用C#的dll动态链接库中方法
    在Python中调用C#的dll库_哔哩哔哩_bilibili 环境准备: 安装pythonnetpipinstallpythonnet 在Python中调用C#动态链接库(DLL),可以使用pythonnet库,它允许直接使用.NET的程序集。以下是一个示例,展示如何使用pythonnet调用C#动态链接库中的方法。【pythonnet详解】—......
  • 【C语言】文件的编译链接和预处理
    文件的编译链接和预处理程序的翻译环境和执行环境翻译环境预处理(预编译)过程编译过程汇编过程链接过程运行环境预处理详解预处理符号预处理指令#define#define定义标识符#define定义宏#define替换规则#与###的使用##的使用带有副作用的宏参数宏与函数的对比宏的优势函......
  • 【阿里前端面试题】客户端和服务器交互,为什么选用tcp协议建立链接?超详细,建议关注收藏
    大家好,我是“寻找DX3906”。每天进步一点。日积月累,有朝一日定会厚积薄发前言        在上一篇文章中《【阿里前端面试题】浏览器的加载渲染过程,超详细》中描述:浏览器使用IP地址与服务器建立连接,通常是通过TCP(传输控制协议)。那为什么要使用TCP协议建立链接呢......
  • cmakelist 编译源码生成动态静态库并链接到项目
    当我们使用vscode编译c++代码时,需要加入第三方代码,而它没有库时。这时候我们就需要自己写一个Cmakelist编译成库,然后链接到自己的项目上。下面我以qt的qtpropertybrowser类为例,这个类并不在qt的标准库中,若是在qtcreator中使用,需要在pro引入该文件路径(qt安装目录里-\Qt\5......
  • 5款超好用的AI换脸软件,一键视频直播换脸(附下载链接)
    随着AIGC的火爆,AI换脸技术也被广泛应用于娱乐、广告、电影制作等领域,本期文章系统介绍了市面上超火的5款AI软件换脸整合包收录了全部5款AI工具,请按照需要选择下载:百度网盘:https://pan.baidu.com/s/1-LeEVYHv0tra-AJlK9seJQ?pwd=j4at 1.Roop作为AI换脸领域的鼻祖,Roop的人气一......
  • R语言上市公司经营绩效实证研究 ——因子分析、聚类分析、正态性检验、信度检验|附代
    全文链接:http://tecdat.cn/?p=32747原文出处:拓端数据部落公众号随着我国经济的快速发展,上市公司的经营绩效成为了一个备受关注的话题。本文旨在探讨上市公司经营绩效的相关因素,并运用数据处理、图示、检验和分析等方法进行深入研究,帮助客户对我国45家上市公司的16项财务指标进行......
  • 采集数据产品描述有超链接///设置免运费后,达到免送标准,其他运费不显示///给产品详情页
    //产品描述有超链接,去掉functionremove_product_hyperlinks($content){if(is_product()){//确保只在产品页面上应用$content=preg_replace('/<ahref=".*?">(.*?)<\/a>/','$1',$content);}return$content;}add_......
  • chorme浏览器设置点击链接后在新标签页打开,而不是覆盖当前网页
    重装系统之后chrome每次点击文章中的链接都会覆盖掉当前网页,难受,找到了解决方法舒服多了1. 打开浏览器,点击右上角三个点中的设置2.进入系统栏 3. 打开代理设置,进入windows网络管理4.点击网络和Internet这里我是win11,所以是这样的:win10大概也差不多,win7和xp找一下操作......