求夏普利值代码

news/2024/10/22 7:59:58/

本文提供了求夏普利值的代码,需要算法的地方只有分割子集。

import java.util.*;public class Shapley {/*** 得到包含这个元素的全部子集* @param set* @param target* @return*/public static Set<Set<String>> findSubsets(List<String> set, String target) {Set<Set<String>> subsets = new HashSet<>();findSubsets(set, target, 0, new HashSet<>(), subsets);return subsets;}private static void findSubsets(List<String> set, String target, int index, Set<String> currentSubset, Set<Set<String>> subsets) {if (index == set.size()) {if (currentSubset.contains(target)) {subsets.add(new HashSet<>(currentSubset));}return;}// Include the current elementcurrentSubset.add(set.get(index));findSubsets(set, target, index + 1, currentSubset, subsets);// Exclude the current elementcurrentSubset.remove(set.get(index));findSubsets(set, target, index + 1, currentSubset, subsets);}/**** @param map 集合和钱之间的映射* @param target 需要求夏普利值的函数* @param set 包含全部元素的集合* @return 夏普利值*/public static double getShapley(HashMap<Set<String>,Integer> map,String target,List<String> set){Set<Set<String>> subSetI = findSubsets(set,target);double sum = 0;for (Set<String> subSet:subSetI ) {double w = calW(new HashSet<>(set),subSet);double value1 = getValue(map,subSet);Set<String> removeSet = new HashSet<>(subSet);removeSet.remove(target);double value2 = getValue(map,removeSet);double add = w*(value1-value2);sum += add;}return sum;}public static void main(String[] args) {HashMap<Set<String>,Integer> map = new HashMap(){};map.put(new HashSet<>(Arrays.asList(new String[]{"老板"})),1);map.put(new HashSet<>(Arrays.asList(new String[]{"工程师"})),1);map.put(new HashSet<>(Arrays.asList(new String[]{"打工仔"})),0);map.put(new HashSet<>(Arrays.asList(new String[]{"老板","工程师"})),3);map.put(new HashSet<>(Arrays.asList(new String[]{"老板","打工仔"})),2);map.put(new HashSet<>(Arrays.asList(new String[]{"老板","工程师","打工仔"})),5);map.put(new HashSet<>(Arrays.asList(new String[]{"工程师","打工仔"})),2);String boss = "老板";String engineer = "工程师";String worker = "打工仔";String target = boss;List<String> set = new ArrayList<>(3);set.add(boss);set.add(engineer);set.add(worker);System.out.println("老板的夏普利值:"+getShapley(map,boss,set));System.out.println("工程师的夏普利值:"+getShapley(map,engineer,set));System.out.println("打工仔的夏普利值:"+getShapley(map,worker,set));}/**** @param map 集合和其赚到的钱的映射* @param s 需要求赚的钱的集合* @return 赚到的钱*/public static double getValue(HashMap<Set<String>,Integer> map,Set<String> s){if(s.size()==0)return 0;for (Set<String> iterSet:map.keySet()) {if(iterSet.equals(s)){return map.get(iterSet);}}throw new RuntimeException("this set does not contain the element");}/**** @param originSet 原始的集合,里面保管所有的元素* @param s 需要求权重的集合* @return 权重值*/public static double calW(Set<String> originSet,Set<String> s){int sSize = s.size();int oSize = originSet.size();return (double) factorial(sSize-1)*factorial(oSize-sSize)/factorial(oSize);}/*** 求阶乘* @param n* @return*/static int factorial(int n) {if (n == 0)return 1;elsereturn (n * factorial(n - 1));}
}

http://www.ppmy.cn/news/345119.html

相关文章

asp.net探头监控管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net探头监控管理系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语言 开发 asp.net探头监控管理系统VS开发s…

智能存储柜的种类和特点分析

近年来随着网络技术的发展和人们对社会发展服务水平的需求不断提高&#xff0c;智能产品越来越普及&#xff0c;生活中也出现了越来越多的智能存储柜&#xff0c;应用于商场、超市、企业、工厂等场景&#xff0c;使用方便、保密性强、可靠性高。 智能存储柜种类非常多&#xff…

检索项目中冗余的图片

说在前面 平时在项目中我们会使用到一些图片&#xff0c;很多时候我们会直接将图片打包到项目中去&#xff0c;随着项目的更新迭代&#xff0c;我们可能会删除一些图片的引用&#xff0c;但没将图片源文件删除&#xff0c;这个时候没有被引用到的图片就会成为冗余的文件&#…

2023网络安全面试题汇总(附答案)

大家好&#xff0c;我是小V ,本人 17 年就读于一所普通的本科学校&#xff0c;20 年 6 月在三年经验的时候顺利通过校招实习面试进入大厂&#xff0c;现就职于某大厂安全联合实验室。 又到了毕业季&#xff0c;大四的漂亮学姐即将下架&#xff0c;大一的小学妹还在来的路上&…

C++ 中的运算符重载

您可以重定义或重载大部分 C 内置的运算符。这样&#xff0c;您就能使用自定义类型的运算符。 重载的运算符是带有特殊名称的函数&#xff0c;函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样&#xff0c;重载运算符有一个返回类型和一个参数列表。…

独家揭秘:Kotlin K2编译器的前世今生

独家揭秘&#xff1a;Kotlin K2编译器的前世今生 也许您已经观看了最近的 KotlinConf 2023 主题演讲&#xff0c;关于 K2 编译器的更新。什么是 K2 编译器&#xff1f; 在搞清楚这个问题之前&#xff0c;我们需要了解Kotlin 使用的不同种类的编译器及其差异&#xff0c;以及编…

如何通过自养号测评在TEMU跨境电商平台中获取更大市场份额

2023年可谓是TEMU跨境电商平台的元年。自从2022年8月17日拼多多宣布将筹备跨境电商平台以来&#xff0c;TEMU犹如烈火燎原&#xff0c;迅速蔓延全球。9月1日&#xff0c;首站TEMU在北美市场正式上线&#xff0c;平台名称取意“Team Up&#xff0c;Price Down”&#xff0c;紧扣…