#ifndef Strategy_h
#define Strategy_h
#include <vector>
#include <map>
#include <string>
#include <iostream>
/// Add Code Here -->
#include <algorithm>
/// <-- Add Code Here
using namespace std;
int relate[11000][11000];
/// user to item tabel RecomdList At most K Proposed Items user size item size
void Algorithm(vector<vector<double>> Table, vector<vector<int>> &RecomdList, const int K, const int user_size, const int item_size)
{
/**
TABLE
Index Content
int User double Rating
int Item
Format
Table[User][Item]=Rating
STRUCTURE
Table
| User1
| --- Item1 Item2 Item4 ...
| R1 R2 R3
|
| User2
| --- Item2 Item5 Item7 ...
| R4 R5 R6
|
| User3
| --- Item3 Item4 Item6 ...
| R4 R5 R6
:
:
*/
/**
RECOMDLIST
Index Content
int User int Item
int Idx
Format
Table[User][Idx]=Item
STRUCTURE
RecomdList
| User1
| --- 0 1 2 ... K-1
| Item3 Item8 Item9 ... Item?
|
| User2
| --- 0 1 2 ... K-1
| Item4 Item1 Item3 ... Item?
|
| User3
| --- 0 1 2 ... K-1
| Item5 Item7 Item1 ... Item?
:
:
*/
/// Add Code Here -->
//初始化物品間的關係
for (int i = 0; i < 11000; i++) {
for (int j = 0; j < 11000; j++) {
relate[i][j] = 0;
}
}
//觀察物品間關係,並存入relate[][]
for (int x = 0; x < user_size; x++) {
for (int y = 0; y < item_size; y++) {
if (Table[x][y] != -1) {
for (int j = y+1; j < item_size; j++) {
if (Table[x][j] == 1) {
relate[y][j] = relate[y][j] - 4;
}else if (Table[x][j] == 2) {
relate[y][j] == relate[y][j] - 2;
}else if (Table[x][j] == 4) {
relate[y][j] == relate[y][j] + 2;
}else if (Table[x][j] == 5) {
relate[y][j] == relate[y][j] + 4;
}
}
}
}
}
//鏡射
for (int i = 0; i < 11000; i++) {
for (int j = i; j < 11000; j++) {
relate[11000 - j][i] = relate[i][11000 - j];
}
}
int i;
int j;
int max[11000][10];
int min[11000][10];
//找出前10名
for (int t = 0; t < 10; t++) {//依序找出1~10
for (int n = 0; n < 11000; n++) {//得過名就歸0
for (int k = 0; k < t; k++) {
relate[n][max[n][k]] = 0;
}
}
for ( i = 0; i < 11000; i++) {
for ( j = 0; j < 11000; j++) {
for (int k = 0; k < 11000; k++) {
if (relate[i][j] > relate[i][k]) {
max[i][t] = j;
min[i][t] = k;
}
else {
max[i][t] = k;
min[i][t] = j;
}
}
}
}
}
//開始推薦
int remind[11000];
for (int i = 0; i < 11000; i++) {
remind[i] = 0;
}
for (int i = 0; i < user_size; i++) {
int c = 0;
while (c != 10) {
for (int j = 0; j < item_size; j++) {
if (Table[i][j] != -1) {
remind[j] = Table[i][j];
if (remind[j] < 3) {
RecomdList[i][c] = max[j][c];
c++;
if (c == 10) {
break;
}
}
else {
RecomdList[i][c] = max[j][c];
c++;
if (c == 10) {
break;
}
}
}
}
}
}
/// <-- Add Code Here
}
#endif /* Strategy_h */